接続とルーティング
機やエレクトーンを押すと DEVICE 欄に大きく出ます。ノブは天面でも回せます。
次は
挿し替えの練習
- ケーブルの端(プラグ)をドラッグして別のジャックへ挿し替えられます。埋まっているジャックなら2本を入れ替えます。
- 成立しないつなぎ方なら線が赤くなり、理由が出ます。シミュレータはそのつなぎ方のまま動くので、何が届かなくなるかも見られます。
- ケーブルをクリックすると抜き差し。機の側面に触れると拡大して刻印を読めます。「接続例のとおりに戻す」でいつでも戻せます。
機器
ELSynchronizer は、エレクトーンを LAN ケーブル(Cat5e)でつないでリズムをそろえる自作の機器です。どの機も「Node と 2 台だけ」でも使えます。 画面の見本は、いまシミュレータで動いている本物のファームウェアの出力そのものです。
このページで何が本物か
| Maestro / Duck | 本物ファームウェア(.ino)と SSD1306Ascii を WebAssembly に組んだもの。
土管Arduino・Wire・MIDI・EEPROM / 模型SSD1306 チップ |
| Ghost | 本物操作盤の Python(ghost/panel/)を書き換えずに Pyodide で。字は Pillow と Noto Sans。
模型再生エンジン(sync_play.py の代わりに状態だけ返す。音は出ない) |
| Node | マイコンが無いので配線として扱います(ステージの絵)。 |
| エレクトーン | 模型操作パネル風の見た目(同期に関わる所だけ)。親は START / TEMPO / SEQ で出し、子は Maestro から届いた 「リズム スタート」で自分のリズムを走らせます(実物の EL が同期中に何を出すかは確かめていません)。音量の段は Duck の SysEx で動きます。 |
音
仮想エレクトーンの拍に合わせて音群ごとの伴奏(U = パッドの和音 / L = 刻み / Ld = 短い旋律 / P = ベース)と拍の頭のキックを鳴らし、 操作盤の音量(Duck の SysEx・演奏者が動かした値)をその音群の大きさにします ―― Duck の凹み(サイドチェイン)が耳で分かります。 値 0〜127 → 大きさは値に比例する振幅と仮定しています(実物の EL のカーブは未計測)。キックは凹ませません。 音源は行ごとに wav / mp3 / ogg に差し替えられます(「音源を選ぶ」か、行へドラッグ&ドロップ。ブラウザの中だけで使い、どこへも送りません)。 iPhone / iPad は消音スイッチや他のアプリの音で止まることがあります(止まったら上のバーのスピーカーをもう一度)。
速さ
シミュレータの時間を遅くします。ゆっくりにすると、有機EL の描き替えやパイメニューの輪の伸び方が目で追えます。
開発者向けの数値
時間の進み方・各機の数値・仮想EL の模型の設定
仮想EL の模型の設定(全 EL 共通)
線に出たバイト
EL と機が線へ出した MIDI を、送り終えた時刻と届いた先つきで並べます(31250bps。1 バイト 320µs を順に積む。
機が書いた時刻は 1ms 刻みで読んでいます)。「✂」は抜いた線、「✗」は挿し違えた線(ステージの練習)で止まったもの。Duck の音量 SysEx()は
「どの音群を・いつ・いくつまで」下げた / 戻したかにまとめます。
Duck の音量の時系列音群ごとの折れ線(直近 6 秒)
EL に届いた Duck の音量 SysEx の値を、音群ごとに折れ線で描きます(縦 = 値 0〜127)。操作盤の VOLUME の段と同じ源です。
このページについて
何が本物か・画面の見方・仕組みとできないこと
ELSynchronizer は、複数台のエレクトーンのリズムを LAN ケーブル(Cat5e)でつないで同期させる自作の機器群です (東北大学エレクトーンサークル MUSICA)。このページでは、実機に書き込むのと同じファームウェアをブラウザの中で動かしています。 実機はまだ開発中で、ここに並ぶ筐体と画面は設計データから描いたものです。 信号はケーブルとジャックの向きに沿って届きます(1 バイトは線の上で 320µs = 31250bps。受け直して送り直す区間ごとに積みます)。 何が本物で何が模型かは「機器」のページの表にあります。
画面の見方
- 上のバー: 接続例(つなぎ方)・EL の数・▶ = 親EL の START / 停止(はじめて押すと音も出します)・テンポと小節 / 拍・音(スピーカーと全体の音量)・このページについて(?)。
- 左のメニュー(スマホは下): シミュレータ(ステージ + DEVICE 欄)/ 機器(5機種の紹介と画面の見本)/ ステージ(接続図を大きく・挿し替えの練習)/ 設定(音・速さ・開発者向けの数値・この説明)。
- ステージ: 選んだ接続例のとおりに、各機を上から見た天面と、端子のある側面を天面の縁へ開いた姿(展開図)で並べ、 Cat5e(RJ45 のプラグ)と MIDI(DIN-5)のケーブルを実際のジャックに挿した姿で描きます(1本のケーブル = 1本の線、線の色 = どの EL の線か。 EL の列は Maestro の端子の順に並べ、Node と Maestro の間に挟まる Duck はその列の中に置くので、線は交差しません。線に乗せると1本だけ強調)。天面は全機同じ縮尺(実寸比)。 Maestro / Duck / Ghost の天面は生きています: 有機EL は実物の窓の位置・大きさのまま、ノブは天面(半径の 62% まで)を押す(長押し 0.6 秒でパイメニュー)/ 縁とその外をドラッグ・ホイールで回す / 機を選んで ←→ で回す・Space で押す。 使っていない EL の置き場(点線の枠と +)を押すと EL の数を増やせます。「全体 / シンプル」で細かい表示(凡例・端子名・Maestro の札・接続例の節)を出す / 隠す。 「大きく」でステージを大きく描けます(枠の中で横に送る)。
- DEVICE 欄: ステージで押した機を大きく(‹ › で次の機へ)。有機EL の拡大した写し(「天面」に切り替えると天面の絵。ノブはそこでも回せる)と ノブの代わりのボタン(◀ 押す ▶)、タブ「ノブの使い方」(回す・押す・長押しの意味)/「電源」(電源を入れ直す / 押しながら電源ON / 設定を消す。 Ghost は journal と模型の状態も)/「数値」(「全体」のとき。時間・ループ・I2C・ハード・天面の出どころ)。 EL を押すと、その EL の操作盤(RHYTHM・SEQ.1〜4・TEMPO ダイアル・BAR / BEAT・RHYTHM CONTROL・VOLUME の段)が全部出ます。 親EL は操作でき、子EL は見るだけ(音量の段は演奏者として動かせます)。Node は給電 LED と挿さっている線。
- 操作盤の音量(ボイスの区画ごとの VOLUME の 7 段。音群)は EL の IN に Duck の音量 SysEx が届くとその値へ動きます(青)。 演奏者として動かすこともできますが(橙。模型では EL は何も出しません)、Duck が凹ませている音群は次の拍の戻りで Duck の BASE に上書きされます。 「—」は模型が EL の音量を知らない状態です。[SYNCHRO START] は模型に鍵盤が無いので押せません。 Maestro が居る接続例では、親は Maestro で選んだポート(mux)の先の EL で、子EL は Maestro から届いたもので動きます。
- 設定: 音の細かい設定(鳴らす EL・音群のミュート / ソロ・音源の差し替え)・速さ・線に出たバイト・Duck の音量の時系列・開発者向けの数値(
?dev=1で開いて始まる)。
仕組みとできないこと
- Maestro / Duck: ファームウェア・SSD1306Ascii ライブラリ・フォントは本物。SSD1306 チップだけが模型で、Arduino / Wire / MIDI / EEPROM は土管です
(
sim/README.md)。台本で動かす PC 版(sim/run.py)と同じソースを組んでおり、 同じ台本を流すと画面のビットが1つも違わないことをsim/wasm/check_equiv.pyで確かめています。 - Ghost: 操作盤(
ghost/panel/のpanel_main.pyの輪ごと)と状態ファイルのやりとり(tools/elsync_state.py)は本物で、 1バイトも書き換えていません。gpiozero と luma.oled は土管、再生エンジンは模型(sim/wasm/ghost/ghost_model.py)。 曲は架空の見本です。Pyodide で描いた画面が CPython で描いた画面と1点も違わないことをsim/wasm/check_ghost.pyで確かめています。 公開版は Pyodide(Python の実行環境。約 13MB)をページに同梱しているので、外へは何も読みに行かず、 オフラインでもfile://でも Ghost まで動きます(手元の開発版sim/wasm/web/だけは cdn.jsdelivr.net のフル配布から読みます)。 - 「実機に近い」では、画面へ I2C で送る時間(Maestro 400kHz / Duck 100kHz)だけ loop() が止まります。 その間に届いた MIDI は待たされるので、「EL→機の遅れ」「最長ループ」に描画の重さが出ます。Ghost(Pi)の処理時間は数えていません。
- 接続例は
docs/TOPOLOGY.md3章の「成立するトポロジ」から、1台ずつの機で組めるもの(3.2 / 3.3 / 3.5 / 3.6 / 3.8 / 3.9 / 3.12)。 名前は日常語にしてあり(源はshared/topology_examples.jsonの name)、「全体」表示で節の番号も出ます。 最初に開くのは「全部入り」を EL 2 台にした形(3.12。EL1 = 親、EL2 の前に Duck、Maestro の J12 に Ghost)。 ジャックの向き(EL 側 = 下りを受ける / 遠い側 = 下りを送る)とケーブルの規則はsim/wasm/web/world.jsが確かめます。 Ghost 2台(3.10)・Duck 2台(3.11)は、このページが同じ機を2台並べないので入れていません。 - 経路: Node と、Duck / Ghost の下りの中継・Ghost の上りの中継はハードウェアなので同じ瞬間に先まで届きます。
Duck の上りはファーム(受けた Maestro のバイトと自分の音量 SysEx を
shared/midi_chain.hの規律で合成して送り直す)。 Maestro は mux が選んだポートの下りだけを受け(J12 にも同じものが出る)、子EL へはゲートの開いたポートにだけ出します ―― どちらもファームが当てたピン(sim_hw)を読んで決めています。 - 天面と側面の絵は筐体の設計データから描いています(手で描き起こしていません)。外形・開口・刻印は各機の
case/export/faces/top.svgとx0〜y1.svg(STL から取った下絵)、窓・表示部・ノブの軸・LED の位置と寸法は各機のcase_design.pyを読んだ値(ビルドのたびに下絵の開口と突き合わせています)、意匠は Affinity の書き出し (Maestro はtop_decal.png。他の機はまだ無いので刻印だけの下絵)、筐体の色は 3D ビューアの配色の「本命」(白)。 天面の絵はsim/wasm/web/face_art.jsの表で機ごとに画像へ差し替えられます(ステージ・DEVICE 欄・機器のページが同じ表を見る)。 出どころは DEVICE 欄の「数値」に出ます。接続例の JSON のジャックが側面の開口にちょうど1つずつ当たることも毎回確かめています。 Maestro / Ghost の表示部の手前 1.5mm(約 3.5 行)は、実物と同じく天面の枠の下に隠れます(拡大した写しでは斜線で示します)。 - 設定(Maestro / Duck の EEPROM)はこのブラウザの localStorage に残ります。「電源を入れ直す」は本物の再起動(プログラムを最初から)です。 Ghost の状態ファイル(スタンバイ・演奏会・音量)はページを開いている間だけ残ります。
- 実機と違うところ:
intの幅(AVR は 16bit)、PROGMEM、送信バッファが埋まって待つ経路、EEPROM の書き込み待ち(常に即座)。 描画以外の処理時間は数えていません(1ループ 0.2ms と仮定)。EL の送り順は先入れ先出し(リアルタイムの割り込みはしない)。 ハードウェアの中継の遅れ(オプトの µs)は数えていません。 - 字: 英字は Inter(筐体の刻印と同じ。© The Inter Project Authors)、日本語は LINE Seed JP(© LY Corporation)。 どちらも SIL Open Font License 1.1(openfontlicense.org) で、画面に出る字だけに詰めてページに同梱しています。 有機EL の画面の字は機の本物(ファームのフォント・Ghost は Noto Sans CJK)です。