MIDI Daten abfangen

  • Ersteller Maxintiger
  • Erstellt am
M
Maxintiger
Registrierter Benutzer
Zuletzt hier
07.07.12
Registriert
08.11.07
Beiträge
17
Kekse
0
Ort
München
Hallo allerseits!

ich wollte selber ein kleines Software Tool schreiben, das ich über mein MIDI Keyboard ansteuern können soll. Jetzt weiß ich aber nicht, wie ich an die Daten kommen soll, die das Keyboard an meinen Rechner schickt. Hab google gefragt und leider wusste auch sie auch nicht weiter. Jetzt frage ich euch.

danke schonmal im Voraus für eure Mühen
 
Eigenschaft
 
es gibt ein Freeware Tool namens Midi OX, das hat einen Echtzeit Monitor, damit siehst du alle Daten die vom Keyboard reinkommen.
 
ich wollte selber ein kleines Software Tool schreiben, das ich über mein MIDI Keyboard ansteuern können soll. Jetzt weiß ich aber nicht, wie ich an die Daten kommen soll, die das Keyboard an meinen Rechner schickt.
Du suchst eine Midi Komponente oder Bibliothek für deine Programmiersprache. Ein USB Keyboard sieht für dich als Programmierer aus wie ein ganz normales Midi Gerät. Unter Delphi habe ich z.B. eine und kann mit den Daten dann in folgender Form etwas anfangen:

Code:
    TMyMidiEvent = class(TPersistent)
    public
        MidiMessage: Byte;          { MIDI message status byte }
        Data1: Byte;            { MIDI message data 1 byte }
        Data2: Byte;            { MIDI message data 2 byte }
        Time: DWORD;          { Time in ms since midiInOpen }
        SysexLength: Word;  { Length of sysex data (0 if none) }
        Sysex: PChar;           { Pointer to sysex data buffer }
        destructor Destroy; override;   { Frees sysex data buffer if nec. }
    end;
 
ich wollte selber ein kleines Software Tool schreiben, das ich über mein MIDI Keyboard ansteuern können soll. Jetzt weiß ich aber nicht, wie ich an die Daten kommen soll, die das Keyboard an meinen Rechner schickt.

Welche Programmiersprache verwendest du denn? Wenn du C++ unter Windows nimmst, müssen mmsystem.h und winmm.lib eingebunden werden. Dann geht's so weiter:

lege eine Callbackfunktion an, die später die Daten empfängt:
void CALLBACK MidiInProc( HMIDIIN hMidiIn, UINT wMsg, DWORD_PTR dwInstance, DWORD_PTR dwParam1, DWORD_PTR dwParam2 );

Hole dir die Zahl der Eingabegeräte:
UINT midiInGetNumDevs(void);

dann legst du ein Array von MIDIINCAPS-Strukturen an und füllst diese mit
MMRESULT midiInGetDevCaps( UINT_PTR uDeviceID, LPMIDIINCAPS lpMidiInCaps, UINT cbMidiInCaps );

dann suchst du dir ein Eingabegerät aus, oder lässt das den Benutzer machen und öffnest es:
MMRESULT midiInOpen( LPHMIDIIN lphMidiIn, UINT uDeviceID, DWORD_PTR dwCallback, DWORD_PTR dwCallbackInstance, DWORD dwFlags );
du brauchst dabei die Adresse der oben genannten Callbackfunktion (DWORD_PTR dwCallback), die jedes Mal beim Empfang von MIDI-Daten aufgerufen wird. Das kann etwas knifflig werden, weil bei objektorientierter Programmierung diese Adresse zur Compilezeit noch gar nicht feststeht, weil das Objekt ja noch nicht angelegt wurde.

mit... MMRESULT midiInStart( HMIDIIN hMidiIn ); // ...wird der Empfangsvorgang gestartet

In der Callbackfunktion kannst du dann die MIDI-Daten weiterverarbeiten. Die ist aber etwas zeitkritisch: wenn du die Daten z.B. am Bildschirm ausgeben willst, empfiehlt es sich, sie über SendMessage o.ä. in die Message-Queue zu senden, dort wieder abzufangen und auszugeben.

Ich habe hier eine Testversion von Visual C++ und das funktioniert sehr gut so.

Harald
 
Für C++ würde ich als Abstraktion RTMidi empfehlen. Das ist sehr schlank, Open Source und funktioniert unter Windows, Mac und Linux. Ich habe schon mehrere (auch komplexe) Projekte damit gemacht und es funktioniert wirklich sehr zuverlässig und stabil.
 
Danke euch allen!
Ich benutze C# und ich hab - ausgehend von dem, was HarandS geschrieben hat - die MIDI-Befehle gefunden, die ich brauche. Scheint recht ähnlich zu sein und hab schon erste Erfolge erzielt.
Darum nochmal: Danke für eure Hilfe

max
 

Ähnliche Themen


Unser weiteres Online-Angebot:
Bassic.de · Deejayforum.de · Sequencer.de · Clavio.de · Guitarworld.de · Recording.de

Musiker-Board Logo
Zurück
Oben