Hans: Midi-Programmierung in C: Wiedergabe beenden

Hallo Leute,

bastel mir gerade ein Midi-Script in C, um mich in die Materie einzufinden. Das gleichzeitige Abspielen zweier Töne klappt auch gut. Leider werden die Töne aber nicht beendet, klingen also immer weiter. Kann mir jemand sagen, wo man die Dauer begrenzen kann? Ich benutze die Bibliothek "libwinmm.a". "Sleep" hat mir nicht geholfen, bzw. damit habe ich es nicht geschafft.

Hier ein Ausschnitt:


int main(int argc, char *argv[])
{
int Lautstaerke=100;
int Ton=70;//C1
int Kanal=1;
int Instrument=1;//Klavier
long StartMidi;
long EndMidi;
long Sound;
int Tonlaenge=1;//(in Sekunden)
int Treibernummer=0;

HMIDIOUT hMidiOut;

midiOutOpen(&hMidiOut, Treibernummer, 0, 0, 0);


StartMidi=(65536 * Lautstaerke) + (256 * Ton) + Kanal+143;

Sound=(256 * Instrument) + Kanal+191;
//Sound=(256 * 100) + 2+191;
EndMidi=(65536 * Lautstaerke) + (256 * Ton) + Kanal+127;

midiOutShortMsg(hMidiOut, Sound);
midiOutShortMsg(hMidiOut, StartMidi);

//Ton2, gleichzeitig

StartMidi=(65536 * Lautstaerke) + (256 * 90) + 2+143;

Sound=(256 *99) +2+191;

EndMidi=(65536 * Lautstaerke) + (256 * Ton) +2+127;

midiOutShortMsg(hMidiOut, Sound);
midiOutShortMsg(hMidiOut, StartMidi);

Danke! Hans

  1. Moin,

    auch auf die Gefahr hin, Dir auf die Füße zu treten; ist Dir bewusst, dass Du für jeden gestarteten Ton (Note-on-Befehl) einen Note-off-Befehl senden musst, um die Wiedergabe zu beenden? Vielleicht habe ich auch nur keine Ahnung von C, aber für mich sieht es so aus, als würdest Du nur einen Note-on-Befehl schicken.

    Gruß der Buchhalter

    1. Hi,

      da hast du natürlich Recht, habe hier nur einen Ausschnitt gepostet. Habe das Problem übrigens gelöst- es ging doch mit "Sleep()". Allerdings hat es nicht funktioniert, weil ich "sleep" kleingeschrieben hatte, was erstens Linux und zweitens eine Angabe in Sekunden erfordert. Daher wurde mein Ton quasi immer 1000 Sekunden anstatt nur 1000 Millisekunden gehalten. Da muss man mal drauf kommen^↑ Gruß Hans