Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

ArduinoでMidiコントローラーを作ろう

9,157 views

Published on

ArduinoでMIDIフィジカルコントローラーを作ろう、というスライドです。

Published in: Devices & Hardware
  • Be the first to comment

ArduinoでMidiコントローラーを作ろう

  1. 1. Arduinoで作るMIDIコン 2014.5.17 @tadfmac 14年5月17日土曜日
  2. 2. 自己紹介    @tadfmac    http://soundcloud.com/tadfmac 実験音楽の人。自然音、インプロ、コンピュータを組み合わせた作品をつくる。 たまたま見に行ったMaker Faire Tokyo 2013で衝撃を受け、人生初の「ハンダゴ テ」を購入。Arduinoも2013/12月に購入。最初はArduinoでも何かを繋ぐ場合、 ハンダゴテを使うものだと思っていたが、どう使うか判らず呆然とする。 その後本を買い漁り、ブレッドボードとジャンパーのことを知る。 つまり、今楽しい盛り。 14年5月17日土曜日
  3. 3. MIDIコンとは? PCと繋いで音をぐりぐりやったりするアレ。 14年5月17日土曜日
  4. 4. MIDIのメリット 1. 音楽系ソフト(DAWなど)と直接繋いで遊べる 2. 実はブラウザとも繋がる (Web MIDI API) 3. プロトコルが決まってる(制御が簡単) MIDIのデメリット 1. ATmega16U2の書き換えが必要 2. Arduino側でジャンパーピン刺すの忘れる 3. プロトコルが決まってる(制約が多い) FirmataとMIDI 14年5月17日土曜日
  5. 5. こんな感じになる USBケーブル 今回は最低限な感じで 14年5月17日土曜日
  6. 6. 用意するモノ ジャンパーピン USBケーブル Arduino UNO R3 ブレッドボード、部品 Mac (Winでも出来ますが、今回 はMacで説明します) 14年5月17日土曜日
  7. 7. 手順 1. ATmega16U2にUSB MIDIファームを書き込む 2. 回路を組む(ブレッドボードとArduinoを配線) 3. Arduinoのスケッチを書いてロード 完成! 14年5月17日土曜日
  8. 8. 1. ATmega16U2にUSB MIDIファームを書き込む 14年5月17日土曜日
  9. 9. 1. ATmega16U2に書き込むツールを用意  Mac: dfu-programmer  Win: ATMEL FLIP (今回説明しません) 2. USB-MIDIファームイメージを用意 3. DFUモードでファーム書き換え 4. スケッチ書き込みモードへ 1. ATmega16U2にUSB MIDIファームを書き込む 14年5月17日土曜日
  10. 10. 1. ATmega16U2に書き込むツールを用意 Mac: dfu-programmer MacPorts →バージョン古くてATmega16U2未対応 ソースからビルド →「面倒」 ビルド済バイナリ 1. ATmega16U2にUSB MIDIファームを書き込む http://temp.dfm.lrv.jp/dfuprogrammer/dfu-programmer-061bin.zip http://qiita.com/tadfmac/items/b941f7d4858386e2d1b0 14年5月17日土曜日
  11. 11. 2. USB-MIDIファームイメージを用意 MORECAT_LAB様 『Midi Firmware for Arduino Uno (Moco)』 http://morecatlab.akiba.coocan.jp/lab/index.php/ aruino/midi-firmware-for-arduino-uno-moco/ ダウンロード http://morecatlab.akiba.coocan.jp/lab/wp-content/uploads/2013/09/dualMocoLUFA.tgz 1. ATmega16U2にUSB MIDIファームを書き込む 14年5月17日土曜日
  12. 12. DFUモード ATmega16U2 ATmega328P スケッチ書き込み dfu-programmer 1. ATmega16U2にUSB MIDIファームを書き込む 14年5月17日土曜日
  13. 13. 3. DFUモードでファーム書き換え 1. ATmega16U2にUSB MIDIファームを書き込む DFUモードへの入り方 1. ジャンパーする 2. USBつなぐ 3. (ArduinoのLEDが光った ら)ジャンパはずす 14年5月17日土曜日
  14. 14. 3. DFUモードでファーム書き換え 1. ATmega16U2にUSB MIDIファームを書き込む $ dfu-programmer atmega16u2 get まずはDFUモードに入れてるか確認 Bootloader Version: 0x20 (32) こんな感じに表示されたら入れてます。 14年5月17日土曜日
  15. 15. 3. DFUモードでファーム書き換え 1. ATmega16U2にUSB MIDIファームを書き込む $ dfu-programmer atmega16u2 erase 消去 dualMoco.hex書き込み $ dfu-programmer atmega16u2 flash dualMoco.hex 最後にreset $ dfu-programmer atmega16u2 reset 14年5月17日土曜日
  16. 16. 4. スケッチ書き込みモードへ 1. ATmega16U2にUSB MIDIファームを書き込む 2. ジャンパーを今度は 下記のようにする。 1. USBはずす 3. USBつなぐ 14年5月17日土曜日
  17. 17. dualMocoを書き込んだArduinoはジャンパとセットで 持ち歩こう! 1. ATmega16U2にUSB MIDIファームを書き込む ジャンパなし:MIDIデバイスになる 下記のようにジャンパ:スケッチ書き込み 14年5月17日土曜日
  18. 18. 2. 回路を組む(ブレッドボードとArduinoを配線) 14年5月17日土曜日
  19. 19. 回路 ※タクトスイッチが プルダウンなのは、 反省していますw 14年5月17日土曜日
  20. 20. 3. Arduinoのスケッチを書いてロード 14年5月17日土曜日
  21. 21. #include <MIDI.h> // つなげる場所により変えよう const int LED = 13; const int BUTTON = 8; const int VOLUME = 0; const int CDS = 1; // 回路の抵抗度合いなどに応じて数値は調整しよう #define note_MIN 0 #define note_MAX 127 #define vol_MIN 200 // volume保護用抵抗 #define vol_MAX 1023 // CdSを手で覆った時だけ使いたいのでこんな値 // 明るさによって変わるので調整しよう #define cds_MIN 820 #define cds_MAX 1023 // pitchbendは本当は -8192 - 8191 だけど // 元々の値が荒いので、ベンド幅を1/4にしとく。 // #define pb_MIN -2048 #define pb_MAX 2048 スケッチ 1 2 14年5月17日土曜日
  22. 22. // 初期化処理です void setup(){ pinMode(LED,OUTPUT); pinMode(BUTTON,INPUT); MIDI.begin(1); } // これはセンサー入力のフラつき対策 boolean checkChange(int val1,int val2, int range){ int l,h; l = val2-range; h = val2+range; if((l > val1)||(h < val1)){ return true; } return false; } int button = 0; int note = 0; int cds = 0; boolean isplay = false; void loop(){ int nowbutton; int nownote; int nowcds; // Note Number change nownote = analogRead(VOLUME); nownote = map(nownote, vol_MAX, vol_MIN, note_MIN, note_MAX); if(checkChange(nownote,note,1)){ if(isplay){ MIDI.sendNoteOff(note,0,1); MIDI.sendNoteOn(nownote,100,1); } note = nownote; } スケッチ 3 4 14年5月17日土曜日
  23. 23. // Cds (Pitchbend) nowcds = analogRead(CDS); if(nowcds > cds_MIN){ nowcds = map(nowcds, cds_MIN, cds_MAX, pb_MAX, pb_MIN); MIDI.sendPitchBend(nowcds,1); }else{ nowcds = 0; if(cds != nowcds){ MIDI.sendPitchBend(0,1); } } cds = nowcds; // Button (Note ON/OFF) nowbutton = digitalRead(BUTTON); if(nowbutton != button){ if(nowbutton == HIGH) { MIDI.sendNoteOn(note,100,1); isplay = true; digitalWrite(LED,HIGH); }else{ MIDI.sendNoteOff(note,0,1); isplay = false; digitalWrite(LED,LOW); } delay(50); } button = nowbutton; } スケッチ 5 6 14年5月17日土曜日
  24. 24. スケッチ ソースは下記にあります。 http://qiita.com/tadfmac/items/9136f47ae1eea99a4ef7 14年5月17日土曜日
  25. 25. ATmega16U2を書き換えると、ArduinoのUSB機能を変更 できる! MIDI以外にも、同じやり方でキーボードやマウスなどに もできるので、シリアル以外の可能性も広がる! http://mitchtech.net/arduino-usb-hid-keyboard/ まとめ 14年5月17日土曜日
  26. 26. Q&A    @tadfmac    http://soundcloud.com/tadfmac http://www.slideshare.net/tadfmac/arduinomidi 14年5月17日土曜日

×