So-net無料ブログ作成

MIDI - Arduino - SX-150 がやっと動いた [電子工作]

RIMG0983.JPG

[2009/7/13追記] このプロジェクトで使用している、Arduino Midi Libraryは最新のArduino IDEではコンパイルが通らないようです。こちらの環境では Arduino-012 までで稼働を確認しています。ご注意ください。
[2009/7/17追記] MIDIライブラリがアップデートされました!。詳しくはこちらのエントリを参照ください。

MIDIを使用してSX-150を演奏する回路を作成しました。
MIDI信号をArduinoを介して、SX-150用のCV/GATEに変換します。
Voltageの制御には以前作成した、DACを使った回路をそのまま流用しています。
(初心者らしい?)思い込みや間違い等があって、途中の放置していた期間も入れると、2カ月近くかかってしまいました。

以下に、作成した手順をまとめます。

MIDI IN回路の実装

MIDIとマイコンの接続にはフォトカプラを使用するのが一般的のようです。
フォトカプラは内部にLEDとフォトトランジスタを組み合わせた素子です。
一旦電気信号を光に変換して、それをフォトトランジスタで受け、トランジスタの導通により信号を伝えます。
このため、受信側の回路(マイコン側)と送信側の回路(MIDI端子)が電気的に絶縁されて、回路のミス等により受信側に一時的に過大な電流が流れこむのを防ぐことが可能となります。
今回の回路では、日本で一般的に入手可能で高速通信に強い TLP522 を使用しました。(マルツパーツ館秋葉原2号店で\346でした)
RIMG0942.JPG
MIDI INのケーブルをいきなり加工するのは怖かったのですが、同じく秋葉原の「MUSICVOX・AKIHABARA」でMIDIの延長ケーブル(メス―メス)が、在庫処分?で@50で箱売りになっていたので、これを購入して利用しました。(2月初旬だったので、今はもう売り切れている可能性が高いです。)
MIDI側は xピンとxピンのみを使用します。この時極性を間違えると繋がらないので注意が必要です。
こうして得られた信号を、Arduino側のRXピン(デジタルPIN 0)に接続します。

<危ない実験>
後のほうで説明する理由で、当初まったくコードが動かなくて、極性や半田作業もふくめてどこが悪いか全く分からず、一時途方にくれました。そこで確認のため、次の実験をしました。
MIDI INの確認
規格では5Vなので、いきなり火を噴く可能性は低いだろう、との思い込みを元に、MIDIの xピン と yピンをLEDにつないて見ました。予想通りに、MIDIキーボードを操作する都度盛大に光ったので、これでMIDI側の信号は流れている事は確認できました。(そのままは怖いので一瞬後すぐ外しましたが)
フォトカプラ出力の確認
フォトトランジスタ側の出力も、LEDをカソード側をGNDに接続してみました。こちらもわずかでしたが、操作の都度点滅されることが確認でき、ソフトウェア側の問題との切り分けが出来るようになりました。
流れる電流など計算しなかったので、これらの作業で最悪回路が「おしゃか」になる可能性があります。ご注意ください。

スケッチの作成

苦労したのは結果的にソフトウェアでした。
そもそも、Make: Japan のBLOGにMIDIライブラリが紹介されていたので、お手軽に出来ると思い開始したプロジェクトだったのですが、まずこれが全然物になりませんでした。
参照先が英文だったせいもありますが、説明が初心者の私には足りず、正しく構成することが出来なかったのです。
簡単にMIDI INを受信して、LEDを点灯させる回路としたのですが、LEDが全く反応が無く、前記の通りどこが悪いのか切り分けに非常に時間を要してしまいました。
その後こちらを見つけて、とりあえずLEDの点灯は実現出来たのですが、今度は信号の取りこぼしが多く、当初の目的には程遠い状態でした。
その後、下のほうで紹介しているリンク先を発見してなんとか動く状態になりました。
参考までに注意する点を2,3挙げます。
  • MIDI は 31250 bps のシリアル通信です。比較的に高速なため、フォトカプラの選定ももちろんですが、ソフトウェア側でも単純な,Serial.read() では処理が追いつきませんでした。そのため、割り込みを使用して、シリアルにデータが書き込まれたら、即処理を行うような実装が求められます。このため、よりAVRに近いレベルでのプログラミングが必要となります。
  • またシリアルで割り込みまで行う関係上、Serialライブラリは競合するため使用できません。デバッグのため、私は16文字×2桁のLCDを使って、必要な情報が見れるようにしてみました。
  • シリアルではデジタルPIN 0番を使用するため、Sketchのアップロード時には、この線を外しておく必要があります。つないだままUSB経由でアップロードを試みても、しばらく待たされた後最終的に失敗してしまいます。 ブレッドボードなので、抜き差しは簡単ですが、段々面倒くさくなってしまったので、トグルスイッチを間にはさみ、アップロード時にはスイッチで、事前に切り替えることにしました。


