質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Arduino

Arduinoは、AVRマイコン、単純なI/O(入出力)ポートを備えた基板、C言語を元としたArduinoのプログラム言語と、それを実装した統合開発環境から構成されたシステムです。

Q&A

3回答

1512閲覧

電子ピアノの鍵盤に,パソコンのキーボードと同じ振る舞いをさせたい

tlook67xy

総合スコア0

Arduino

Arduinoは、AVRマイコン、単純なI/O(入出力)ポートを備えた基板、C言語を元としたArduinoのプログラム言語と、それを実装した統合開発環境から構成されたシステムです。

0グッド

0クリップ

投稿2021/05/04 11:32

編集2021/05/07 04:43

実現したいこと

Arduino Leonardo を使って,電子ピアノの各々の鍵盤と,PC のキーボードの各々のキーを紐づけて,ある鍵盤が押されたらそれに対応したPC キーボードのキーが押された時のような振る舞いをさせたいです(「真ん中のドを押したら,パソコンでは a がタイピングされている」みたいな状態を実現したいです).
回路図を以下に示します.
回路図

発生している問題

Hairless MIDI
Hairless MIDI を使って電子ピアノと Arduino Leonardo を仮想 MIDI ケーブルでつないでいるのですが,鍵盤を押してもプログラム通りの動きをしてくれません.
if(MIDI.read()) で鍵盤が押されたかどうかを見ているのですが,この部分が機能していないみたいです.

該当のソースコード

Arduino

1#include <Mouse.h> 2#include <Keyboard.h> 3#include <MIDI.h> 4 5MIDI_CREATE_DEFAULT_INSTANCE(); 6int a; 7void setup() 8{ 9 // put your setup code here, to run once: 10 MIDI.begin(); 11 Serial.begin(115200); 12 Keyboard.begin(); 13} 14 15void loop() 16{ 17 // put your main code here, to run repeatedly: 18 if (MIDI.read()) 19 { 20 Keyboard.press(0x61); 21 delay(1000); 22 Keyboard.release(0x61); 23 } 24 /* 25 else 26 { 27 a=1; 28 Serial.print(a); 29 a=0; 30 delay(1000); 31 } 32 */ 33}

試したこと

  • ソースコードではコメントとされていますが,else で b をタイピングする処理を入れたところ,永遠に b がタイピングされましたので,keyboard ライブラリのメソッドが機能していないというわけではないようです.
  • プログラムを書き込む際,Hairless MIDI の「Serial <-> MIDI Bridge On」のチェックボックスにチェックは入れてません.
  • Hairless MIDI のボードレートと Arduino IDE で設定しているボードレートも 115200 で揃えています.
  • 電子ピアノの鍵盤を押したとき,Hairless MIDI では信号が受信されたときに光るランプが MIDI In でも Serial port でも光っていたので,MIDI 信号の送受信はされていると思います...
  • MIDI が送信されるチャンネルが違うのかと思い,MIDI.begin(MIDI_CHANNEL_OMNI) としてみましたが,動いてくれませんでした.

補足情報

  • Arduino IDE のバージョン : 1.8.13
  • MIDI Library のバージョン : 5.0.2
  • 電子ピアノ : Roland FP-10

足りていない情報等ございましたらどんどん言って下さい!!

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

thkana

2021/05/06 22:54

ところでタグの"IDE"は何で?
tlook67xy

2021/05/07 04:01

arduino IDE で arduino のプログラムを作っていたのでタグに入れたんですけど,よく考えたら本題とは関係ありませんでした.ご指摘ありがとうございます.
guest

回答3

0

このあたりの事は詳しい訳では無いですけど、少なくとも

☑Serial<->MIDI Bridge ON

とチェックを入れないと繋がりませんよ。

画像追加イメージ説明

一応試したので記しておきます。
↓で、「Leonardo(ソフトシリアル)」と書いたのは、UNO等のシリアルは既に使っている状態、と間違えただけです。(ソフトシリアルでも可能でしょうけど)
LEONARDOならシリアルは使っていないので、それとUSBシリアル変換モジュールを繋ぎます。
一応、収拾がつかなくなるのがいやなのでD10ピン-GNDに繋ぐとキー送信はしません。
何も繋がなければ動きます。キーは'a'に変えてあります。(番号が何か判らなかったので、とっさに)

Arduino

1#include <MIDI.h> 2#include <Keyboard.h> 3 4MIDI_CREATE_INSTANCE(HardwareSerial, Serial1, MIDI);//D0、D1をUSBシリアル変換モジュールと繋ぐ。 5 6void setup() { 7 pinMode(10, 2);//安全用D10-GNDで送信停止 8 MIDI.begin(MIDI_CHANNEL_OMNI); 9 Serial1.begin(115200);//USBシリアルモジュール 10 Keyboard.begin(); 11} 12 13void loop() { 14 if (MIDI.read()&& digitalRead(10)) { 15 Keyboard.press('a'); 16 delay(1); 17 Keyboard.release('a'); 18 } 19} 20

ついでに言えば、「USB1本でも可能な筈」とは私自身も思っています。
けれども、実際にLEONARDO(私が使ったのはPRO MICROですけど)だとMIDIデバイスを作ってしまったりで、実際問題として、私では上手くいきませんでした。
上で示したように、もう一本繋げば動作します。

そのあたりは、設定方法を知っている詳しい方もいるかもしれません。

追記/変更

ちょっと上記スケッチで良くないと思われる箇所があったので追記します。
現在

Serial1.begin(115200);//USBシリアルモジュール
MIDI.begin(MIDI_CHANNEL_OMNI);

