MIDI CV trigger met pic

Natural_Demon

Stamgast
Lid sinds
29 Maart 2005
Berichten
237
Locatie
South
hoi,

ik ben op zoek naar iemand die me help in het schrijven van firmware for een simple midi cv trigger voor bekende drum instrumenten.

ik wil een pic18f1320 gebruiken, sinds ik daar een stang van heb.

ik heb een screenshot van mijn design bijgevoegd.

het is de bedoeling straks dat dit design wordt in gebouwd op de printplaat van de drum module en ik heb alle onderdelen all.

de bedoeling is dat het in C geprogrameerd wordt, zodat ik het straks kan gebruiken in andere ontwerpen en verder uitbouwen en makkelijk leesbaar, tegenover ASM.

wensen, geen eigenlijk, ik wou gewoon et als standart GM midi set behouden.

-een routine die de 7 bit midi bytes omzet in 6 bit taal voor de flip flip in zo weinig mogelijk cycles en alle niet gewenste midi data weg filtert
-een midi activity bit (voor led).

dat was et.

een prive bericht zou me verheugen.

met vriendelijk groet,

ND
 

Attachments

  • midi cv trigger.jpg
    midi cv trigger.jpg
    29,2 KB · Bekeken: 71
hulp gezocht

hulp gezocht

MIDI CV trigger met pic
hoi,

ik ben op zoek naar iemand die me help in het schrijven van firmware for een simple midi cv trigger voor bekende drum instrumenten.

ik wil een pic18f1320 gebruiken, sinds ik daar een stang van heb.

ik heb een screenshot van mijn design bijgevoegd.

het is de bedoeling straks dat dit design wordt in gebouwd op de printplaat van de drum module en ik heb alle onderdelen all.

de bedoeling is dat het in C geprogrameerd wordt, zodat ik het straks kan gebruiken in andere ontwerpen en verder uitbouwen en makkelijk leesbaar, tegenover ASM.

wensen, geen eigenlijk, ik wou gewoon et als standart GM midi set behouden.

-een routine die de 7 bit midi bytes omzet in 6 bit taal voor de flip flip in zo weinig mogelijk cycles en alle niet gewenste midi data weg filtert
-een midi activity bit (voor led).

dat was et.

een prive bericht zou me verheugen, dingn verder af te spreking over eventueele ...

met vriendelijk groet,

ND

Natural
 
nou, ik vraag dit gewoon omdat ik op mijn zoektoch geen enkel goed example gefonden dat mij zou kunnen helpen.

ik ben sterker in het updaten en optimaliseren van iets, dan uitvinden.

dus daarom, mijn vraag
 
Helaas geen PB, wel een paar opmerkingen:
- ik neem aan dat het voor iets 909 achtigs is, maar dan kun je met dit schema maar 1 geluid aanturen, da's niet echt economisch, niet in componenten maar ook niet in ruimte op je print. Je hebt nu voor iedere voice een aparte processor nodig. Je kan dezlefde manier als in een 909 gebruiken om meerdere geluiden aan te sturen met 1 processor, 1 bus met daaraan een paar d-latches met een aparte clock per d-latch.(ik zou 8 bits d-latches nemen, die zijn ook wat makkelijker te krijgen).

- je hebt in het schema de clock en reset bij de d-latch omgedraaid, nu kun je alleen de flip-flop reseten en geen data inclocken.

Ik zou zelf meer kiezen voor zo'n soort opzet: http://www.elby-designs.com/midi2sds/midi2sds-about.htm
De software is open source en er staat ook een midihandler in, niet heel netjes geschreven maar het schijnt te werken.
 
nou, ik heb spullen al (200 x 74hc174 deze moeten nu eerst op), alleen nog geen print.
het is inderdaad voor 1 single instrument en een spare trigger.
het is de bedoeling dat deze mee gebakken wordt samen met de kickdrum.

het moet ook zo klein mogelijk, als ik zonder x-tal kan werken, dan zonder xtal.


wat betreft, het plaatje, dat had ik ff zonder te kijken in alkeer geet voor did forum, was ook een beetje cut en paste.
en ik zie dat je gelijkt hebt, de 909 heeft een special reset circuit ervoor.
 