回路図はこちらです。デバッグ用のLCDは直接機能とは関係ないので、回路図では省略しています。
MIDI_IN.GIF


ソースもこちらに添付しておきます。
// MidiReceiveEX_150.pde
// http://timothytwillman.com/?page_id=240
#include "Midi.h"

int oldnote;

// PIN FOR LED
#define LED 9

// PINs for DAC
#define DATAOUT 11//MOSI
#define DATAIN 12//MISO - not used, but part of builtin SPI
#define SPICLOCK  13//sck
#define SLAVESELECT 10//ss

class MyMidi : public Midi {
  public:
  
  // Need this to compile; it just hands things off to the Midi class.
  MyMidi(HardwareSerial &s) : Midi(s) {}
  
  void handleNoteOn(unsigned int channel, unsigned int note, unsigned int velocity)
  {
    if ( note != oldnote) 
      noteOff();
    
    playNote(note);
    digitalWrite(LED, HIGH);
    oldnote = note;
  }

  void handleNoteOff(unsigned int channel, unsigned int note, unsigned int velocity)
  {
    if ( note == oldnote) 
       noteOff();

    digitalWrite(LED, LOW);
  }
  
};

// Create an instance of the MyMidi class.
MyMidi midi(Serial);


void setup()
{
  // initialize DAC
  byte clr;
  pinMode(DATAOUT, OUTPUT);
  pinMode(DATAIN, INPUT);
  pinMode(SPICLOCK,OUTPUT);
  pinMode(SLAVESELECT,OUTPUT);
  digitalWrite(SLAVESELECT,HIGH); //disable device
  
  SPCR = (1<<SPE)|(1<<MSTR);
  clr=SPSR;
  clr=SPDR;
  delay(10);

  // initialize LED
  pinMode(LED, OUTPUT);

  midi.begin(0);
}


void loop()
{
  midi.poll();
}

void write_value(uint16_t sample)
{
  uint8_t dacSPI0 = 0;
  uint8_t dacSPI1 = 0;
  dacSPI0 = (sample >> 8) & 0x00FF;
  dacSPI0 |= 0x10;
  dacSPI1 = sample & 0x00FF;
  digitalWrite(SLAVESELECT,LOW);
  SPDR = dacSPI0;                    // Start the transmission
  while (!(SPSR & (1<<SPIF)))     // Wait the end of the transmission
  {
  };
  
  SPDR = dacSPI1;
  while (!(SPSR & (1<<SPIF)))     // Wait the end of the transmission
  {
  };  
  digitalWrite(SLAVESELECT,HIGH);
  delay(5);
}

void playNote(int incomingByte)
{
   
  int diff = 48 - incomingByte;
  diff *= 12;
  write_value (1125 - diff);
}
void noteOff()
{
  write_value(0);
}



参考リンク
フォトカプラを使用したマイコンとの接続

情報処理学会チュートリアル・テキスト オリジナルMIDIセンサを作ろう
http://nagasm.suac.net/ASL/original/index.html
(MIDI INの回路については、最終的にこちらのものを使っています。)

code, circuits, & construction MIDI
http://www.tigoe.net/pcomp/code/serial-communication/midi
(英語ですが、MIDIの規格が分かりやすく整理されています)

Arduinoスケッチの作成

MAKE: Japan : Arduino用MIDIプログラミングライブラリー
http://jp.makezine.com/blog/2009/02/midi_programming_library_for_arduin.html
(一番最初にこの記事を見て、今回のプロジェクトを始めました。残念ながらうまく使うことが出来ず、ここから長い道のりが始まってしまいました。。英語というだけでなく、基本的な説明が不足しているように感じました。自分の知識不足は棚に上げていますが。。。)

Arduino Forum - works: MIDI-IN: code + schematics
http://www.arduino.cc/cgi-bin/yabb2/YaBB.pl?num=1187962258/
(ここに紹介されているコードで初めて動作が確認できましたが、MIDI INについては取りこぼしが多くて使えませんでした)

Arduino日記
http://nagasm.suac.net/ASL/Arduino/index.html
(上記のコードを使った例です。MIDI INについては、ダメ出しされています。)

Arduino MIDI in/out ライブラリ
http://pspunch.com/pd/article/arduino_lib_gmidi.html
(ここを参照することで、USARTの割り込みを使うことで、適切な処理を行えば取りこぼしが防げることが分かりました。)

Arduino Midi Library
http://timothytwillman.com/?page_id=240
(最終的に、サンプルスケッチも提供されていた、こちらのライブラリを使うことで、ほぼ問題無く動作するようになりました。感謝!)

