Jump to content

Leaderboard

Popular Content

Showing content with the highest reputation on 05/05/2019 in all areas

  1. Hallöchen. Was ich zur Zeit mache.. nix Das war gelogen. Ich arbeite zur Zeit an ein paar Midi-Routinen für den DE:GENERATOR. Bei einer Routine handelt es sich um eine kleine Midi Noten Verwaltung (NoteStack).Der NoteStack macht folgendes: Wenn ich eine Midi Note spiele, wird die Noten Nummer auf Platz 1 im NoteStack gespeichert und der Ton vom Synthesizer gespielt. Lasse ich die Taste wieder los, so wird die Note im NoteStack gelöscht und der Ton wird ausgeschaltet. Simpel.. Jetzt drücken wir aber zwei Noten. Fast passiert: Zuerst wird die 1.Note auf Platz 1 im NoteStack gespeichert und der Ton gespielt. Danach wird die 2.Note auf Platz 2 im NoteStack gespeichert und der Ton für die 2.Note gespielt. Damit befinden sich jetzt zwei Noten im NoteStack. Die 1.Note auf Platz 1 und die 2.Note auf Platz 2. Lasse ich jetzt die 2.Note los, so wird im Stack die 2.Note auf Platz 2 gelöscht und der Ton für die 1.Note gespielt.Änliches passiert wenn die 1.Note losgelassen wird und die 2.Note noch gespielt wird. Dadurch wird dann die 1.Note auf Platz 1 im NoteStack gelöscht und die 2.Note auf Platz 1 verschoben. Der Ton für die 2.Note wird ohne Unterbrechung weiter gespielt. Insgesamt können 16 Noten im NoteStack verwaltet werden.NoteStack Schema C-Code Beispiel uint8_t NoteStack_pool[10]; uint8_t NoteStack_ptr = 0; uint8_t NoteStack_size = 10; //------------------------------------------------------------------------- // NoteOn //------------------------------------------------------------------------- void midi_NoteOn(void) { uint8_t midi_note_temp = midi_data[0]; // load midi_note if (NoteStack_ptr < NoteStack_size) { midi_note = midi_note_temp; NoteStack_pool[NoteStack_ptr] = midi_note; // write current note into notestack_pool NoteStack_ptr++; midi_sync_flag = 1; // start envelopes } } //------------------------------------------------------------------------- // NoteOff //------------------------------------------------------------------------- void midi_NoteOff(void) { // load current note uint8_t midi_note_temp = midi_data[0]; uint8_t last; // search current note into notestack_pool for (uint8_t i = 0; i < NoteStack_size; i++) { if (NoteStack_pool[i] == midi_note_temp) { // clear current note into notestack_pool NoteStack_pool[i] = 0xFF; NoteStack_ptr--; last = i; // sort notes into notestack_pool for (last; last < NoteStack_size;last++) { NoteStack_pool[last] = NoteStack_pool[last+1]; } // playing previous note if (NoteStack_ptr > 0) { last = NoteStack_ptr-1; midi_note = NoteStack_pool[last]; frequency_tune(); } else { // stop envelope if no note into notestack_pool midi_gate_flag = 0; } break; } } } Gruß Rolf
    1 point
×
×
  • Create New...