Kijk bij Blacet,die verkopen een voorgeprogrameerde chip dacht ik,normaal kan je die kopieren....

Anders mijn tech maakt ze...---> 1 chip met wat buffers 16 outputs mid in learn,onthoud kanaal en de 16 ingedrukte toetsen van midi pad/kb in sequence.leuk voor vb simmons of custom 808 of eender welk ander drumspul,ook voor sequencers te gebruiken....
 
Origineel geplaatst door Natural_Demon
gisteren heb ik dit gevonden, en deze code is heel begrijpbaar om dat op verder te bouwen
Maar niet bruikbaar, in deze code worden alleen iets met system realtime messages gedaan, die zijn makkelijk uit midi data te halen omdat ze maar 1 byte lang zijn. Note on/off messages zijn 3 bytes lang(of 2 bytes als running status wordt gebruikt) waar ook nog system realtime messages tussendoor kunnen komen, dan wordt het dus wat lastiger. In het linkje in mijn vorige post wordt daar in de code allemaal rekening meegehouden. Dus wel de moeite van het bestuderen waard.
 
@ twiki, je dat weet ik

maar die andere code is voor atmel, ik heb gistern de hele dag er na gekeken.
maar toch.
te veel werk om all de atmel id's/tags te gaan uitzoeken.

ik had ook gisteren met MIDIOX zitten spelen en vastgesteld dat alle bytes die bij die instance horen, toch altijd achter elkaar staan.

ik heb dit gemaakt .... en ook ff het design aangepast, sinds de MCLR pin alleen als input gebruikt kan worden.



xxxxxxxxxx.h file
// variables
// unsigned char midi_rx_handle_note_on;
// unsigned char midi_rx_handle_note_off;
char midi_rx_handle_note_on = 0;
char midi_rx_handle_note_off = 0;
char midi_rx_handle_note_off_teller = 0;
unsigned char data_velocity;
#define MAXDATA 2;
unsigned char midi_stack[MAXDATA];


/*
* Handle Received MIDI Bytes
*/
void midi_rx_byte(unsigned char byte) {
if(midi_rx_handle_note_on == 1){
midi_stack = byte;
verwerk_volgende_bytes(byte);
}
if(midi_rx_handle_note_off == 1){
// niet veel te doen doen hier, sinds we maar een 2 ms trigger signaal creeëren.
midi_rx_handle_note_off_teller++;
if(midi_rx_handle_note_off_teller == 2){
midi_rx_handle_note_off = 0;
}
}
else{
switch(byte) {
case 0xfa: // start
cond_ctl_start();
break;
case 0xfb: // continue
cond_ctl_start();
break;
case 0xfc: // stop
cond_ctl_stop();
break;
case 0xf8: // clock
cond_ctl_clock();
break;
case 0x63: // 99, ik heb het gezochte status byte-tje gevonden. kanaal 10 - "note on"
midi_rx_handle_note_on = 1;
break;
case 0x59: // 89, ik heb het gezochte status byte-tje gevonden. kanaal 10 - "note off"
midi_rx_handle_note_off = 1;
break;
};
}
}
}


ik heb alleen geen idee hoe ik nu verder ga.
ik weet weet dat als midi_rx_handle_note_on == 1 true is, de 2 volgende bytes moet opslaan in een array.
maar de meest logische oplossing kon ik gistern niet bedenken.
maar eigelij instresseerd met alleen de derde byte, die de velocity bevat.
omdat het zich gaat om een single trigger

midi_cv_rigger2.JPG


beter leesbaar schema
http://209.35.198.6/mini_midi_CV_trigger.pdf
eagle file
http://209.35.198.6/mini_midi_CV_trigger.sch
 
