Midi-Töne abspielen



  • 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
    Peter

    hat 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.
    Danke

    wNw



  • 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



  • Super !
    Ein Fall für die FAQs...
    wNw


Anmelden zum Antworten