RtMidi 라이브러리를 사용하여 MIDI 인터페이스 만들기

이 문장은 Raspberry Pi와 MIDI 인터페이스를 통한 장치 개발의 시리즈이다.

시리즈 카탈로그

  • Raspberry Pi와 MIDI 인터페이스를 통한 장치 개발
  • RtMidi 라이브러리를 사용하여 MIDI 인터페이스 생성
  • SMF(Standard Midi Format)를 분석하여 MIDI 인터페이스(원형 편)에 주입합니다.
  • SMF(Standard Midi Format), MIDI 인터페이스 유입(클래스)
  • 이번에 MIDI 인터페이스 시뮬레이터를 제작하여 FluidSynth를 통해 소리를 낸다.

    처음에 설명한 바와 같이 언어는 C++이고 사용RtMidi 라이브러리입니다.
    'Midi 인터페이스'는 출력과 입력 두 가지 유형으로 나뉘는데 운영체제가 식별하는'Midi 인터페이스'는 aconnect -l 에 열거할 수 있다.
    > aconnect -l
    client 0: 'System' [type=kernel]
        0 'Timer           '
        1 'Announce        '
    client 14: 'Midi Through' [type=kernel]
        0 'Midi Through Port-0'
    
    idi 인터페이스를 만들고 지정한 이름을 포함하는 인터페이스에 연결하는 클래스를 만듭니다.
    midi.hpp
    #include <iostream>
    #include "RtMidi.h"
    
    enum struct MidiDirection {
        IN,
        OUT,
    };
    
    class MidiInterface {
    private:
        const char * name;
    public:
        MidiInterface(const char * interfaceName);
        RtMidi * connect(std::string target, MidiDirection direction);
    };
    
    midi.cpp
    #include "midi.hpp"
    
    
    MidiInterface::MidiInterface(const char * interfaceName) {
        name = interfaceName;
    }
    
    RtMidi * MidiInterface::connect(std::string target, MidiDirection direction) {
        char clientName[256] = "";
        sprintf(clientName, "%s Midi %s Client", name, direction == MidiDirection::IN ? "Input" : "Output");
        RtMidi * midi = direction == MidiDirection::IN ? 
            (RtMidi *)new RtMidiIn (RtMidi::UNSPECIFIED, clientName) :
            (RtMidi *)new RtMidiOut(RtMidi::UNSPECIFIED, clientName);
    
        unsigned int portCount = midi->getPortCount();
        for (unsigned int i=0; i<portCount; i++) {
            std::string portName = midi->getPortName(i).c_str();
            std::string::size_type index = portName.find(target, 0);
            if (index != std::string::npos) {
                char portName[256] = "";
                sprintf(portName, "%s Midi %s Port", name, direction == MidiDirection::IN ? "Input" : "Output");
                midi->openPort(i, portName);
                return midi;
            }
        }
        return NULL;
    }
    
    aconnect -l 명령을 통해 Midi 인터페이스 간의 연결 상태를 확인할 수도 있습니다.
    create_midi_interface.cpp
    #include <iostream>
    #include "midi.hpp"
    
    int main () {
        MidiInterface * p = new MidiInterface("foobar");
        p->connect("Midi Through", MidiDirection::OUT);
        while (true) std::cin.getc();
        exit(0);
    }
    
    $ aconnect -l
    client 0: 'System' [type=kernel]
        0 'Timer           '
        1 'Announce        '
    client 14: 'Midi Through' [type=kernel]
        0 'Midi Through Port-0'
    $ ./create_midi_interface.o &
    $ aconnect -l
    client 0: 'System' [type=kernel]
        0 'Timer           '
        1 'Announce        '
    client 14: 'Midi Through' [type=kernel]
        0 'Midi Through Port-0'
            Connected From: 128:0[real:0]
    client 128: 'foobar Midi Output Client' [type=user,pid=1528]
        0 'foobar Midi Output Port'
            Connecting To: 14:0[real:0]
    
    새로운 Foobar Midi Output Client의 Foobar Midi Output Port가 만들어지고 포트 14:0(Midi Through)과 연결되는 것을 볼 수 있습니다.

    해설


    별거 없어요.
    이전
    다음
    Raspberry Pi와 MIDI 인터페이스를 통한 장치 개발
    표준 블렌드 형식 분석 및 MIDI 인터페이스 가져오기

    좋은 웹페이지 즐겨찾기