Laatst gewijzigd:
Origineel geplaatst door Natural_Demon ik had ook gisteren met MIDIOX zitten spelen en vastgesteld dat alle bytes die bij die instance horen, toch altijd achter elkaar staan.
Maar is dat ook de volgorde waarin ze binnengekomen zijn in de uart? Data vormt pas een message als alle data van de message ontvangen zijn. Eerder zal MIDIOX ook niks laten zien, want dan is het ook nog geen complete message. Het kan dus goed dat er een active sense of een midi clock tussendoor is geweest. Misschien komt dat niet zo vaak voor, maar volgens de midi specificatie mag het en zou ik er rekening mee houden, anders crasht je software eens in de zoveel tijd en is het lastig om uit te zoeken waar het aan ligt.
Kijk hier es naar http://www.borg.com/~jglatt/tech/midispec.htm , een uitgebreide beschrijving van de midispecificatie, met een apart stuk over running status. Voordat je in C begint te programmeren kan je beter eerst een state machine ontwerpen met stroomdiagrammen, daarna is dat makkelijk in C te vertalen.
Hier staat ook nog wat uitgelegd over midi en microcontrollers, is wel bedoeld voor atmel controllers maar het is allemaal beschreven in het engels zonder dat het heel specifiek over een controller gaat.

Ook zou ik je hardware zo ontwerpen dat je in system kan programmeren, dan hoef je niet steeds het ic eruit te trekken om te programmeren.
 
hey bedankt twiki, die pagina was ik kwijt en ik zocht er gisteren naar en ben daardoor op andere terecht gekomen.
ik heb em als eens intens door gekeken, ruim een jaar geleden toen ik begon.volgens mij iok die pagina kompleet gedownload op 1 van de schijven staan
dus ik wist al hoe die bytes eruit zien en wat ze betekenen.
ik heb in die tijd al die materiaalen gekocht en ook aan mijn huis zitten te werken.

zelf printen maken lukt niet, omdat de print/drukkerij zaken hier net voldoende zwart krijgen, als er geprint wordt van een door eagle gegenereed PDF bestandje, schijnbaar.
mischien ligt het ook wel aan eagle zelf.
nu wil ik het laten maken in shanghai bij een nederlander die daar woont, met silkscreen..

ja, de die ICP poort is er nog niet anders zou de screen shot te groot en onduidelijk worden, die poort doe ik hetzelfde als bij de midibox, met jumpuers, ik heb ook een Microshop IC2 debugger en nog een brander.

wat bedoel je met state machine?, mijn oorspronkelijk design had leds op alle poorten, zodat ik kan zien wat er gebeurt.
bedoel je dat met state machine?.
ik kan wel programeren, maar dit is toch wel anders omdat het voordurent loopt.

dus jij vind mijn design zo goed?, het kan niet anders en ik wil die 6 bits data toch wel op 1 poort houden.
alleen jammer dat die rx poort zomaar ff in het midden zit, nu moet ik die 2 bits in het miden ongemoeid laten of ik moet 18f252 gaan gebruiken, mar dat is te duur voor een enkele trigger.

trouwens als bytes zo maar ff willekeurig gezonden kunnen worden, hoe weet ik dan dat ze bij elkaar horen?
 
Laatst gewijzigd:
wat bedoel je met state machine?, mijn oorspronkelijk design had leds op alle poorten, zodat ik kan zien wat er gebeurt.
bedoel je dat met state machine?.
ik kan wel programeren, maar dit is toch wel anders omdat het voordurent loopt.

Als je kunt programmeren moet je toch weten wat een Finite State Machine is ;)

trouwens als bytes zo maar ff willekeurig gezonden kunnen worden, hoe weet ik dan dat ze bij elkaar horen?

Realtime info is altijd met het MSB aan, dus als je die in je data-stroom tegenkomt kun je ze negeren.
 
ik weet het niet vor 100% zeker, maar volgens mij is tie gekraakt.

