今回は電子楽器の話題です。長年憧れてきたパッチケーブルでつなぐモジュラーシンセがデスクトップで使える時代になってきたので、いろいろとテストしてみました。
古い時代のアナログシンセサイザーでは、アナログ電気回路に多数のケーブルをつなぎ変えて音作りをしていました。そのため大型で、高い消費電力、高価、ということでとても一般ユーザはなかなか使える代物ではありませんでした。デジタルシンセの登場で一気に見なくなりましたが、最近またブームになっています。やはり回路が固定されてものとは自由度が違うためとても魅力なのです。
高価、大型といった点も内部的にはデジタル化することで克服され、また安価になりました。それでもまだ1モジュール数万円とかするレベルなので、よほどやりたいことがなければなかなか手がでません。ところが最近1万円台で同様のことができる製品があらわれ、ハードルがかなり下がりました。一番の特徴はArduinoやRaspberyPiのような小型コンピュータで電子工作をする感覚で扱えることです。バッチケーブルのかわりにGPIOに差し込むジャンパーを使います。つまりGPIOの電圧の変化で制御します。
テストで使った製品は、KORGのVolca Modularと、BASTLのKastle Drumと、制御用にESP32系のArduino M5Stackを使いました。
電圧はKastleが5V系、他は3.3Vなので注意が必要です。(VolcaはSyncとCV-inのみ5Vで、あとは3.3V。電池駆動のための省電力)
電気信号は基本的に3種類に分けられます。同期に使うパルス信号、変調のコントロール信号、あとはオーディオ信号です。モジュラーシンセではこれをあえて違う種類の信号に接続して独特な効果を狙うものもあります。(これも魅力)
アナログシンセの基本構造(といわれているもの)は、波形を作り出すVCO -> 加工するVCF -> 音量を制御するVCAという順に処理されます。あとそれぞれを変調させる要素として、LFO, Envelopeなどがあります。これらは音が発生するメカニズムとして合理的なものと思っています。
Kastleはかなり独特でVCF,VCAに相当するものはありませんが、VCOとその変調に独自のものを持っています。VolcaはVCFとVCAが逆になっています。
本来モジュラーシンセはVCO,VCF,VCAが別モジュール(ユニット)になっていて、バッチケーブルのネットワークによって機能をつないでいきますが、この二つの製品はこれまでないもので、ハードは一体化していますが機能として各部が独立したモジュールになっていると考えた方がいいかもしれません。
バッチケーブルは音を鳴らしながらつなぎ変えたりもするのですが、このあたりまるで水がながれるホースをつなぎ変えるような感覚に近いものを感じます。
あとArduinoとの親和性が高いということはMIDI通信も使うことできます。(またやってみたいです) こうやってみてみると音楽とテクノロジーの接点はとても多く、広い分野を学ぶことができるいい題材だと常々思っています。
以降はメモ。
・VolcaのSync-Inのクロック受信は立下りで見るように設定変更
・LPGをミキサとして利用するため(常にゲートをあけるため)、M5StackのGPIO出力の3.3Vを印加 (kastlの’+’は5Vのため使えない)
・3つのDACで、FMのモジュレータと、リリースタイム、Kastleのピッチを変調
・M5とKastleのGNDを接続
・VolcaのGNDはKastleのstereo outまたはClockとつながっている
・VolcaのLFOループでKastleのDecay変調(KastleはLFO周期とクロックが同期しているため、フレーズと変調をずらすためには他のLFOが必要)
M5Stackのコード
参考) https://github.com/m5stack/M5Stack/blob/master/examples/Unit/DAC_MCP4725/DAC_MCP4725.ino
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 |
#include <Wire.h> #include <Adafruit_MCP4725.h> #include <M5Stack.h> #define DAC_ADDR Adafruit_MCP4725 dac; void setup(void) { M5.begin(true, false, false); M5.Power.begin(); M5.Lcd.setTextFont(4); M5.Lcd.setTextColor(TFT_WHITE, TFT_BLACK); M5.Lcd.drawString("LFO by DAC",100, 100, 4); dac.begin(0x60); dac.setVoltage(2048, false); pinMode(5, OUTPUT); } int v = 0; int s = 1; double t1=0.0; double t2=0.0; int w = 1, h1 = 0, oh1 = 0; int h2 = 0, oh2 = 0; int h3 = 0, oh3 = 0; int v33 = 0; void loop(void) { M5.update(); if (M5.BtnA.wasPressed()) { if(v33 == 0){ digitalWrite(5, HIGH); v33 = 1; } else{ digitalWrite(5, LOW); v33 = 0; } } M5.Lcd.setCursor(10,10); if(v33 == 1){ M5.Lcd.printf("SW ON "); } else{ M5.Lcd.printf("SW OFF"); } if(v > 2048){ s = -1; } if(v < 0){ s = 1; } v += s; dac.setVoltage(v, false); h1 = map(v, 0, 2048, 240, 0); M5.Lcd.drawLine(w-1, h1, w, oh1, RED); oh1 = h1; double d = sin(t1); t1 += 0.01; d = d + 1.0; int vv = d * 128; dacWrite(25, vv); h2 = map(vv, 0, 255, 240, 0); M5.Lcd.drawLine(w-1, h2, w, oh2, GREEN); oh2 = h2; d = sin(t2); t2 += 0.03; d = d + 1.0; vv = d * 128; dacWrite(26, vv); delay(10); h3 = map(vv, 0, 255, 240, 0); M5.Lcd.drawLine(w-1, h3, w, oh3, BLUE); oh3 = h3; w ++; if(w > 320){ M5.Lcd.fillScreen(BLACK); M5.Lcd.drawString("LFO by DAC",100, 100, 4); w = 1; } } |