Midi-Töne abspielen
-
Hier eine kleine WebPage: http://www.zem-college.de/midi/index.htm
-
Hier noch eine bessere: http://www.borg.com/~jglatt/tech/lowmidi.htm
-
Vielen Dank an alle besonders an DopeFish. Hat mir sehr geholfen.
-
@Dopefish oder @noebef: Wenn Dopefishs Info besser war, dann würde ich die Mail auch gerne mal erhalten. Danke.
-
hi,
die links funktionieren alle nicht mehr
und mit dem quelltext von fritz komm ich nicht so ganz klar, bin noch blutiger anfänger abe rmich interessiert da smit diesem midi tönen sehr.
könnte mir jemand da vllt nen codeschnipsel für anfnger machen wäre sehr sehr dankbar
-
ich würd ach gern ma wissen wie das geht..
-
Hi,
dies sollte gehen:MCIERROR err; err = mciSendString("play example.mid", 0, MCI_WAIT, 0);
mfg
Peter
-
kpeter schrieb:
Hi,
dies sollte gehen:MCIERROR err; err = mciSendString("play example.mid", 0, MCI_WAIT, 0);
mfg
Peterhat leider nicht geklappt es kommt kein ton, obwohl die middatei in dem order liegt wo auch meine exe drin ist
-
Hi,
starte mal die Anwendung (F9), setze unter der Quelltextzeile einen
Haltepunkt und stelle der Wert von err fest.mfg
Peter
-
Hallo kpeter
Ist das so einfach?
Welches Midi Output Device wird denn benutzt?
Ich habe z.B standartmässig Microsoft Wavetable SW Synth ausgewählt.
Habe aber das gleiche Problem wie ext00535.
Kein Laut zu hören...
Ich habe mich die letzten Tage intensiver mit Midi mit BCB beschäftigt und
musste feststellen, das es ein weites Feld ist (WinAPI).
Aber dieser Thread wird endlich Klarheit bringen, hoffe ich...
wNw
-
Hi,
bei mir auch Midi-Musikwiedergabe Microsoft Wavetable SW Synth.
Rückgabewert ermitteln:
void __fastcall TForm1::SpeedButton2Click(TObject *Sender) { MCIERROR err; err = mciSendString("play example.mid", 0, MCI_WAIT, 0); ShowMessage("Rückgabewert : " + IntToStr(err)); }
Ist der Wert ungleich Null, kann man anhand der Fehlernummer die
Ursache ermitteln.
Was wird angezeigt ??mfg
Peter
-
Rückgabewert 0
-
Sorry
Jetzt gehts.
Hatte bei meiner Soundkarten Software das Midi Out nicht aktiviert.
DankewNw
-
hi, ich emld mich nochmal..
also beui mir wird rückgabewert 292 angezeigt
-
Hi,
Fehler 292 : MCIERR_MISSING_DEVICE_NAME (siehe http://support.microsoft.com/kb/103647/de).
Das heisst, teile dem Programm das Gerät mit, auf welches zugegriffen werden soll.
// Test MCIERROR err; err = mciSendString("open sequencer", 0, 0, 0); err = mciSendString("play PASSPORT.MID", 0, MCI_WAIT, 0); err = mciSendString("close sequencer", 0, 0, 0);
mfg
Peter
-
ahh sry .. hab grad nen doofen fehler gemacht in dem string muss "play song.mid" hatte das play nicht mit drinne .. jetzt klappt ^^
aber ne frage nebenbei... wie kann ich denn die middarei in die exe mit einfügen?
Denn über mciSendString() muss ja die .mid datei zwangsläufig mit in dem order sein wo die .exe ist.. kann amnd as irdgnwie als ressource oder so mit einpflanzen oder wie geht das eig was der fritz da gemacht hat?
-
Hi,
als Resource kannst du das glaub ich auch zum Projekt hinzufügen (RC-Datei).
WebFritzis Code geht auch, du musst nur zwischen den Codezeilen Note an und
Note aus schreiben :Sleep(1000); // 1 sek Klangdauer
sonst ist nix zu hören.
Diese Variante der Klangerzeugung aus dem Programm heraus finde ich flexibler,
da es eine Vielzahl von Instrumenten gibt.mfg
Peter
-
Hallo kpeter
Danke nochmals.
Auf die Idee ein Sleep(x) einzufügen bin ich gar nicht gekommen.
Danke natürlich auch an WebFritzi.wNw
-
jupss.. klappt jetz echt alles super
jetzt müsst ich natürlich nurnoch fragen wie ich den code von webfritz so umstellen kann das auch andere instumente zu hören sind. steige leide rnicht so durch welcher code für was steht ^^
-
Hi,
das geht etwas tiefer in die API...
Um die Werte der MIDI-Message an die Funktion midiOutShortMsg
übergeben zu können, schreiben wir eine union:in die *.h-Datei (gleich unter include) :
union { public: unsigned long word; unsigned char data[4]; } msg;
in die *.cpp :
void __fastcall TForm1::SpeedButton1Click(TObject *Sender) { if (midiOutGetNumDevs() < 1) return; int midiport = 0; HMIDIOUT midiDev; int note; msg.data[2] = 100; msg.data[3] = 0; midiOutOpen(&midiDev, midiport, 0, 0, CALLBACK_NULL); for (int i = 0 ; i <= 127; i++) { // edit: nat. 0 bis 127 note = 60; // Tonhöhe msg.data[0] = 0xC0; // Instrument festlegen msg.data[1] = i; midiOutShortMsg(midiDev, msg.word); msg.data[0] = 0x90; // Note an msg.data[1] = note; // Notenwert midiOutShortMsg(midiDev, msg.word); Sleep(500); msg.data[0] = 0x80; // Note aus msg.data[1] = note; // Notenwert midiOutShortMsg(midiDev, msg.word); } midiOutClose(midiDev); }
Spielt alle 128 Instrumente des Sequencer.
Viel Spass
Peter