5

押されたときに、MIDI ノート番号を Juce オーディオ アプリケーションのラベルに印刷しようとしています。ここに私が現在持っているコードがあります:

MainComponent ヘッダー ファイル内:

class MainComponent   : public Component,
                        public MidiInputCallback

{
public:
    //==============================================================================
    MainComponent();
    ~MainComponent();

    void resized() override;
    void handleIncomingMidiMessage (MidiInput*, const MidiMessage&);


private:
    //==============================================================================
    JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (MainComponent)
    AudioDeviceManager audioDeviceManager;
    Label midiLabel;
};

MainComponent.cpp コンストラクターで:

MainComponent::MainComponent()
{
    setSize (500, 400);

    audioDeviceManager.setMidiInputEnabled("USB Axiom 49 Port 1", true);
    audioDeviceManager.addMidiInputCallback (String::empty, this);

    //midiLabel
    midiLabel.setText("midiText", sendNotification);
    addAndMakeVisible(midiLabel);
}

そして最後に handleIncomingMidiMessage 関数で:

void MainComponent::handleIncomingMidiMessage(MidiInput*, const MidiMessage&)
{
    DBG("MIDI Message Recieved\n");


    //display label text
    String midiText;
    MidiMessage message;
    if (message.isNoteOnOrOff()) {
        midiText << "NoteOn: Channel " << message.getChannel();
        midiText << ":Number" << message.getNoteNumber();
        midiText << ":Velocity" << message.getVelocity();
    }
    midiLabel.getTextValue() = midiText;

}

これを実行すると、「midiText」というラベルが表示され、MIDI キーボードのキーを押すとテキストが消えます。何か案は?

4

1 に答える 1

4

コールバックに渡されたMidiMessageを使用するのではなく、ループ内で新しいを作成しています。MidiMessageこの結果、midiTestは空になり、ラベルを設定するために使用されます (したがって、空白になる理由)。

関数の署名を次のように変更する必要があります。

void MainComponent::handleIncomingMidiMessage(MidiInput*, const MidiMessage& message)

次に、次の行を削除します。

MidiMessage message;
于 2015-11-28T00:27:59.083 に答える