自作楽器用音源モジュール作成(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();
}

動作

f:id:tohkaf:20151208004925p:plain

f:id:tohkaf:20151208004940p:plain

スマホWifi参加させて適当に与えてみたが問題はなさそうだ。今日はここまで。

自作楽器用音源モジュール作成(2)

音色やらその他については今回の設計においては後回しなので、受け取ったMIDIデータをVS1053bのリアルタイムMIDIモードに投げつけて鳴らすことにする。

VS1053bに関して

VS1053bに電源供給。Real-Time MIDIで起動するには
GPIO0=LOW
GPIO1=HIGH
とデータシート57ページに記載がある。
f:id:tohkaf:20151207000017p:plain
https://www.sparkfun.com/datasheets/Components/SMD/vs1053.pdf

PSoCに関して

f:id:tohkaf:20151206235236p:plain

基板のピン都合上、SCBは使わない方向で行く。

BAUDRATEの設定がComboBoxに31.25kHzが無いと思ったら外部クロックで駆動させればいける。(ExternalClock / Oversampling rate [Hz]になる)

f:id:tohkaf:20151206235502p:plain


f:id:tohkaf:20151206235511p:plain


あとはプログラムだがひとまず鳴らすように書いた。

#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);

            }        
        }
    }
}

動作

f:id:tohkaf:20151207000233j:plain

適当なイヤフォンを繋いで動作が確認できた、そろそろ箱の方も考えたい。

自作楽器用音源モジュール作成(1)

自作楽器から音を出そうにも、楽器本体で音声合成するかMIDIで吐き出してMIDI音源に繋ぐかいくつか選択肢がある。


いざ展示した時とかを想定した場合、複数の楽器を一つのデバイスから鳴らせれば効率がいいだろうということで作成することにした。


詳細設計は詰めれていないが、MIDI端子に加えてBLEなりWifi経由でも入力できるようになれば配線も減ってGoodである。

概要

f:id:tohkaf:20151204001606j:plain


最小構成の落書き。PSoCにうまいことMIDIを捌かせる。

無線化はPSoC 4 BLEかESP-WROOM-02あたりが有力

基板準備

手持ちの部品でキャラクタLCD、ボタン、ロータリエンコーダPSoC基板とCY8C4245AXI-483があったのではんだづけしてLCD点灯までやった。


f:id:tohkaf:20151204002100j:plain

元は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);
    }
}


f:id:tohkaf:20151204002443p:plain

ピン配置はマニュアルに記載あり。

f:id:tohkaf:20151204002510p:plain

動いた

f:id:tohkaf:20151204002155j:plain

次は音を鳴らす部分とLCD, Button等ハード周りを片付ける。