[2009/3/30 追記] 作ってみましたが、現状だと結構チューニングずれています。 1オクターブ上がると、ずれがさらに大きくなって行く模様。 S/Wパラメータをチューニングするか、ANALOG-INを利用してVRでチューニング出来るようにしたほうが良いかも。 楽器での使用は現状だと厳しい。。。

nice!(0)  コメント(7)  トラックバック(0) 
共通テーマ:趣味・カルチャー

nice! 0

コメント 7

あきぼん3

あきぼん3と申します。
Arduinoで MIDI IN を受信する方法を探していてこの記事にたどり着きました。 

MIDIライブラリーをご指定の場所からダウンロードしインストールし、スケッチを arduino にアップロードしましたが、
コンパイル時にエラーが出てしまいます。

エラー内容は
// Create an instance of the MyMidi class.
MyMidi midi(Serial);  ------- この行がハイライトになります。

MIDI_SX_150:43: error: 'Serial' was not declared in this scope

MIDIライブラリーに添付されている「MidiReceiveExample.pde」でも同じエラーになります。

MIDIライブラリーはArduinoMidi-1.2.2.tgz
Arduino IDEは 0022
Arduinoは Duemilanove を使用しています。

何か対処法はございますでしょうか?




by あきぼん3 (2011-04-20 01:14) 

elekid

うーん。私のところも先日 022 あげましたが、今確認したら同じ箇所でコンパイルが通らなくなっていますね。
ご迷惑おかけしてすみません。ちょっと調べてみます。
by elekid (2011-05-05 20:17) 

Denisizn

Добрый день дамы и господа!


Веб-студия "Продвижение" предлагает продвижение сайтов Для Вас!

Наша студия интернет-маркетинга полностью ориентирована на успех Вашего сайта — мы учитываем все современные
правила продвижения, чтобы результат продвижения не только соответствовал ожиданиям, но и превосходил их!

Мы НАУЧИМ ВАШ САЙТ ПРОДАВАТЬ!!!

Независимо от того, каким образом Вы сделали заказ, Вам предоставляется консультация специалиста и делается предварительный расчет стоимости:


<a href=http://pro-dvizheniesaitov.ru/>продвижение сайтов</a> - в Перми - заказывайте у нас

<a href=http://www.pro-dvizheniesaitov.ru/>http://pro-dvizheniesaitov.ru</a>


Нам будет приятно видеть у нас на интернет ресурсе

<a href=http://pro-dvizheniesaitov.ru><img>http://dl4.joxi.net/drive/2018/01/17/0026/1614/1713742/42/51fbfb1cd7.jpg</img></a>

Увидимся!

<a href=http://pro-dvizheniesaitov.ru/>продвижение сайта</a>
<a href=http://pro-dvizheniesaitov.ru>как ускорить работу компьютера в интернете</a>
<a href=http://pro-dvizheniesaitov.ru/>продвижение сайтов</a>
<a href=http://pro-dvizheniesaitov.ru>студия продвижения сайтов</a>
<a href=http://pro-dvizheniesaitov.ru/>продвижение</a>
<a href=http://pro-dvizheniesaitov.ru/poleznoe/veb-studiya.html>веб студии</a>
<a href=http://pro-dvizheniesaitov.ru/>сайт оптимизация</a>
<a href=http://pro-dvizheniesaitov.ru/>http://www.pro-dvizheniesaitov.ru</a>
<a href=http://pro-dvizheniesaitov.ru/sozdanie-sajtov.html>сайт создание</a>
<a href=http://pro-dvizheniesaitov.ru/>создать сайт в перми</a>

by Denisizn (2018-03-15 01:33) 

Denislmb

Приветствую Вас товарищи!


Веб-студия "Продвижение" предлагает успешное продвижение сайта!

Наша компания по продвижению сайтов полностью ориентирована на Ваш успех — мы учитываем все современные
алгоритмы продвижения, чтобы успех продвижения не только соответствовал ожиданиям, но и приносил Вам Успех!

Мы НАУЧИМ ВАШ САЙТ ПРОДАВАТЬ!!!


Независимо от того, каким образом Вы сделали заказ, Вам предоставляется консультация специалиста и делается предварительный расчет стоимости:
<a href=http://pro-dvizheniesaitov.ru/poleznoe/kupit-nedorogo-proksi-proxy-http-v4-v6-sosks-4-sosks-5-v-odni-ruki.html>Купить недорого прокси proxy http v4 v6 soсks 4 soсks 5 в одни руки</a>


<a href=https://vk.com/prodnizheniesaitov_perm>группа вконтакте</a>

<a href=http://pro-dvizheniesaitov.ru/>продвижение сайтов</a> - в Перми - заказывайте у нас

<a href=http://pro-dvizheniesaitov.ru/poleznoe/kupit-nedorogo-proksi-proxy-http-v4-v6-sosks-4-sosks-5-v-odni-ruki.html>Купить недорого прокси proxy http v4 v6 soсks 4 soсks 5 в одни руки</a>


