基板を作った
ここしばらくウィンドシンセ2号機を作っていた。ようやく基板だけできた。初めてポリウレタン線を使ってみた。被膜を溶かすのは結構難しい。
使った部品は右から順に
- RGB OLEDモジュール(秋月)
- ESP32 DevkitC 32E(秋月)
- I2S ステレオDAC(SwitchScience)
- MPR121 静電容量センサ(SwitchScience)
- GY-521 加速度ジャイロセンサ(amazon)
2号機にはディスプレイを組み込みたかった。途中まで手元にあったM5Stackを使っていたのだけれど、少しケースからはみ出るので断念した。代わりに秋月のOLEDディスプレイを使った。コントローラはSSD1331。LovyanGFXが対応していたので、ありがたく使わせていただく。ものすごい簡単に表示できる素晴らしいライブラリ。寿限無寿限無。
ESP32とステレオDACは1号機と同様I2Sで接続した。ところが今回はなぜか盛大にノイズが聴こえる。金属?の机の上に置いたり線を指で触れたりするとノイズは消える。ブレッドボードで仮組したときは普通に聞こえたのに何かおかしい。調べてみると、高周波では平行に配線するとノイズが発生するとのことだった。クロストークと言うらしい。
I2SのBCLK線をつなぐのに3本のフラットケーブルを使ってみた(GND・BCLK・GND)。これで解決した。2本でもよかったかも。ディジタル回路だから接続すれば動く、というわけではないことがよく分かった。プリント基板を発注する前に覚えることがいっぱいありそうだ。 …1号機が動いていたのは偶然?
このあとはブレスセンサとアンプとスピーカーをつないで筐体に組み込む予定。謎なトラブルが起きませんように。
NimBLE + BLE MIDIで音を出した
今回の実験
M5Stackで次を調べてみた。
1つ目は処理能力の調査。esp32ではcore0とcore1でマルチタスクができる。「無線関連の処理はcore0で行うので、core0には大きな負荷をかけられない」等の記述をよく見るが、どの程度の負荷だとまずいのかがよくわからなかった。今回はFs=44100HzでFreeverb※を動かし、かつ、I2S出力したときにノイズが乗ったりしないかを調べてみた。
2つ目はキューの調査。波形作成とリバーブを別のcoreで実行したときに聴覚的?な遅延が起きないかどうかを調べてみた。
どちらも特に問題なさそうだった。
※これまでの工作で、1つのcoreでYM2414エミュレータで8ch出音させながらステレオFreeverbをかけると処理が間に合わないことが判明している(Fs=44100Hzでノイズが乗ってしまう)。音声合成とリバーブを分けることはできるか?ついでにBLE MIDIで音色エディットしたいなできるかな?というのが今回の実験の動機。
機材
M5Stackとuda1334a I2SステレオDACモジュールを使う。M5StackのM-BUSとブレッドボードをピンヘッダでつないで固定した。アンプにはつないでない。
M5Stack | uda1334a | |
---|---|---|
G13 | → | BCLK |
G5 | → | WSEL |
G17 | → | DIN |
3.3V | → | VIN |
GND | → | GND |
プログラムの動作
- core1で正弦波・矩形波・鋸歯状波を作成して、キューでcore0のタスクに送る。ボタンを押して波形を選択する。押すたびに周波数が高くなる。
- core1では125msおきにMIDIのnoteOn/Offを繰り返している。Windows10上のLMMSとiPad上のKORG iM1で音が出るのを確認できた。
- core0ではFreeverbでリバーブをかけてI2Sで出力する。
- core0ではNimBLEでBLE MIDI通信をしている(はず)。
BLE MIDIのレイテンシ
BLE MIDIには特有の遅延があるらしい。この記事の実験ではesp32+NimBLEで概ね40msの遅延があることがわかる。 pointofviewpoint.linclip.com
「40ms」というと短い時間で問題なさげに感じたのだが、1秒間に等間隔に4回noteOn/Offするような演奏だと結構な影響がある。今回の実験でも(詳細に計測はしていないが)ぎこちないというか不ぞろいな音がPCからもiPadからも聴こえてくる。
原因はBLEの送信間隔にあるらしく解決方法はこれを短くすることにあるらしい。次の記事では解決方法を提示している。 www.reddit.com
今回利用したライブラリにも適用できないか調べてみた。プロジェクトフォルダ/.pio/libdeps/m5stack-core-esp32/BLE-MIDI/src/hardware/BLEMIDI_ESP32_NimBLE.hの中に、接続時にコールバックされるMyServerCallbacksというクラスがある。これを次のように変更してみた。
/* コメントアウトする void onConnect(BLEServer *) { if (_bluetoothEsp32) _bluetoothEsp32->connected(); }; */ // これを追加する void onConnect(BLEServer *pServer, ble_gap_conn_desc* desc) { if (_bluetoothEsp32) _bluetoothEsp32->connected(); pServer->updateConnParams(desc->conn_handle, 6, 8, 0, 400); }
ずいぶんマシになった。
その他
- Windows10にはKORG BLE-MIDE Driverをインストールしている。無いと接続できないかどうかは試していない。
- Windows10の設定→デバイス→Bluetoothまたはその他のデバイスを追加する→Bluetoothで接続する。「接続済み」になってしばらくすると「ペアリング済み」になってしまうが、LMMSでMIDI入力を有効にしていれば「接続済み」のままになる。
- iPadと接続する方法:設定→Bluetoothからつなぐのではなく、iM1のSETTINGSからつなぐ(知らなかった)。
プログラム
platformio.ini
[env:m5stack-core-esp32] platform = espressif32 board = m5stack-core-esp32 framework = arduino lib_deps = lathoub/BLE-MIDI@^2.2 m5stack/M5Stack@^0.3.9 monitor_speed = 115200
main.cpp
#include <Arduino.h> #include <M5Stack.h> #include <BLEMIDI_Transport.h> #include <hardware/BLEMIDI_ESP32_NimBLE.h> #include <driver/i2s.h> #include <FreeRTOS.h> // Freeverb使うなら有効にする //#define USE_FREEVERB #define SAMPLE_RATE (44100) #define FRAMES_PER_BUFFER (64) #define VOLMIN (1/32768.0f) BLEMIDI_CREATE_DEFAULT_INSTANCE() unsigned long t0 = millis(); bool isConnected = false; QueueHandle_t queue; volatile int doReverb = false; #ifdef USE_FREEVERB #include "revmodel.hpp" revmodel *freeverb; #endif /* core0で動かすタスク */ void playbuf(void *param) { int16_t* i2sBuf = (int16_t*)malloc(FRAMES_PER_BUFFER * sizeof(int16_t) *2); // 右+左で *2 int count = 0; size_t written; float revInput1[FRAMES_PER_BUFFER], revInput2[FRAMES_PER_BUFFER]; float revOutput1[FRAMES_PER_BUFFER], revOutput2[FRAMES_PER_BUFFER]; float *input1, *input2; int buf[FRAMES_PER_BUFFER]; #ifdef USE_FREEVERB freeverb = new revmodel(); #endif while (1) { xQueueReceive(queue, buf, 10); #ifdef USE_FREEVERB if (doReverb) { input1 = revInput1; input2 = revInput2; for (int i=0; i<FRAMES_PER_BUFFER; i++) { *input1++ = *input2++ = buf[i] * VOLMIN; } freeverb->processreplace(revInput1, revInput2, revOutput1, revOutput2, FRAMES_PER_BUFFER, 1); for (int i=0; i<FRAMES_PER_BUFFER; i++) { i2sBuf[i*2] = revOutput1[i] * 32767; // 左 i2sBuf[i*2+1] = revOutput2[i] * 32767; // 右 } } else { #endif for (int i=0; i<FRAMES_PER_BUFFER; i++) { i2sBuf[i*2] = i2sBuf[i*2+1] = buf[i]; } #ifdef USE_FREEVERB } #endif i2s_write((i2s_port_t)0, (const void *)i2sBuf, (size_t)(FRAMES_PER_BUFFER*4), &written, 1000); if ((++count & 0x3ff) == 0) { vTaskDelay(1); // 必要? } } } void setup() { Serial.begin(115200); M5.begin(); M5.Power.begin(); //Init Power module. MIDI.begin(); BLEMIDI.setHandleConnected([]() { isConnected = true; }); BLEMIDI.setHandleDisconnected([]() { isConnected = false; }); MIDI.setHandleNoteOn([](byte channel, byte note, byte velocity) { }); MIDI.setHandleNoteOff([](byte channel, byte note, byte velocity) { }); i2s_config_t i2s_config = { .mode = (i2s_mode_t)(I2S_MODE_MASTER | I2S_MODE_TX), .sample_rate = SAMPLE_RATE, .bits_per_sample = I2S_BITS_PER_SAMPLE_16BIT, .channel_format = I2S_CHANNEL_FMT_RIGHT_LEFT, .communication_format = (i2s_comm_format_t)(I2S_COMM_FORMAT_I2S | I2S_COMM_FORMAT_I2S_MSB), .intr_alloc_flags = 0, .dma_buf_count = 4, .dma_buf_len = 64 }; i2s_pin_config_t pin_config = { .bck_io_num = 13, // BCLK .ws_io_num = 5, // WSEL .data_out_num = 17, // DIN .data_in_num = -1 // Not used }; i2s_driver_install((i2s_port_t)0, &i2s_config, 0, NULL); i2s_set_pin((i2s_port_t)0, &pin_config); i2s_set_clk((i2s_port_t)0, SAMPLE_RATE, (i2s_bits_per_sample_t)16, (i2s_channel_t)2); queue = xQueueCreate(2, 4*64); xTaskCreatePinnedToCore(playbuf, "Task0", 4096, NULL, 1, NULL, 0); } int on = 0; int count = 0; void loop() { size_t written; int16_t* i2sBuf = (int16_t*)malloc(FRAMES_PER_BUFFER * sizeof(int16_t) *2); // 右+左で *2 int sendbuf[FRAMES_PER_BUFFER]; int wave = 0; float phase = 0; float step0 = (float)(TWO_PI / 200); float step = step0; float rate = 1.06; float vol = 500; int lastt0; while (true) { int pressed = false; M5.update(); if (M5.BtnA.wasPressed()) { wave = 0; pressed = true; } else if (M5.BtnB.wasPressed()) { wave = 1; pressed = true; } else if (M5.BtnC.wasPressed()) { wave = 2; pressed = true; } if (pressed) { step *= rate; if (step > step0 * 4) step = step0; doReverb = doReverb ? false : true; } for (int i=0; i<FRAMES_PER_BUFFER; i++) { switch (wave) { case 0: sendbuf[i] = (int16_t)(vol * sin(phase)); break; case 1: sendbuf[i] = phase < PI ? -vol : vol; break; case 2: sendbuf[i] = vol * 2 * phase / TWO_PI - vol; break; } phase += step; if (phase >= TWO_PI) phase -= TWO_PI; vol *= 0.9998; if (vol < 10) vol = 500; } xQueueSend(queue, sendbuf, (TickType_t)10); if ((++count & 0x3ff) == 0) { vTaskDelay(1); // 必要? } MIDI.read(); if (isConnected && (millis() - t0) >= 125) { t0 = millis(); if (on) { MIDI.sendNoteOn(84, 100, 1); // note 84, velocity 100 on channel 1 on = 0; Serial.printf("connect: %d\n", t0 - lastt0); lastt0 = t0; } else { MIDI.sendNoteOff(84, 0, 1); // note 84, velocity 100 on channel 1 on = 1; } } } }
BLE MIDIライブラリを使ってみた
以前BLE MIDIの記事を書いたのだけどVSCodeでは試していなかった。改めて、VSCode + PlatformIO + M5StackでBLE MIDIを使えるようにする方法を調べてみた。
※マザーボード上のBluetoothを使って実験したのだが同梱されていたWi-Fiアンテナを付けないと、Bluetoothまで接続不可能だったり不安定になったりする(付けたら解決した)
※PIO HomeのタブはVSCodeの左端の縦に並んでいるPIOアイコン→QUICK ACCESS→PIO HOME→Openで開くことができる
(1)プロジェクトの作成
PIO Homeの「New Project」で新しいプロジェクトを作る。
- Name : BLE test
- Board : M5Stack Core ESP32
- Framework : Arduino
BLE testというフォルダが作成され、その中に.pioとかlibとかsrcとかいろいろフォルダが作成される。
(2)標準?のライブラリを使う
BLE MIDIにはいくつかのライブラリが選択できる。まずは何も設定しないでも使える次のライブラリを試す。これを使ってるのかな?以前使ったものと同じ。
github.com
BLE_MIDI.inoをコピーしてプロジェクトBLE test/src/main.cppにペーストするだけで使える。ただし#include <Arduino.h>を追加する必要あり。ビルドしてM5StackにUploadする。書き込みサイズは979872 bytes。
(3)Windows10との接続
メニュー→設定→Bluetoothまたはその他のデバイスを追加する→Bluetoothを押す。サンプルコードに書いてある通り「ESP32 MIDI Example」として発見できる。事前にKORG BLE-MIDI Driverをインストールしておいた。
ここまでの作業で、0.5秒おきに真ん中のドを鳴らし続けるBLE MIDIデバイスになる。例えばLMMSを起動して最初に表示されるTripleOscillatorを鳴らすことができる。
(4)ESP32-BLE-MIDIライブラリ
別のBLE MIDIライブラリを使ってみる。noteOn()とかsetPitchBendCallback()とか便利な関数が用意されている。
github.com
BLE test2というプロジェクトを新たに作ってPIO Homeの左端の縦に並んでいるLibrariesアイコンをクリックする。「BLE MIDI」で検索。いくつか表示される。「ESP32-BLE-MIDI by Maxime ANDRE」をクリックしてAdd to Project→Select a projectに「BLE test2」。Addするとプロジェクトにライブラリが追加される。具体的には
- platformio.iniに「lib_deps = max22/ESP32-BLE-MIDI@^0.2.2」が追記される
- BLE test2\.pio\libdeps\m5stack-core-esp32\ESP32-BLE-MIDI\にライブラリがダウンロードされる
Arduino IDEと違い、ライブラリはプロジェクトごとに管理されるらしい。lib_deps = ...を記述するだけでもOKらしい。
サンプルコードはgithubにもあるしVSCodeのライブラリのページ内にもある。01-Basic-Midi-DeviceのコードをBLE test2/src/main.cppに張り付けてビルド&アップロードする。1秒おきに真ん中のラを鳴らし続けるMIDIデバイスになる。書き込みサイズは980672 bytes。
(5)BLE-MIDIライブラリ
もう一つのライブラリを使ってみる。プロジェクトにaddすると、一緒にArduinoBLE・MIDI Library・NimBLE-Arduinoライブラリがaddされる。
github.com
サンプルコードのうちMidiBle.inoをビルドしてみる。#includeを変更。hardware/BLEMIDI_ESP32_NimBLE.hを生かして、
hardware/BLEMIDI_ESP32.hの行をコメントアウトする。ESP32-NimBLE-MIDIという名前で発見できる。真ん中のドを鳴らし続けるMIDIデバイスになる。書き込みサイズは560352 bytes。小さい。
(6)まとめ
最後に試したライブラリを使ってみよう。小さいので。
バイトセンサを作った
ピッチベンドを口でするために作った。まだ音を出していないが、シリアルプロッタの出力を見るといい感じで変化している。
バイトセンサ(リップセンサ)については色々制作事例がある。この記事ではEWIのマウスピースに圧力センサを埋め込んでいる。「大改造③」で利用しているFSR400という圧力センサがよさそう。
ameblo.jp
こちらも圧力センサを使っているみたい。テープ?で固定している。
リップセンサーつけてみた。
— otoone_dev (@OtooneDev) 2021年7月24日
スイッチサイエンスさんで買った台湾アルファ社の感圧センサー。
WX5のリップセンサーは細かい角度変化のセンサーなのに対して、感圧はちょっと感覚が違う。やっぱ WX5 は良くできてるなと思いました。#感圧センサー #AFUUE #ウインドシンセ pic.twitter.com/ctZISvyRxq
というわけで、センサには秋月で購入しておいた圧力センサFSR400を、マウスピース?にはビックカメラで売ってた配線カバーを使うことにした。製造元はマサル工業だった。ボディのエムケーダクトでもお世話になっています。
配線カバーはカッターで切れる。材質はEVA。側面を斜めに切って、平らな面にセンサを設置する。センサ部分は水に弱いらしいので防水のためテープで覆う。最初は赤い絶縁テープを上に貼っていたが、歯で噛んでも(指の腹で押すよりも)反応が薄い。もう少し厚みのあるスポンジタイプのテープを貼ったら、均等に圧力がかかるのか綺麗にグラフが変化した。
平らな部分を歯で噛むと、噛んだ分だけ動いてベンド量の調整がしやすい気がする。謎なのは噛まない状態でもセンサ値が0にならないこと。テープの貼り付け圧力?なのか、板が曲がっているのを検出しているのか不明。噛み続けると大きな値になり、放置しておくと小さな値になる。板に曲がり癖?がつくのかしら。
久しぶりの作業のときに、以前の記事を見返すと色々思い出せて便利だった。こまめに記事を書こう。
年が明けた
そろそろウィンドシンセの自作を再開したくなってきた。気になっていたので改めてMAME周辺のYM2151エミュレータの実装について調べてみた。※間違えているかもしれない
現在のMAMEプロジェクトでは、Aaron Giles氏の実装したYMFMが使われている。一方でVGMPlayでは、nukeykt?氏の実装したNuked OPMが使われているらしい。
Nuked OPM has been merged to the VGMPlay git repository. YM2151 emulation is much improved and should now match the real chip as closely as possible. Please let us know if you find any issues. (e.g. broken VGM files) https://t.co/ewkEJGZyjg cc @vgmrips @nukeykt
— Ian Karlsson (@SuperCTR) 2020年10月19日
YMFMのREADME.mdからは、エミュレーションの厳密性よりコードの理解のしやすさに重きを置いており、「100% digital accuracy」を求めるならNuked OPMを使えと示唆されているように見える。Nuked OPMのREADME.mdには「Cycle accurate YM2151 emulator」と書いてある。コードを精読していないのだが、違いはその辺にあると思われる。
ウィンドシンセの音源用に作ってきたYM2414エミュレータはVGMPlayのym2151.cをベースにしているが今後は変えることも考えたほうがいいのかも。
- ym2151.cよりも精度の高いエミューレーションをしているなら、Nuked OPMを拡張してYM2414エミュレータを作る
- でも、YMFMのエミュレーション精度が上がるのなら、それをそのまま使うのが楽だよなぁとも思う。
…書いているうちに、これは後回しにすべき問題のように思えてきた。今年の目標は次の2つにする:
- バイトセンサ:歯で噛むセンサでピッチベンドを実現する
- 本体のみで音色選択:OLEDを搭載するか、いっそM5Stackに置き換えるか
YM2151のエミュレーションについては以下のサイトもためになる。
cygx.mydns.jp
アルトヴェノーヴァを手に入れた
ESP32によるWT11エミュレーションの実装は概ね終了した。実機と比較しても何となく同じような音が出ているような気がする。
FM音源的?な音色を聴いているうちに、だんだんと物理モデリング音源を鳴らしたくなってきた。STKの実装を見ていると、それほど難しくはなさそう。クラリネットとかサックスぽい音が出るみたい。
ところがパラメータを見ると、リードの固さとか息の強さとか、本物の吹奏楽器を触らないとよく理解できないものがあって実際のところが知りたくなった。特にリードの付いた楽器に興味が出てきた。リードの噛み方?によって音階が出るとか意味が分からない???
というわけでヤマハのアルトヴェノーヴァを購入してみた。思っていた以上に息を強く吹く必要があったり、リードがぶるぶる震えてたり、発見がある。まだまだ自由に音を出せる状態ではない。しばらく練習してみて、自作ウィンドシンセに反映できるといいと思う。
WT11が発声するボイスについて調べた
ウィンドシンセ用音源 Yamaha WT11はTX81Zと互換性がある。ただしWT11はTX81Zでいうパフォーマンスモードで動作する。音色の選択は96個あるパフォーマンスから1つを選択することで行う。1つのパフォーマンスは1つ以上のボイスから構成される。つまりMIDIのnote onを1つ受け取ると、複数のボイスを同時発声する。ボイスはTX81Zでいうシングルモードの音色に相当する。
A01~C32のパフォーマンスそれぞれが発生するボイスを以下に示す。ボイス番号(A01~D32)に続く「_数字」は、このボイスを割り当てたYM2414のチャンネル数を表す(1~8)。たとえば「A01 Oboe 1」なら、ch1~ch4にA01のボイスが、ch5~ch8にA02のボイスがセットされており、note onを受け取るたびにch1+ch5→ch2+ch6→ch3+ch7→ch4+ch8→ch1+ch5→...のように発声する。
Performance : Voices A01 Oboe 1 : A01_4 A02_4 A02 Oboe 2 : A03_4 A02_4 A03 Bassoon : A04_8 A04 Clarinet : A05_4 A26_4 A05 Piccolo : A08_8 A06 Flute : A06_4 A07_4 A07 PanFlute : A14_4 A14_4 A08 PuffPanFlt: A15_4 A16_1 A32_3 A09 SopranoSax: A12_3 A25_3 A27_2 A10 TenorSax 1: A10_2 A11_3 A26_3 A11 TenorSax 2: A10_2 A25_3 A26_3 A12 BaritonSax: A10_4 A09_4 A13 Recorder : A13_8 A14 Ocarina : A19_8 A15 Shakuhachi: A17_4 A18_4 A16 ClearWinds: A20_4 A20_4 A17 WoodWinds : A02_4 A04_4 A18 Picc/Clar : A05_4 A06_4 A19 PowerWood : A21_4 A21_4 A20 HolloWood : A22_8 A21 HardWood : A24_8 A22 ReedWinds : A03_4 A05_4 A23 SilverWind: A08_4 A13_4 A24 FatReed 1 : A23_4 A30_4 A25 FatReed 2 : A26_4 A30_4 A26 FluteEns. : A29_3 A29_3 A07_2 A27 Flute 5ths: A06_4 A06_4 A28 SaxSect.1 : A26_2 A25_2 A29 SaxSect.2 : A12_3 A26_3 A09_2 A30 Chime/Oboe: A02_4 A31_4 A31 BassoonDuo: A04_4 A04_4 A32 Mammoth ! : A04_3 A26_3 A31_1 A31_1 B01 Trumpet 1 : B26_4 B13_4 B02 Trumpet 2 : B02_4 B12_4 B03 MutedTrp. : B03_3 B03_2 B04_2 B01_1 B04 Flugel 1 : B18_4 B12_4 B05 Flugel 2 : B04_4 B04_4 B06 Trombone : B05_8 B07 FrenchHorn: B06_4 B06_4 B08 Tuba : B07_8 B09 BrassEns. : B05_3 B07_3 B05_2 B10 FusionBrs : B02_3 B05_3 B02_2 B11 HardPopBrs: B31_2 B05_2 B31_2 B13_2 B12 HvyPopBrs : B32_3 B05_3 B13_2 B13 ClassicBrs: B13_3 B04_3 B05_2 B14 ClassicHrn: B04_4 B06_4 B15 OrchHorns : B06_3 B06_3 B04_2 B16 MuteBrass : B05_3 B03_3 B03_2 B17 TuttiBrass: B13_1 B13_1 B05_1 B05_1 B13_1 B13_1 B07_1 B07_1 B18 HarmoSynth: B10_4 B10_4 B19 SmoothBrs : B11_4 B11_4 B20 DualSynth : B14_4 B14_4 B21 LyriSynth : B15_4 B15_4 B22 MelloSynth: B16_4 B16_4 B23 BuzzySynth: B17_4 B17_4 B24 SharpSynth: B20_4 B20_4 B25 SolidSynth: B21_4 B21_4 B26 SwampSynth: B09_4 B09_4 B27 SandyBrass: B25_4 B25_4 B28 AttackSyn.: B27_4 B08_4 B29 SynthBrs 1: B28_4 B10_4 B30 SynthBrs 2: B29_4 B28_4 B31 SynthBrs 3: B08_4 B08_4 B32 SynthOrch : B23_3 B24_3 B15_2 C01 Harmonica1: C01_8 C02 Harmonica2: C02_8 C03 Concertina: C03_4 C03_4 C04 Bandonion : C04_4 C04_4 C05 Accordion : C05_4 C05_4 C06 Violin : C19_4 C20_4 C07 Cello : D03_4 D04_4 C08 Strings : D06_3 D06_3 D06_2 C09 DualString: D06_3 D06_3 D06_2 C10 DistGuitar: C06_4 C07_4 C11 A.Guitar : C16_4 C17_4 C12 Fretless : C13_4 C13_4 C13 UpriteBass: C14_4 C15_4 C14 PipeOrgan : C29_4 C29_4 C15 Choir : D01_4 D01_4 C16 Whistle : C22_3 C22_3 C22_2 C17 Bells : C31_3 C31_3 C31_2 C18 GuitarSyn : C08_4 C08_4 C19 PortaLead : C18_4 C18_4 C20 Clavidion1: C09_4 C09_4 C21 Clavidion2: C10_4 C10_4 C22 SynthLead : C28_3 C28_3 C28_2 C23 FuzzySax : C11_4 C12_4 C24 Fuzz 5ths : C24_4 C24_4 C25 BreathHit : C25_4 C26_1 C26_1 C26_1 C26_1 C26 Breath 5th: C25_4 C25_1 C25_1 C25_1 C25_1 C27 TalkingBox: C30_3 C30_3 C30_2 C28 HarmoWhist: D07_3 D08_3 D08_2 C29 SpaceDust : D02_3 D05_3 D02_2 C30 Str/Flute : D16_2 D16_2 D16_2 D09_2 C31 Str/Oboe : D16_2 D16_2 D16_2 D15_2 C32 FreeJazz : D11_4 D12_4
Voice [Performances] A01 [A01_Oboe 1 ] A02 [A01_Oboe 1 , A02_Oboe 2 , A17_WoodWinds , A30_Chime/Oboe] A03 [A02_Oboe 2 , A22_ReedWinds ] A04 [A03_Bassoon , A17_WoodWinds , A31_BassoonDuo, A31_BassoonDuo, A32_Mammoth ! ] A05 [A04_Clarinet , A18_Picc/Clar , A22_ReedWinds ] A06 [A06_Flute , A18_Picc/Clar , A27_Flute 5ths, A27_Flute 5ths] A07 m[A06_Flute , A26_FluteEns. ] A08 [A05_Piccolo , A23_SilverWind] A09 [A12_BaritonSax, A29_SaxSect.2 ] A10 0m[A10_TenorSax 1, A11_TenorSax 2, A12_BaritonSax] A11 [A10_TenorSax 1] A12 [A09_SopranoSax, A29_SaxSect.2 ] A13 [A13_Recorder , A23_SilverWind] A14 [A07_PanFlute , A07_PanFlute ] A15 [A08_PuffPanFlt] A16 m[A08_PuffPanFlt] A17 [A15_Shakuhachi] A18 [A15_Shakuhachi] A19 [A14_Ocarina ] A20 [A16_ClearWinds, A16_ClearWinds] A21 [A19_PowerWood , A19_PowerWood ] A22 [A20_HolloWood ] A23 [A24_FatReed 1 ] A24 [A21_HardWood ] A25 [A09_SopranoSax, A11_TenorSax 2, A28_SaxSect.1 ] A26 [A04_Clarinet , A10_TenorSax 1, A11_TenorSax 2, A25_FatReed 2 , A28_SaxSect.1 , A29_SaxSect.2 , A32_Mammoth ! ] A27 m[A09_SopranoSax] A28 [] A29 [A26_FluteEns. , A26_FluteEns. ] A30 [A24_FatReed 1 , A25_FatReed 2 ] A31 m[A30_Chime/Oboe, A32_Mammoth ! , A32_Mammoth ! ] A32 [A08_PuffPanFlt] B01 m[B03_MutedTrp. ] B02 [B02_Trumpet 2 , B10_FusionBrs , B10_FusionBrs ] B03 [B03_MutedTrp. , B03_MutedTrp. , B16_MuteBrass , B16_MuteBrass ] B04 [B03_MutedTrp. , B05_Flugel 2 , B05_Flugel 2 , B13_ClassicBrs, B14_ClassicHrn, B15_OrchHorns ] B05 [B06_Trombone , B09_BrassEns. , B09_BrassEns. , B10_FusionBrs , B11_HardPopBrs, B12_HvyPopBrs , B13_ClassicBrs, B16_MuteBrass , B17_TuttiBrass, B17_TuttiBrass] B06 [B07_FrenchHorn, B07_FrenchHorn, B14_ClassicHrn, B15_OrchHorns , B15_OrchHorns ] B07 [B08_Tuba , B09_BrassEns. , B17_TuttiBrass, B17_TuttiBrass] B08 [B28_AttackSyn., B31_SynthBrs 3, B31_SynthBrs 3] B09 m[B26_SwampSynth, B26_SwampSynth] B10 [B18_HarmoSynth, B18_HarmoSynth, B29_SynthBrs 1] B11 [B19_SmoothBrs , B19_SmoothBrs ] B12 m[B02_Trumpet 2 , B04_Flugel 1 ] B13 [B01_Trumpet 1 , B11_HardPopBrs, B12_HvyPopBrs , B13_ClassicBrs, B17_TuttiBrass, B17_TuttiBrass, B17_TuttiBrass, B17_TuttiBrass] B14 [B20_DualSynth , B20_DualSynth ] B15 [B21_LyriSynth , B21_LyriSynth , B32_SynthOrch ] B16 [B22_MelloSynth, B22_MelloSynth] B17 [B23_BuzzySynth, B23_BuzzySynth] B18 [B04_Flugel 1 ] B19 [] B20 [B24_SharpSynth, B24_SharpSynth] B21 [B25_SolidSynth, B25_SolidSynth] B22 [] B23 [B32_SynthOrch ] B24 [B32_SynthOrch ] B25 [B27_SandyBrass, B27_SandyBrass] B26 m[B01_Trumpet 1 ] B27 m[B28_AttackSyn.] B28 [B29_SynthBrs 1, B30_SynthBrs 2] B29 [B30_SynthBrs 2] B30 [] B31 [B11_HardPopBrs, B11_HardPopBrs] B32 [B12_HvyPopBrs ] C01 [C01_Harmonica1] C02 [C02_Harmonica2] C03 [C03_Concertina, C03_Concertina] C04 [C04_Bandonion , C04_Bandonion ] C05 [C05_Accordion , C05_Accordion ] C06 [C10_DistGuitar] C07 [C10_DistGuitar] C08 [C18_GuitarSyn , C18_GuitarSyn ] C09 [C20_Clavidion1, C20_Clavidion1] C10 [C21_Clavidion2, C21_Clavidion2] C11 [C23_FuzzySax ] C12 [C23_FuzzySax ] C13 [C12_Fretless , C12_Fretless ] C14 0m[C13_UpriteBass] C15 0 [C13_UpriteBass] C16 0m[C11_A.Guitar ] C17 0 [C11_A.Guitar ] C18 m[C19_PortaLead , C19_PortaLead ] C19 [C06_Violin ] C20 [C06_Violin ] C21 [] C22 [C16_Whistle , C16_Whistle , C16_Whistle ] C23 0m[] C24 [C24_Fuzz 5ths , C24_Fuzz 5ths ] C25 [C25_BreathHit , C26_Breath 5th, C26_Breath 5th, C26_Breath 5th, C26_Breath 5th, C26_Breath 5th] C26 m[C25_BreathHit , C25_BreathHit , C25_BreathHit , C25_BreathHit ] C27 [] C28 [C22_SynthLead , C22_SynthLead , C22_SynthLead ] C29 [C14_PipeOrgan , C14_PipeOrgan ] C30 [C27_TalkingBox, C27_TalkingBox, C27_TalkingBox] C31 [C17_Bells , C17_Bells , C17_Bells ] C32 0 [] D01 [C15_Choir , C15_Choir ] D02 [C29_SpaceDust , C29_SpaceDust ] D03 [C07_Cello ] D04 [C07_Cello ] D05 [C29_SpaceDust ] D06 [C08_Strings , C08_Strings , C08_Strings , C09_DualString, C09_DualString, C09_DualString] D07 [C28_HarmoWhist] D08 [C28_HarmoWhist, C28_HarmoWhist] D09 [C30_Str/Flute ] D10 0 [] D11 [C32_FreeJazz ] D12 [C32_FreeJazz ] D13 [] D14 [] D15 [C31_Str/Oboe ] D16 [C30_Str/Flute , C30_Str/Flute , C30_Str/Flute , C31_Str/Oboe , C31_Str/Oboe , C31_Str/Oboe ] D17 0 [] D18 0 [] D19 0 [] D20 0 [] D21 0 [] D22 0 [] D23 0 [] D24 0 [] D25 0 [] D26 0 [] D27 0 [] D28 0 [] D29 0 [] D30 0 [] D31 0 [] D32 0 []
- [ ]の前に m が付いているボイスはMonoモード(Polyモードではない=エンベロープをリトリガしない)
- [ ]の前に 0 が付いているボイスはBCEG bias=0(他は全て99)「プァン」という音の出だしの表現?
他に気づいたこと:
- Portament time > 0 なのはボイスC18のみ
- OP1~4のKVS(Key Velocity Sensitivity、note onで与えられるvelocity値の感度)が0以外のものもある。
- OP1~4のEBS(EG Bias Sensitivity、ブレスが音量に与える影響の感度)が7以外のものもある。