となっている個所は

MIDI.begin(MIDI_CHANNEL_OMNI); //ここでMIDIの31250bpsになる
Serial1.begin(115200);//それを112500bpsで上書きしてHairlessのデフォルト速度にする

という事らしいです。
私の場合は既にMIDIライブラリの方(midi_Settings.h)を112500bpsに書き換えてあるので上記で動作した(そもそもSerial1.beginの行は要らなかった)という事らしいです。

なので、上記のスケッチの順番を変えました。

投稿2021/05/04 13:12

編集2021/05/06 22:45
nac_tnk

総合スコア463

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

tlook67xy

2021/05/04 13:16

ご指摘ありがとうございます.プログラムを Arduino に書き込むときはチェックを外さないといけないらしいので,スクショでは外れていますが,実際に動かそうとしているときにはチェックは入れているのでそこは問題ないかと思われます.
nac_tnk

2021/05/04 13:23

まずは、Arduinoスケッチ以前に、↑画像のようにNOTEが送れるようになる事ですね。
tlook67xy

2021/05/04 13:26

NOTE は送ってくださった画像のように送れていました.
nac_tnk

2021/05/04 13:32

あぁ、そうだったんだ。 それなら、シリアルーUSBモジュールでLeonardo(ソフトシリアル)に繋げばいけるんじゃない? blue pillあたりはUSBCompositeライブラリだから、midiもシリアルもチャンポンで出来るようだけど・・・
tlook67xy

2021/05/04 13:45

ありがとうございます,試してみます!
tlook67xy

2021/05/05 09:55

ありがとうございます!参考にさせていただきます!
guest

0

PCからみたArduino Leonardoのシリアルは、USBのCDCつまり仮想シリアルです。MIDIライブラリが仮想でないシリアル(UARTのTX/RX端子)を使う前提のものであるならその構成ではMIDIに信号が得られないのかもしれません。
使っているMIDIライブラリの仕様を確認してみてください。


(そういえばMIDI機器とヤマハのMIDI-USBコンバータが押し入れの奥にあったはず...と思ったけど見つからない)

MIDI Libralyのソースを覗くと、serialMIDI.h中に
// Leonardo, Due and other USB boards use Serial1 by default.
という文言が見えますね。Serial1はD0/D1のところの(物理)UARTですから...
ライブラリのExampleを見ると、AltPinSerialというのがあって、SoftwareSerialを割り当てている例がありますからそれを参考にMIDIをSerialに割当てなおしてみてはいかがでしょう。(しかしSoftwareSerialが31.5KbpsのMIDIでまともに使えるのか?)

それと、

Arduino

1 MIDI.begin(); 2 Serial.begin(115200);

MIDIライブラリがSerialを使ってMIDI通信しようとしているのに、Serial.beign(115200);でシリアルポートを横取り?しちゃよろしくないのでは(CDCだとボーレート設定は関係ないかも)。

投稿2021/05/04 12:57

編集2021/05/05 00:36
thkana

総合スコア7629

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

tlook67xy

2021/05/04 13:10

Hairless MIDI を介して Arduino Leonardo に送信される MIDI 信号は仮想シリアルであるため,MIDI ライブラリが仮想でないシリアルを使う前提のものであるなら電子ピアノから UART に直接 MIDI 信号を送らなければならないということでしょうか? 理解が違ったり,専門用語の使い方が支離滅裂だったら申し訳ありません.
thkana

2021/05/04 13:49

MIDI ライブラリが仮想でないシリアル=UARTを使う前提のものであるなら、 (直接かどうかは問いませんが)UARTにMIDI信号が入らないとどうにもならない、ということです。 PC側でUSB経由のMIDIの信号分配とかができるなら、LeonardoのUSBを使うMIDIライブラリもあるようです。
tlook67xy

2021/05/04 13:59

ありがとうございます!試してみます!
tlook67xy

2021/05/05 00:47

丁寧に教えてくださり,本当にありがとうございます! 構成を見直してみたいと思います!
guest

0

まずは、
MIDI.read()
でどういう値が帰ってきているのか、シリアルポートにでも出して見てみてはどうでしょうか。

投稿2021/05/04 12:01

y_waiwai

総合スコア87747

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

tlook67xy

2021/05/04 12:23 編集

ご指摘ありがとうございます.以下のようなプログラムを作ってシリアルポートでどのような値が帰ってきているのか確認しようとしました. ``` #include <Mouse.h> #include <Keyboard.h> #include <MIDI.h> MIDI_CREATE_DEFAULT_INSTANCE(); void setup() { // put your setup code here, to run once: MIDI.begin(); Serial.begin(115200); Keyboard.begin(); } void loop() { // put your main code here, to run repeatedly: Serial.print(MIDI.read()); delay(1000); } ``` しかし,シリアルポートを開こうとすると,「シリアルポート「COM6」が開けません.(Port busy)」と出てきました.Hairless MIDI とつないでいるときはシリアルポートは開けないのでしょうか?
y_waiwai

2021/05/04 12:26

回路図が提示されてないので、COM6ってのが意味不明ですが、 MIDIの通信をきちんと受信できているかどうかを、何らかの方法で確認できるようにしましょう なんかわからんけど動くようになりましたってのは、なんの意味もないですよ
tlook67xy

2021/05/04 12:49

説明不足で申し訳ありません.COM6 は Arduino Leonardo が繋がっているポートです.回路図も追加してみました. まずは MIDI.read() がどのような値を返しているのかしっかり確認できるようにしていきます. ありがとうございます.
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問