Нам будет приятно видеть у нас на сайте

<a href=http://pro-dvizheniesaitov.ru><img>http://dl4.joxi.net/drive/2018/01/17/0026/1614/1713742/42/51fbfb1cd7.jpg</img></a>

Увидимся!

<a href=http://pro-dvizheniesaitov.ru/>продвижение сайтов</a>
<a href=http://pro-dvizheniesaitov.ru>веб студия продвижение</a>
<a href=http://pro-dvizheniesaitov.ru>карьерный лестница</a>
<a href=http://pro-dvizheniesaitov.ru>продвижение яндекс</a>
<a href=http://pro-dvizheniesaitov.ru/poleznoe/kupit-nedorogo-proksi-proxy-http-v4-v6-sosks-4-sosks-5-v-odni-ruki.html>Купить недорого прокси proxy http v4 v6 soсks 4 soсks 5 в одни руки</a>
<a href=http://pro-dvizheniesaitov.ru/poleznoe/kupit-nedorogo-proksi-proxy-http-v4-v6-sosks-4-sosks-5-v-odni-ruki.html>Купить недорого прокси proxy http v4 v6 soсks 4 soсks 5 в одни руки</a>
<a href=http://pro-dvizheniesaitov.ru>дизайн студия 18</a>
<a href=http://pro-dvizheniesaitov.ru/>раскрутка сайтов</a>
<a href=http://pro-dvizheniesaitov.ru>работать форум</a>
<a href=http://pro-dvizheniesaitov.ru>настройка яндекс директ</a>

by Denislmb (2018-03-27 22:30) 

Mashrxo

Добрый день. Привет
господа!

Недавно утроилась работать в интернет-Магазин. "Ателье Уюта"
Хотелось бы получить отзыв в личку. Желательно положительный )

<a href=https://www.au59.ru>https://www.au59.ru</a>

Вот, что у нас есть:

Пошив штор

<a href=https://www.au59.ru>https://www.au59.ru</a>
<a href=https://www.au59.ru>Шторы Пермь</a>


Мы будем рады Вас видеть у нас на интернет ресурсе
Увидимся!

<a href=https://www.au59.ru/>шторы пермь</a>
<a href=https://www.au59.ru/>дизайн штор 2018</a>
<a href=https://www.au59.ru/>недорогие шторы пермь</a>
<a href=https://www.au59.ru/>рулонные шторы на кухню</a>
<a href=https://www.au59.ru/>где купить шторы пермь</a>

by Mashrxo (2018-04-21 02:37) 

prohip

Мы предоставляем лучшие услуги прокси-серверов пакетами. Вам необходим постоянный индивидуальный прокси для работы в Instagram, Вконтакте,Однокласниках или Авито? Вы увлекаетесь букмекерскими ставками или покером? SEO,SMM, просто безопасный серфинг или остальные цели? В таком случае вы по адресу.


Мы можем предложить анонимные, элитные, прокси-сервера с надежной круглосуточной поддержкой. Все наши прокси подходят для различных программ,сервисов, социальных сетей, онлайн игр и не только. Авторизация по логин - паролю или IP адресу.


Стремительные прокси ipv4 и ipv6 (до 100 мбит/с) обеспечат стабильную работу. Необходимы различные подсети, у нас их достаточно. Так же вы можете выбрать тип протокола HTTP/SOCKS.



<a href=https://proxywhite.com/>купить прокси ipv4</a>

by prohip (2018-11-15 16:45) 

prohip

Мы представляем очень качественные услуги прокси-серверов пакетами. Вам нужен постоянный частный прокси для работы в Instagram, Вконтакте,Однокласниках или Авито? Вы увлекаетесь букмекерскими ставками или покером? SEO,SMM, просто безопасный серфинг либо другие темы? Значит вы по нужному адресу.


Мы предоставляем анонимные, элитные, прокси-сервера с лучшей круглосуточной поддержкой. Все наши прокси подходят для самых разных программ,сервисов, социальных сетей, онлайн игр и не только. Авторизация по логин - паролю или IP адресу.


Стремительные прокси ipv4 и ipv6 (до 100 мбит/с) обеспечат стабильную работу. Нужны разные подсети, у нас их много. Так же вы можете выбрать тип протокола HTTP/SOCKS.




<a href=https://proxywhite.com/>купить прокси ipv4</a>

by prohip (2019-02-05 02:08) 

コメントを書く

お名前:
URL:
コメント:
画像認証:
下の画像に表示されている文字を入力してください。

トラックバック 0

この広告は前回の更新から一定期間経過したブログに表示されています。更新すると自動で解除されます。

×

この広告は1年以上新しい記事の更新がないブログに表示されております。