// Skrolli 2018.3: Johdatus MIDI-dataan // Koodiesimerkki 1: MIDI-datan kirjoittaminen OSS-laiteajurin avulla. #include #include #include #include #include int main() { // Varmista, että tämä laite on olemassa. Voi olla myös // /dev/midi2, /dev/midi3 jne. char *midi_device = "/dev/midi"; // MIDI-ohjelmointi on pohjimmiltaan datan kirjoittamista tiedostoon. // Tässä voidaan siis käyttää aivan tavallisia open- ja write-komentoja. int fd = open(midi_device, O_WRONLY, 0); if (fd < 0) { printf("Virhe: MIDI-laitetta %s ei ole olemassa.\n", midi_device); exit(1); } // Koostetaan haluttu MIDI-viesti. Ensimmäinen tavu on statustavu, joka tässä // tapauksessa on Note on -viesti kanavalle 5 (binääri 10010101 heksamuodossa). // Kaksi jälkimmäistä tavua ovat datatavuja, jotka kertovat nuotin numeron (72) // ja voimakkuuden eli velocityn (96). char note_on[3] = {0x95, 72, 96}; // Kirjoitetaan data avattuun MIDI-porttiin. write(fd, note_on, sizeof(note_on)); // Odotetaan vähän aikaa, jotta nuotti ehditään kuulla. sleep(1); // Sammutetaan nuotti Note off -viestillä. // Statustavu 10000101 heksamuodossa = 0x85. Neljä alinta bittiä ovat // samat kuin note on -viestissä, eli viesti lähetetään samalle kanavalle. // Ylimmät 4 bittiä 1000 kertovat viestin tyypin olevan Note off. char note_off[3] = {0x85, 72, 33}; write(fd, note_off, sizeof(note_off)); close(fd); return 0; } // Koodiesimerkki 2: ALSA-laiteajurin MIDI-rajapinnan käyttö. #include #include int main() { snd_rawmidi_t *midi_out = NULL; int status = 0; // Listan käytettävissä olevista äänikorteista saat komennolla aplay -l. const char* port = "hw:0,0,0"; // ALSAn tapauksessa MIDI-portti avataan kirjaston omalla komennolla. // Vastauskoodi täytyy tarkistaa virheiden varalta. Jos laitteen avaaminen // epäonnistuu, ei muitakaan operaatioida voida tehdä. status = snd_rawmidi_open(NULL, &midi_out, port, SND_RAWMIDI_SYNC); if (status < 0) { printf("Virhe MIDI-laitetta avattaessa: %s", snd_strerror(status)); exit(1); } // Koostetaan note on -viesti nuotille C5 voimakkuudella 96. Nuotti lähetetään // MIDI-kanavalle 5 (statustavu 0x95 on binäärimuodossa 10010101). char note_on[3] = {0x95, 72, 96}; status = snd_rawmidi_write(midi_out, note_on, 3); if (status < 0) { printf("Virhe MIDI-dataa kirjoittaessa: %s", snd_strerror(status)); exit(1); } // Odotetaan vähän aikaa, jotta nuotti ehditään kuulla. sleep(1); // Sammutetaan nuotti Note off -viestillä. // Statustavu 10000101 heksamuodossa = 0x85. Neljä alinta bittiä ovat // samat kuin note on -viestissä, eli viesti lähetetään samalle kanavalle. // Ylimmät 4 bittiä 1000 kertovat viestin tyypin olevan Note off. char note_off[3] = {0x85, 72, 33}; status = snd_rawmidi_write(midi_out, note_off, 3); if (status < 0) { printf("Virhe MIDI-dataa kirjoittaessa: %s", snd_strerror(status)); exit(1); } snd_rawmidi_close(midi_out); midi_out = NULL; return 0; }