自作楽器用音源モジュール作成(3)
Wifi経由でのMIDI受信に使う目的で、ESP-WROOM-02にGETリクエストを投げつけてデータをやり取りできるか検証した。
ESP8266関連のライブラリの使い方は大体Githubを眺めた。
サンプルにはWifiAccessPointという名前のWifiを飛ばしてルートにアクセスされたらテキストを返すサンプルがある。
これにGETリクエスト関連の処理を足すだけでいい。非常に良く出来ている。
String arg(const char* name); // get request argument value by name String arg(int i); // get request argument value by number String argName(int i); // get request argument name by number int args(); // get arguments count bool hasArg(const char* name); // check if argument exists
esp8266-Arduino/ESP8266WebServer.h at master · sandeepmistry/esp8266-Arduino · GitHub
なんでもいいから値を列挙すればいいならargsの回数でarg(int i)を舐めれば良さそうだ。
パラメータ名が必要ならhasArgしてからarg(const char* name)といったところだと思う。
コード
#include <ESP8266WiFi.h> #include <WiFiClient.h> #include <ESP8266WebServer.h> /* Set these to your desired credentials. */ const char *ssid = "mySSID"; const char *password = "password"; ESP8266WebServer server(80); /* Just a little test message. Go to http://192.168.4.1 in a web browser * connected to this access point to see it. */ void handleRoot() { uint8_t argc = server.args(); for(uint8_t i = 0 ; i < argc ; ++i){ Serial.println(server.arg(i)); } server.send(200, "text/html", "<h1>You are connected</h1>"); } void setup() { delay(1000); Serial.begin(115200); Serial.println(); Serial.print("Configuring access point..."); WiFi.softAP(ssid, password); IPAddress myIP = WiFi.softAPIP(); Serial.print("AP IP address: "); Serial.println(myIP); server.on("/", handleRoot); server.begin(); Serial.println("HTTP server started"); } void loop() { server.handleClient(); }
自作楽器用音源モジュール作成(2)
音色やらその他については今回の設計においては後回しなので、受け取ったMIDIデータをVS1053bのリアルタイムMIDIモードに投げつけて鳴らすことにする。
VS1053bに関して
VS1053bに電源供給。Real-Time MIDIで起動するには
GPIO0=LOW
GPIO1=HIGH
とデータシート57ページに記載がある。
https://www.sparkfun.com/datasheets/Components/SMD/vs1053.pdf
PSoCに関して
基板のピン都合上、SCBは使わない方向で行く。
BAUDRATEの設定がComboBoxに31.25kHzが無いと思ったら外部クロックで駆動させればいける。(ExternalClock / Oversampling rate [Hz]になる)
あとはプログラムだがひとまず鳴らすように書いた。
#include <project.h> int main() { uint8_t i,j; uint8_t midiData[3] = {0x90, 0x70, 0x7f}; CyGlobalIntEnable; UART_VS1053b_Start(); LCD_Char_1_Start(); LCD_Char_1_Position(0,0); LCD_Char_1_PrintString("CTRL NOTE"); for(i = 0 ;; ++i) { for(j = 0 ; j < 0x7f ; ++j){ /* LCD */ LCD_Char_1_Position(1,0); LCD_Char_1_PrintNumber(j); /* Cn:Program Change */ midiData[0] = 0xc0; midiData[1] = j; UART_VS1053b_PutArray(midiData, 2); for(i = 0x40 ; i < 0x50 ; ++i){ /* LCD */ LCD_Char_1_Position(1,5); LCD_Char_1_PrintNumber(i); /* 9n:Note On */ midiData[0] = 0x90; midiData[1] = i; midiData[2] = 0x3f; UART_VS1053b_PutArray(midiData, 3); CyDelay(200); /* 8n:Note Off*/ midiData[0] = 0x80; midiData[2] = 0x0; UART_VS1053b_PutArray(midiData, 3); } } } }
動作
適当なイヤフォンを繋いで動作が確認できた、そろそろ箱の方も考えたい。
自作楽器用音源モジュール作成(1)
自作楽器から音を出そうにも、楽器本体で音声合成するかMIDIで吐き出してMIDI音源に繋ぐかいくつか選択肢がある。
いざ展示した時とかを想定した場合、複数の楽器を一つのデバイスから鳴らせれば効率がいいだろうということで作成することにした。
詳細設計は詰めれていないが、MIDI端子に加えてBLEなりWifi経由でも入力できるようになれば配線も減ってGoodである。
基板準備
手持ちの部品でキャラクタLCD、ボタン、ロータリエンコーダとPSoC基板とCY8C4245AXI-483があったのではんだづけしてLCD点灯までやった。
元は24chのCapSenseボタン+LED用に用意した基板
LCD駆動
Character_LCDモジュール一つを配置してコードを書く。
#include <project.h> int main() { uint16_t i; CyGlobalIntEnable; /* Enable global interrupts. */ /* Place your initialization/startup code here (e.g. MyInst_Start()) */ LCD_Char_1_Start(); LCD_Char_1_Position(0,0); LCD_Char_1_PrintString("Hello PSoC"); for(i = 0 ;; ++i) { /* Place your application code here. */ LCD_Char_1_Position(1,0); LCD_Char_1_PrintNumber(i); CyDelay(1); } }
ピン配置はマニュアルに記載あり。