rtmidi richtig einbinden



  • Auf meiner Suche nach einer guten MIDI Libary habe ich mich für rtmidi entschieden. Nun habe ich das Problem, dass ich es nicht schaffe rtmidi so einzubinden, dass ich danach die Libary verwenden kann.

    Vorgehen:
    Also ich habe rtmidi hinuntergeladen und die Dateien RtMidi.h und RtMidi.cpp in den gleichen Ordner wie mein Programm kopiert. Nun versuchte ich das unten angefügte Testprogramm von http://www.music.mcgill.ca/~gary/rtmidi/ zu starten und bekomme immer die Fehlermeldung: "clang: error: linker command failed with exit code 1 (use -v to see invocation". Was habe ich falsch gemacht? Bitte helft mir. Ich habe schon über 5 Stunden erfolglos an diesem Problem herumprobiert aber bin auf keine funktionierende Lösung gekommen. Ich programmiere schon seit etwa einem Jahr hobbymässig C++, bin aber bis anhin immer mit den Standard Librarys ausgekommen. 😃

    Das verwende ich:
    - MacOSX Mavericks
    - Code::Blocks

    #define __MACOSX_CORE__
    #include <iostream>
    #include "RtMidi.h"
    
    int main()
    {
      RtMidiIn *midiin = 0;
      // RtMidiIn constructor
      try {
        midiin = new RtMidiIn();
      }
      catch (RtMidiError &error) {
        // Handle the exception here
        error.printMessage();
      }
      // Clean up
      delete midiin;
    }
    


  • Du musst RtMidi.cpp auch mit in dein Projekt aufnehmen.



  • DirkB schrieb:

    Du musst RtMidi.cpp auch mit in dein Projekt aufnehmen.

    Oder eine vorkompilierte Lib mitlinken.



  • Das mit #include "RtMidi.cpp" funktioniert Perfekt 🙂 🙂 🙂
    Häzlichen Dank an DirkB und allen anderen die mir geholfen haben 🙂



  • NicoBosshard schrieb:

    Das mit #include "RtMidi.cpp" funktioniert Perfekt 🙂 🙂 🙂
    Häzlichen Dank an DirkB und allen anderen die mir geholfen haben 🙂

    Nee, das ist der falsche Weg. cpp-Dateien sollte man nicht inkludieren. Füg einfach die RtMidi.cpp in den Projekteinstellungen zu den Source-Files hinzu. Dann wird es automatisch mitkompiliert und gelinkt.



  • NicoBosshard schrieb:

    Das mit #include "RtMidi.cpp" funktioniert Perfekt

    Ist es aber nicht.
    Das hätte ich auch anders beschrieben.

    Ich weiß ja nicht wie du compilierst und linkst, aber bei Code::Blocks (unter Windows) kannst du auf das Menue Project gehen und da dann Add Files .. auswählen.

    In der FileSelectBox wählst du dann RtMidi.cpp aus.



  • Irgendwas an der Einbindung klappt leider doch nicht. Egal was ich mache: Immer kommt beim Befehl RtMidiOut *midiout = new RtMidiOut(); die Meldung "MidiOutDummy: This class provides no functionality." Was bedeutet dies und wie kann ich diesen Fehler beheben? Ich habe wie von DirkB empfohlen per #include "lib/RtMidi.h" und Add Files... eingebunden. Auch habe ich nicht vergessen per #define __MACOSX_CORE__ RtMidi mitzuteilen dass ich ein Mac OS X habe wobei ich jedoch genau hier mein Fehler vermute. Bei RtMidiIn *midiin = new RtMidiIn(); kommt ausserdem die Meldung "MidiInDummy: This class provides no functionality." Die Anzahl freier Ports werden mit 0 angezeigt obwohl ich von anderen Programmen weis dass 16 frei sein sollten, dies ist wahrscheinlich wegen dem Fehler in "new RtMidiIn();" so und Virtuelle Ports gehen ja auch nicht. Mittlerweile bin ich schon ziemlich verzweifelt da es einfach nie funktioniert. Bitte helft mir wie ich meine MIDI Signale senden kann. Am liebsten wäre mir ein vorkonfiguriertes Code::Blocks Project wo ich dann einfach nur noch programmieren kann jedoch wären auch gute Beschreibungen was ich falsch gemacht habe eine enorme Hilfe für mich.

    Hier noch mein jetziger Stand falls der Fehler im Code liegen würde:

    #define __MACOSX_CORE__
    #include <iostream>
    #include "lib/RtMidi.h"
    //#include "lib/RtMidi.cpp"
    #include <unistd.h>
    #include <cstdlib>
    
    int main()
    {
      RtMidiIn *midiin = new RtMidiIn();
      RtMidiOut *midiout = new RtMidiOut();
      std::vector<unsigned char> message;
    
      int nOutPorts = midiin->getPortCount();
      std::cout << nOutPorts;
      if(nOutPorts>0)
      {
        //midiout->openVirtualPort("MIDI");
        midiout->openPort(1);
    
        message.push_back( 192 );
        message.push_back( 5 );
        midiout->sendMessage( &message );
        // Control Change: 176, 7, 100 (volume)
        message[0] = 176;
        message[1] = 7;
        message.push_back( 100 );
        midiout->sendMessage( &message );
    
        //Start:
        // Note On: 144, 64, 90
        message[0] = 144;
        message[1] = 64;
        message[2] = 90;
        midiout->sendMessage( &message );
        usleep(3500 * 1000);
        // Note Off: 128, 64, 40
        message[0] = 128;
        message[1] = 64;
        message[2] = 40;
        midiout->sendMessage( &message );
        usleep(3500 * 1000);
      }
    
      delete midiout;
      return 0;
    }
    


  • Ich hinterlasse hier eine Antwort, mit der Hoffnung dass es jemanden weiter hilft.

    Ich hatte das selbe Problem was NicoBosshard beschrieben hat, inklusive, rtMidi hat meine soundports nicht gefunden. Das Problem habe ich zwar nicht gelöst, aber ich habe ein (etwas unschönes) Workaround gefunden.

    Um eine midi-Datei abzuspielen, benutze ich timidity mit der exec Funktion die hier beschrieben wird:
    http://stackoverflow.com/questions/478898/how-to-execute-a-command-and-get-output-of-command-within-c

    Also:

    std::string str = "timidity " + datei_name + " > /dev/null";
        char *cmd = &str[0u];
        exec(cmd);
    

    Wobei der "> /dev/null" Teil dafür dient, die Console voll zu spammen wenn ich mein Programm teste.

    Ich weis es ist unschön, weil man dafür timidity installiert haben muss, ich hoffe es hilft aber trotzdem.


Anmelden zum Antworten