tag:crieit.net,2005:https://crieit.net/tags/processing/feed 「processing」の記事 - Crieit Crieitでタグ「processing」に投稿された最近の記事 2018-10-27T20:50:31+09:00 https://crieit.net/tags/processing/feed tag:crieit.net,2005:PublicArticle/14391 2014-04-27T09:00:00+09:00 2018-10-27T20:50:31+09:00 https://crieit.net/posts/b110cec4f04e852f51564f6f39f1954a 電子リコーダーができた <p>リコーダー型のMIDIコントローラがついに出来上がってきた。<br /> <a target="_blank" rel="nofollow noopener" href="http://program.alphabrend.com/wp-content/uploads/2014/04/DSC_0226.jpg"><img class="alignnone size-medium wp-image-304" title="DSC_0226" src="http://program.alphabrend.com/wp-content/uploads/2014/04/DSC_0226-225x300.jpg" alt="" width="225" height="300" /></a></p> <p>とりあえず圧電スピーカは洗濯バサミで上にくっつけている。<br /> 接続はピンソケット2つで行っているので、<br /> つばで汚れたら新しいものに付け替えることができるようにしている。</p> <p>もう普通に演奏できる。<br /> まだファームウェア書き換えでは試してないので<br /> 音を鳴らす方法は下記のまま。<br /> <a target="_blank" rel="nofollow noopener" href="http://program.alphabrend.com/?p=150" target="_blank">http://program.alphabrend.com/?p=150</a></p> <p>ただちょっと遅延があって演奏しづらいので、<br /> 可能な箇所があればプログラムや回路の見直しと、<br /> ASIOドライバというものを導入してみたいと考えている。</p> <p>最終的にはアクリルを筒状っぽくしてそれっぽい入れものに入れてみたい。<br /> とりあえずは段ボールでケースでもつくろかな…。</p> <p>arduino</p> <blockquote> <p>|c|</p> </blockquote> <h1 id="include &lt;MIDI.h>"><a href="#include+%26lt%3BMIDI.h%3E">include <MIDI.h></a></h1> <h1 id="define NO_VOLUME_CHANGE"><a href="#define+NO_VOLUME_CHANGE">define NO_VOLUME_CHANGE</a></h1> <p>const int BUTTON_MIN = 2;<br /> const int BUTTON_MAX = 12;<br /> const int BREATH = 0;<br /> const int BASE_PITCH = 53;<br /> const int BREATH_CUT = 670;<br /> const int MIN_BREATH = 300;<br /> const int MAX_DIFF = 3;<br /> const int BREATH_DELAY = 70000;</p> <p>int playing = -1;<br /> unsigned long lastHigh = micros();<br /> unsigned long lastVelo = micros();<br /> byte currentVelocity = 0;<br /> char* notes[] = {<br /> "01111110011",<br /> "01111110110",<br /> "01111110010",<br /> "01111111000",<br /> "01111110000",<br /> "01111100000",<br /> "01111010010",<br /> "01111000000",<br /> "01110111000",<br /> "01110000000",<br /> "01101100000",<br /> "01100000000",<br /> "01010000000",<br /> "00110000000",<br /> "00010000000",<br /> "00111110010",<br /> "10111110000",<br /> "10111100000",<br /> "10111010000",<br /> "10111000000",<br /> "10110100000",<br /> "10110000000",<br /> "10110010010",<br /> "10110110000",<br /> "10100110000",<br /> "10101100011",<br /> "10101100010",<br /> };<br /> int noteCount = sizeof(notes) / sizeof(notes[0]);</p> <p>void setup() {<br /> for (int i = BUTTON_MIN; i <= BUTTON_MAX; i++) {<br /> pinMode(i, INPUT_PULLUP);<br /> }<br /> MIDI.begin();<br /> }</p> <p>void loop() {<br /> char currentValue[] = "00000000000";<br /> int exist = 0;<br /> for (int i = BUTTON_MIN; i <= BUTTON_MAX; i++) {<br /> if (digitalRead(i) == LOW) {<br /> currentValue[i - BUTTON_MIN] = '1';<br /> exist = 1;<br /> } else {<br /> currentValue[i - BUTTON_MIN] = '0';<br /> }<br /> }</p> <p>if (exist == 1) {<br /> short breath = analogRead(BREATH);<br /> breath = abs(breath - BREATH_CUT);<br /> if (breath > MIN_BREATH) {<br /> for (int i = 0; i < noteCount; i++) {<br /> if (strcmp(currentValue, notes[i]) == 0) {</p> <h1 id="ifdef NO_VOLUME_CHANGE"><a href="#ifdef+NO_VOLUME_CHANGE">ifdef NO_VOLUME_CHANGE</a></h1> <pre><code> breath = 127; </code></pre> <h1 id="else"><a href="#else">else</a></h1> <pre><code> breath = map(breath, MIN_BREATH, 1023 - BREATH_CUT, 64, 127); </code></pre> <h1 id="endif"><a href="#endif">endif</a></h1> <pre><code> if (i != playing) { if (playing > -1) { MIDI.sendNoteOff(BASE_PITCH + playing, 0, 1); } playing = i; MIDI.sendNoteOn(BASE_PITCH + playing, breath, 1); currentVelocity = breath; } else { if (micros() - lastVelo > BREATH_DELAY) { if (breath > currentVelocity) { short plus = min(MAX_DIFF, breath - currentVelocity); if (plus + (short)currentVelocity > 127) { plus = 127 - currentVelocity; } currentVelocity += plus; MIDI.sendControlChange(7, currentVelocity, 1); } else if (breath &lt; currentVelocity) { short minus = min(MAX_DIFF, currentVelocity - breath); if (minus > currentVelocity) { minus = currentVelocity; } currentVelocity -= minus; MIDI.sendControlChange(7, currentVelocity, 1); } } } lastVelo = micros(); break; } } lastHigh = micros(); } else { if (micros() - lastHigh > BREATH_DELAY) { noteOff(); } } </code></pre> <p>} else {<br /> noteOff();<br /> }<br /> }</p> <p>void noteOff() {<br /> if (playing > -1) {<br /> MIDI.sendNoteOff(BASE_PITCH + playing, 0, 1);<br /> playing = -1;<br /> }<br /> }<br /> ||</p> <p>processing</p> <blockquote> <p>|c|<br /> import processing.serial.*;<br /> import themidibus.*; //Import the library</p> </blockquote> <p>MidiBus myBus; // The MidiBus<br /> Serial port;<br /> int[] val = new int[3];<br /> int valno = 0;<br /> int lastInput = 0;</p> <p>void setup() {<br /> size(400, 400);<br /> background(0);</p> <p>MidiBus.list(); // List all available Midi devices on STDOUT. This will show each device's index and name.<br /> myBus = new MidiBus(this, -1, "loopMIDI Port"); // Create a new MidiBus with no input device and the default Java Sound Synthesizer as the output device.<br /> String portName = Serial.list()[0];<br /> port=new Serial(this, portName, 31250);<br /> }</p> <p>void draw() {<br /> while (port.available() > 0) {<br /> int inByte = port.read();<br /> println(inByte);<br /> if (valno == 0) {<br /> if (inByte >= 128) {<br /> val[0] = inByte;<br /> valno++;<br /> } else if (lastInput > 0) {<br /> val[0] = lastInput;<br /> val[1] = inByte;<br /> valno += 2;<br /> }<br /> } else {<br /> val[valno++] = inByte;<br /> if (valno == 3) {<br /> valno = 0;<br /> if (val[0] == 128) {<br /> println(val);<br /> myBus.sendNoteOff(0, val[1], val[2]);<br /> lastInput = 0;<br /> } else if (val[0] == 144) {<br /> // println(val);<br /> setVolume(val[2]);<br /> myBus.sendNoteOn(0, val[1], /<em>val[2]</em>/127);<br /> lastInput = val[0];<br /> } else if (val[0] == 176) {<br /> setVolume(val[2]);<br /> // println(val);<br /> lastInput = val[0];<br /> }<br /> }<br /> }<br /> }<br /> }</p> <p>void setVolume(int velocity) {<br /> if (velocity < 64) {<br /> velocity = 64;<br /> }<br /> myBus.sendControllerChange(0, 7, velocity);<br /> }<br /> ||</p> <p>とりあえずボリュームはマックス固定にしている。<br /> 変動を試したい場合はNO_VOLUME_CHANGEをコメントアウト。<br /> 多少安定はしてきたが、あんまりいいかんじではない。<br /> ビブラートも上手くは再現できないので。</p> <p>このあとのASIO対応やファームウェア書き換えでまた<br /> 上手く動かなくなってつまづきそうだがとりあえず一段落。</p> だら@Crieit開発者 tag:crieit.net,2005:PublicArticle/14420 2014-03-14T09:00:00+09:00 2018-10-29T20:26:20+09:00 https://crieit.net/posts/arduino-midi arduinoでmidiコントローラ <p>arduinoを手に入れたので楽器を作りたくなった。<br /> サックスっぽいのを作りたい。<br /> 再生ソフトはMusic Studio Producerを選択。<br /> 色々と調べたところ、PC側に下記を導入すればできるとのこと。</p> <p>arduino<br /> →シリアルからMIDIに変換するソフト<br /> (serial_midi_converter V2D)<br /> →仮想MIDIケーブル<br /> (YOKE)<br /> →Music Studio Producer</p> <p>カッコ内はよく挙げられていたソフトだが、windows8だと? 全然動かなかった。<br /> serial_midi_converterはなんか動きがおかしい。<br /> 受信信号もエラーになってばかり。<br /> しかもボーレートが31250でなくわけわからない値なので嫌になった。<br /> processingでシリアル受信したら31250で普通に取得出来てるのに。</p> <p>ということでprocessingのMidiBusを使って自分で作ってみることにした。<br /> ところが仮想MIDIポート一覧を取得してもYOKEが出てこない。<br /> 同じくprocessingで作成されているserial_midi_converterでは出るのに。<br /> しかもserial_midi_converterのソースを使って試すとそっちでは出ない。</p> <p>色々悩んだ挙句、loopMIDIという仮想ケーブルに変えてみたところあっさり出来た。<br /> YOKEはwindows8の64bitだと上手く動かないのかもしれない。</p> <p>ということで最終的にこうなった。</p> <p>arduino<br /> →自作ソフトでシリアルからMIDIへ変換<br /> →loopMIDI<br /> →Music Studio Producer</p> <p>なんとかうまいことMusic Stuido Producerで音を鳴らすことが出来た。<br /> 久々にガッツリプログラムした気分。<br /> 一応書いたばかりの適当コードも載っけておく。</p> <p>arduinoのスケッチ</p> <blockquote> <p>|c|</p> </blockquote> <h1 id="include &lt;MIDI.h>"><a href="#include+%26lt%3BMIDI.h%3E">include <MIDI.h></a></h1> <p>char notes[] = {36, 38, 40, 41, 43, 45, 47, 48};</p> <p>void setup()<br /> {<br /> MIDI.begin();<br /> }</p> <p>void loop()<br /> {<br /> for (int i = 0; i < 8; i++) {<br /> MIDI.sendNoteOn(notes[i],127,1);<br /> delay(1000);<br /> MIDI.sendNoteOff(notes[i],0,1);<br /> delay(1000);<br /> }<br /> }<br /> ||</p> <p>processingのスケッチ</p> <blockquote> <p>|java|<br /> import processing.serial.*;<br /> import themidibus.*;</p> </blockquote> <p>MidiBus myBus;<br /> Serial port;<br /> int[] val = new int[3];<br /> int valno = 0;</p> <p>void setup() {<br /> size(400, 400);<br /> background(0);</p> <p>MidiBus.list();<br /> myBus = new MidiBus(this, -1, "loopMIDI Port");<br /> String portName = Serial.list()[0];<br /> port=new Serial(this, portName, 31250);<br /> }</p> <p>void draw() {<br /> while (port.available() > 0) {<br /> int inByte = port.read();<br /> if (valno == 0) {<br /> if (inByte >= 128) {<br /> val[0] = inByte;<br /> valno++;<br /> }<br /> } else {<br /> val[valno++] = inByte;<br /> if (valno == 3) {<br /> valno = 0;<br /> if (val[0] == 128) {<br /> println(val);<br /> myBus.sendNoteOff(0, val[1], val[2]);<br /> } else if (val[0] == 144) {<br /> println(val);<br /> myBus.sendNoteOn(0, val[1], val[2]);<br /> }<br /> }<br /> }<br /> }<br /> }<br /> ||</p> だら@Crieit開発者