midi_rx_handle_note_on_data_counter = 0;
byte_counter = 0;
/*
* Handle Received MIDI Bytes
*/
void midi_rx_byte(unsigned char byte) {
if(midi_rx_handle_note_on == 1){
if(byte_counter < 4){
if(byte < 0x80){ // we are lookking for bytes with a value smaller than 128
if(midi_rx_handle_note_on_counter == 0){ // 2nd wanted databyte
if(byte == 0x2f){ // determine notenumber, is the one we are looking for?
midi_rx_handle_note_on_data_counter++;
byte_counter++;
}
}
if(midi_rx_handle_note_on_data_counter == 1){ // 3rd wanted databye
if(byte < 0x80){ // determine velocity value, is the one we are looking for?
midi_rx_handle_note_on = 0; // reset
byte_counter = 0; // reset
prepare_DAC(byte); // prepare dac and trigger
// or store in buffer?
// than prepare dac?
}
if(byte < 0x00){ // velocity 0 == as a noteoff message
midi_rx_handle_note_on = 0; // reset
byte_counter = 0; // reset
}
}
}
if(((byte > 0x7f) && (midi_rx_handle_note_on_data_counter == 0 )||((byte > 0x7f) && (midi_rx_handle_note_on_data_counter == 1 )){
byte_counter++; //it seams we found some other data while waiting for the rest, try next byte
}
if(byte == 0x89){ // found note of status byte for channel 10?, did we miss anything?
midi_rx_handle_note_on = 0; // reset
byte_counter = 0; // reset
}
}
else{
midi_rx_handle_note_on = 0;
byte_counter = 0;// didn't find anything usefull after several tries, reset
}
byte_counter++;
}
else{
switch(byte) {
case 0xfa: // start
cond_ctl_start();
break;
case 0xfb: // continue
cond_ctl_start();
break;
case 0xfc: // stop
cond_ctl_stop();
break;
case 0xf8: // clock
cond_ctl_clock();
break;
case 0x99: // found the sought note on status byte, channel 10 - message
midi_rx_handle_note_on = 1;
break;
};
}
}

ff visual studio instaleren en kijken of tie werkt

@etaoin , webapplicatie is wat anders als CPU ....
 
@etaoin , webapplicatie is wat anders als CPU ....

Huh? Waar heb je het over?
Ik heb alleen maar een opmerking gemaakt over FSM's, ik heb volgens mij niks gezegd over webapplicaties.
Een FSM is een abstract programmeerconcept.
 
ik zei dat ik wel programeren kan, maar ook niet alles weet.
ik heb die naam state machine wel eens horen vallen, maar ik had geen clue, wat het was.
klink zo groot.
 
Origineel geplaatst door Natural_Demon
ik zei dat ik wel programeren kan, maar ook niet alles weet.
ik heb die naam state machine wel eens horen vallen, maar ik had geen clue, wat het was.
klink zo groot.

Ah, ok, ik begreep je verkeerd. Je bedoelde dat je wel ervaring hebt met webapplicaties en niet met low-level.
Wees blij dat je je PIC niet in assembler hoeft te programmeren dan ;)
 
ik het het wel gedaan, een pic18f84 met een 8 tal ledjes, die heen en weer aan en uit gaan.
iinstructieset zitten leren.

maar waarom mielijk doen als het makkelijk kan.
allemaal dat gedoe met bitshift. zelf een 500ms delay loop is best moeilijk.

heb je toevallig verstand van midibyes, want dit is de eerst keer dat ik USART ga gebruiken en een sprong maak van 16f.... naar 18f.....

wat vind je van mijn schema?
vind je mijn code goed, of ben ik ietss vergeten?

wat ik dus wil is een midi cv trigger, die alleen op kanaal 10 reageerd.
dat onderste stuk van die code (switch), heb ik zo over genoen uit een code die ik op de vermeelde pagina heb gevonden.

ik luister dus in realtime en zodra ik een byte ontvang met een waarde 0x99, verspring ik naaar een andere gedeelte in de functie. en zoek ik dus naar het 2de en 3de datasetje.
nu heb ik dus vernomen van twiki dat er ook andere bytes tussen jouw gezochte byte kunne zitten.

ik neem aan dat er 1 of hooguit 2 realtime berichten kunen tussen zitten.
dus filter ik dan weg.


wat is jouw kijk
 
Vergeet niet dat buiten extra bytes er ook bytes weg kunnen vallen. MIDI-hardware garandeert niet dat alles 100% doorkomt, dus je krijgt mogelijk zelfs een nieuwe note-on terwijl je nog denkt met een oude bezig te zijn. Dus feitelijk kun je alles > 7F niet zomaar weggooien maar moet je kijken wat het is.

En waar is de handling van de note-off? Ik zie wel een note-on met velocity van 0, maar de meeste apparaten sturen een echte note-off message. Of is deze code specifiek voor een bepaalde controller die geen note-off verstuurt?
 
Back
Top