リファレンス
画面の移動
MIDoRI は Home 画面で起動します。タイルをタップするとその画面へ。タイルの小さな文字はその画面の状態です (BPM、パッチの数、Tombola が動いているか など)。
| ナビバー | 動作 |
|---|---|
| Home(左) | Home 画面へ戻る。 |
| 中央 | 画面ごとのボタン(Tempo は TAP、Knobs は Send、Tombola は Start / Stop、Bluetooth は Scan)。ないときは画面名。 |
| Back(右) | 直前の画面へ(Home は数えません)。もう一度押すと元の画面に戻るので、XYPad ⇄ Knobs のように 1 タップで行き来できます。 |
Pads・Knobs・XYPad は、スクリプトかプラグインが中身を決めるまで空です。SD カード用ファイルには中身を作るプラグインが
入っていて(/sd/plugins/、起動時に読み込み)、自分で書くときは
examples が出発点になります。
プラグインが部品を組み合わせて作った画面(レイアウト)は、それぞれ Home にタイルが出ます。
Pads
ワンショットの操作に使うボタンのグリッド。ドラムを叩く、シーンを切り替える、フレーズを始める、など。 パッドごとにラベルと色があり、何をするかはスクリプトが決めます。複数の指で同時に押せます。
パッドの種類
| 種類 | 動作 |
|---|---|
| trigger | 押した瞬間に 1 回(既定)。 |
| momentary | 押している間オン、離すとオフ。音やエフェクトを押さえている間だけかけるのに。 |
| toggle | 押すたびにオン / オフが切り替わり、オンの間は点灯。Hold・ミュート・Play に。 |
スクリプトから
dev = MIDI::Device.new(MIDIDevices.sam2695)
UI.pad(1, label: "Kick", color: :red) { dev.trigger(36, 127, channel: 9) }
UI.pad(2, label: "Hold", color: :yellow, type: :momentary) { |down| ... }
UI.pad(3, label: "Play", color: :green, type: :toggle) { |on| on ? UI::Tempo.start : UI::Tempo.stop }
UI.pad_label(1, "Kick!") # pad_color / pad_state / pad_clear も
UI.show(:pads)色: :red :green :blue :yellow :cyan :magenta :orange :purple :white :gray。ブロックはスクリプトが
UI.process を呼んでいる間に動きます。
Knobs
カットオフ・レゾナンス・音量・センドなど、合わせておく値のためのノブ。バンク(A〜D)はノブ一式の丸ごと 1 セットで、 ラベルも色もバンクごとに違ってかまいません(A = シンセ、B = ドラム、C = エフェクト のように)。
| 操作 | 動作 |
|---|---|
| ノブのまわりをなぞる | 実物のノブのように回ります。ゲージの先端が指の下から動きません。ノブの枠の中ならどこを持ってもよく、中心から遠くを持つほど細かく合わせられます。 |
| 複数の指 | いくつものノブを同時に回せます。 |
| A / B / C / D(右端) | バンクの切り替え。切り替えても何も送りません。ほかのバンクの値はそのまま残ります。 |
| Send(ナビバー) | 表示中のバンクの今の値を送り直します。あとから機材をつないだときに。 |
ノブが送るのは値が変わったときだけ。定義しただけでは初期値は送られないので、画面と機材をそろえるには Send を押すか
UI.knob_send_all を呼びます。
スクリプトから
UI.knob(1, label: "Cutoff", color: :cyan, value: 64) { |v| dev.control_change(74, v.to_i) }
UI.knob(2, bank: 2, label: "Pan", origin: :center, value: 64) { |v| dev.control_change(10, v.to_i) }
UI.knob(3, label: "BPM", min: 40, max: 240) { |v| UI::Tempo.bpm = v }
UI.knob_send_all(bank: :all)
UI.knobsシミュレーターで開く ▶オプション: min: / max:(0〜127)、step:(1。0 で連続値)、origin: :center
(中央から両側へ伸びるゲージ)、sensitivity:(1.0)。
詳細: docs/KNOBS.md
XYPad
指で弾く演奏面。横が音程、縦が CC。指ごとに別の MIDI チャンネルで鳴るので、1 音ずつ別々にベンドしたりフィルタを開けたりできます。
| 操作 | 動作 |
|---|---|
| 指を置く | 画面はスケールの音の数だけ縦に区切られていて、指を置いた列の音が鳴ります。 |
| 横に動かす | 置いた位置からピッチベンド。画面の端から端までで、グライド幅(既定 2 半音)ぶん曲がります。 |
| 縦に動かす | CC を送ります(既定 74。多くの音源でフィルタのカットオフ)。上ほど大きい値。 |
| 離す | ノートオフ。Hold がオンなら、Hold を切るまで鳴り続けます。 |
指の近くに、いま何を鳴らしているかが短く出ます。音の代わりに CC を 2 つ送る指にもできます。
スクリプトから
pad = UI::XYPad.new(scale: [36, 38, 40, 41, 43, 45, 47, 48],
glide_range: 2, y_cc: 74, device: dev)
pad.slot(5, x_mode: :cc, x_cc: 70, y_cc: 71, device: fx) # 5 本目の指だけ
UI.pad(1, label: "Hold", type: :toggle) { |on| pad.hold = on }
pad.showシミュレーターで開く ▶XYPad は MIDI Devices にも出ているので、そこでパッチすれば弾いた内容をほかの機材にも送れます。
詳細: docs/XYPAD.md
Keys
画面の鍵盤(既定は C3 から 2 オクターブ)。受け取ったノートで鍵が光るので、光る MIDI 鍵盤のように、機材や DAW が 何を弾いているかも見られます。
| 操作 | 動作 |
|---|---|
| 鍵を押す | その音が鳴ります(押している間はシアン)。 |
| 指を滑らせる | 隣の鍵に移るとその鍵を弾き直します(グリッサンド)。 |
| 押す位置 | スクリプトで velocity: :position にすると、鍵の手前ほど強く鳴ります。 |
MIDI Devices で
- Keys → 機材: 弾いた音がその機材へ。
- 機材 → Keys: 届いたノートで鍵が光ります(オレンジ)。鍵盤や PC を Keys へパッチすると鳴っている音が見えます。 Keys は受けた音を先へ流さないので、鍵盤の音も聞きたいときはシンセへのパッチも張ります。
スクリプトから
keys = UI::Keys.new(octaves: 2, low: 48, velocity: :position, device: MIDIDevices.amy) MIDI.route(MIDIDevices.usb_midi_host, keys) # 外部鍵盤の演奏で鍵を光らせる keys.set_color([48, 52, 55], :blue) # 和音やスケールを表示 keys.showシミュレーターで開く ▶
詳細: docs/KEYS.md
Sequencer
セット全体を回すパターンシーケンサー。ソングは最大 16 本のライン(トラック。ラインごとに MIDI チャンネル)と 16 個のパターンからなり、チェーンでパターンを順番に再生します。ラインごとに長さを変えられるので、 長さの違うラインを並べればポリリズムになります。
タイミングと再生
- Sequencer は受け取った MIDI クロックで進みます。初期状態で Tempo → Sequencer のパッチ(クロックだけ)があるので、Tempo 画面の BPM で動きます。 ほかの機材に合わせるときは、MIDI Devices でその機材 → Sequencer を Clock で張り替えます。
- Sequencer 画面の Play / Stop は、クロックが Tempo から来ているなら Tempo を(それに従うほかの機材ごと)再生・停止します。 Tempo 画面の Play や外部機材の Start でも動きます。
- ノートは MIDI Devices で Sequencer からパッチした先へ、ラインのチャンネルで送られます。
パターンとチェーン
| 操作 | 動作 |
|---|---|
| パターン(1〜16)をタップ | そのパターンへ。停止中はすぐ、再生中は今のパターンの終わりで切り替わります(待っている間は点滅)。チェーンはオフになります。 |
| パターンを長押し | メニュー: Edit here(別のパターンを再生したままこのパターンを編集)、Copy、Paste、Clear、Length。 |
| Chain | タップでオン / オフ、長押しで順番と繰り返し回数の編集。 |
| ◀ ▶ / 8・16 / Follow | 長いラインを半ページずつ送る、8 か 16 ステップ表示、再生位置に追従。 |
ライン
| 操作 | 動作 |
|---|---|
| ライン見出しをタップ | ラインを選ぶ(REC と Follow の対象)。 |
| M | ミュート / 解除。 |
| ライン見出しを長押し | ラインの設定: Grid / Realtime、チャンネル、ステップ数、レート、小節数、ベロシティ、ゲート、クオンタイズ、録音モード、プログラム・バンク、名前、このラインの Copy / Paste / Clear、Delete。 |
| + Line | ラインを足す。 |
グリッドにノートを置く
グリッドに置くのは和音: Keys や Sequencer へパッチした鍵盤で最後に弾いた音です(ヘッダに表示。タップで試聴)。
| 操作 | 動作 |
|---|---|
| 空のマスをタップ | 和音を長さ 1 ステップで置く。 |
| 空のマスを押してドラッグ | ドラッグした長さで和音を置く。 |
| ノートのあるマスをタップ | そこから始まるノートを消す。 |
| ノートのあるマスを押してドラッグ | 長さを変える。 |
| ノートのあるマスを長押し | 和音で置き換える。 |
録音
ラインを選んで REC をタップすると録音待機。Sequencer が動いている間に弾いたものが、再生中のパターンに録音されます。 overdub / replace とクオンタイズはラインの設定で選びます。停止中は録音しません。
保存
- File(ソング名を表示。
*は未保存の変更あり): Save、Save new、Load、New、Delete(2 回押し)、Close。 ソングは/sd/patterns/に保存されます。 - 作業内容は自動でも保存されます(最後の変更から 5 秒後、編集が続いていれば 60 秒ごと、Stop のとき)。再起動しても戻ります。
スクリプトから
seq = UI::Sequencer.current # 画面のソング
seq.on_pattern { |e| UI.log("pattern #{e[:pattern]}") }
seq.showシミュレーターで開く ▶Tombola
回転する多角形の中でボールが跳ね、辺に当たるたびにその辺の音が鳴ります。強く当たるほど大きな音。 初期状態ではドラムキット(チャンネル 10 の GM ドラム)を鳴らします。
| 操作 | 動作 |
|---|---|
| Start / Stop(ナビバー) | 開始 / 停止。ボールがなければ 3 個入れて始めます。 |
| 多角形の内側をタップ | そこにボールを足す。 |
| ドラッグ | 多角形を手で回す。指についてきて、指を止めれば止まります。弾くとボールが飛び散ります。離すと設定の速さで回り始めます。 |
隅の文字は辺の数・回転(rpm)・重力・反発・ボールの数。ほかの画面を見ている間も演奏は続きます。
MIDI Devices で
- Tombola → 機材: 当たった音がその機材へ。
- 機材 → Tombola: 押さえたノートごとに、その音を鳴らすボールが増え、離すと消えます。
- Tempo → Tombola: Tempo の Play / Stop で回る・止まる。
スクリプトから
t = UI::Tombola.new(sides: 6, rotation: 12, gravity: 0.5, device: dev)
t.scale = [36, 38, 42, 45, 46, 49] # 辺 N → scale[N % size]
t.add_ball(color: :red)
UI.pad(1, label: "Faster") { t.rotation += 4 }
t.start
t.showシミュレーターで開く ▶ほかに gravity_mode(:down / :center / :none)、bounce、friction、ball_size、channel、duration、on_hit。
詳細: docs/TOMBOLA.md
Tempo
MIDoRI のマスタークロック。MIDI Devices でパッチした機材すべてに MIDI クロックを送り、セット全体の Start / Stop を出します。 ほかの機材のクロックに合わせて、それを送り直すこともできます。
| 操作 | 動作 |
|---|---|
| BPM をタップ | タップテンポ。ナビバーの TAP も同じ。 |
| BPM をスワイプ | 上・右で速く、下・左で遅く、1 BPM ずつ。スワイプ中は数字が黄色。 |
| ▶ Play / ■ Stop | MIDI Start / Stop を送ります。再生中は BPM が緑。 |
| USB-H / USB-D / DIN / BLE | 外部クロックの出どころ(USB の機材、パソコン、DIN / TRS ジャック、Bluetooth)。Ext: にそこから測った BPM が出ます。 |
| Sync | 外部クロックに追従(BPM が水色)。Tempo からパッチした機材もそれに従います。 |
クロックを送るのは Tempo からパッチした機材だけ(Tempo は MIDI Devices の行に出ます)。多くの機材が期待するとおり、 Play を押していなくてもクロックは流れ続けます。
スクリプトから
MIDI.route(UI::Tempo, MIDIDevices.usb_midi_device) # DAW へクロック
UI::Tempo.bpm = 128
UI::Tempo.start # .stop / .tap / .sync = true
UI::Tempo.on_change { |bpm| UI.knob_set(1, bpm, notify: false) }シミュレーターで開く ▶詳細: docs/TEMPO.md
AMY
内蔵シンセサイザー(AMY)。ボードのスピーカー(Tab5 はヘッドホンも)から鳴り、 音源は FM(DX7 のプリセット 128 種)と Synth(Juno-60 のプリセット 128 種を持つアナログ風シンセ)の 2 種類。 Home の AMY タイルから、スクリプトなしで音色を組むパネルを開けます。
AMY パネル
| 画面の部分 | 動作 |
|---|---|
| タブ | タブ 1 枚 = パート 1 個(MIDI チャンネルに載った音色)。+ → + FM / + Synth で、空いている一番小さいチャンネルに足します。最大 8 枚。 |
| << < > >> | プリセットを 1 つ / 10 個ずつ前後へ。 |
| Ch- / Ch+ | パートの MIDI チャンネル(1〜16)。同じチャンネルのパートは重なって一緒に鳴ります。 |
| Del | 2 回押し(Sure?)でパートを消す。 |
| エンベロープ | ハンドルをドラッグ(A: 横、D: 横と縦、S: 縦、R: 横)。Synth は Amp と Filter、FM はオペレータを 1 つずつ(Op n で選ぶ)。 |
| ノブ | Synth: Cutoff・Reso・FltEnv・KeyTrk・Glide・Pan・Volume・Reverb。FM: Algo・Feedbk・OpLvl・Ratio・Cutoff・Reso・Volume・Reverb(Reverb は全パート共通)。 |
| 鍵盤 | パートのチャンネルで試し弾きする 1 オクターブ。Oct- / Oct+ で移動。 |
- ほかの機材から AMY を弾くには、MIDI Devices でその機材 → AMY をパッチします。AMY は初めて必要になったときに起動します。
- スピーカーとヘッドホンの音量は Settings 画面。Tab5 はヘッドホンを挿すとヘッドホンの音量に切り替わります。
- パネルで組んだパートはまだ保存できません(スクリプトを実行すると消えます)。
スクリプトから
amy = MIDIDevices.amy fm = amy.add_fm(channel: 0, patch: 128) # DX7 のプリセット syn = amy.add_synth(channel: 1, patch: 5) # Juno-60 のプリセット syn.cutoff = 900 MIDI.route(MIDIDevices.usb_midi_host, amy) # 鍵盤から弾くシミュレーターで開く ▶
MIDI Devices(MIDI Info)
パッチベイ。行が MIDI IN(MIDI の出どころ)、列が MIDI OUT(行き先)。セルの丸は「その行から来たものを その列へ送る」という意味です。ここで張ったパッチはすぐ保存され、電源を入れ直しても戻ります。
| 操作 | 動作 |
|---|---|
| セルをタップ | パッチの付け外し(全チャンネル)。外すと、使っていたチャンネルに All Notes Off を送るので音が残りません。 |
| セルを長押し → Ch | 通すものを選ぶ: All、Clock(クロックと Start / Stop だけ)、チャンネル 1〜16(複数可)、Off。Done か外側のタップで閉じます。 |
| セルを長押し → Filters | MIDI フィルタ(プラグインのコード・アルペジオなど)を選んだ順につなぐ。選んだフィルタを長押しで設定。 |
| 行・列の名前を長押し | デバイスの詳細: 状態、製品名、転送の回数(MIDI が届かないときの切り分けに)。 |
| グリッドをドラッグ | 収まらないときにスクロール。名前の行・列は固定です。 |
| 左上の角のボタン | All(全部)/ Patched(パッチのあるものだけ)/ Unpatched(ないものだけ)を切り替え。 |
グリッドの見方
- 行の名前の丸: 緑 = 接続中、灰色 = 未接続。列の名前の下の線: 黄 = 待機中(起動前の AMY)。
- つながっていない機器のパッチは灰色の輪。機器が戻ればそのまま効きます。
- セルの左下は通すチャンネル(
1-4,10,clk)、右上のf2はフィルタ 2 段のチェーン。
並ぶデバイス
| 名前 | 中身 |
|---|---|
| (製品名) | USB MIDI 機器。USB ハブ越しに最大 4 台。 |
| PC | USB でつないだパソコンや iPad(midi_device モード)。 |
| SAM2695 | SAM2695 ユニット(GM 音源と DIN / TRS ジャック)。 |
| BLE /(機器名) | Bluetooth でつながった iPad や Mac と、MIDoRI からつないだ BLE-MIDI 機器。 |
| AMY | 内蔵シンセ(OUT のみ)。 |
| Keys・Sequencer・Tombola | 画面の楽器(IN と OUT の両方)。 |
| Tempo・XYPad | 送るだけ(IN の行のみ)。 |
| Script | 実行中のスクリプト。Script の行がスクリプトの出力の行き先、列がスクリプトが聞く入力の出どころ。 |
スクリプトから
md = UI::MIDIDevices
md.patch(MIDIDevices.usb_midi_host, MIDIDevices.amy)
md.patch(MIDIDevices.usb_midi_device, MIDIDevices.sam2695, channel: [0, 9, :clock])
out = md.output # Script へ送る = Script のパッチの先へ出ていく
md.input.on(:note_on) { |m| out.note_on(m.note + 12, m.velocity) }
md.save # スクリプトが張ったパッチはスクリプト限り(save で保存)シミュレーターで開く ▶Bluetooth
BLE-MIDI は両方向。Device としては iPad や Mac から Bluetooth MIDI 機器として見え(名前は 「Midori Tab5」「Midori CoreS3」)、Host としては BLE-MIDI の鍵盤やアダプタ(WIDI など)へこちらからつなぎます。
| 操作 | 動作 |
|---|---|
| Device On / Off | iPad や Mac から見えるようにする。下に名前と状態(advertising / connected)。 |
| Host On / Off | BLE-MIDI 機器へつなぎに行く。 |
| Scan(ナビバー) | BLE-MIDI 機器を 8 秒間探す。もう一度押すと止めます。 |
| 一覧の機器をタップ | 接続 / 切断。 |
| x(右端) | 既知の機器を忘れる。 |
| 一覧をドラッグ | スクロール。 |
- 一覧は接続中の機器(紺)、既知の機器(
*)、スキャンで見つかった機器(電波の強さつき)の順。 - 一度つないだ機器は、Host がオンの間は自動でつなぎ直します(自分で切断したものを除く)。
- On / Off は保存されます。つながった機器は MIDI Devices に出て(iPad / Mac は BLE、機器は機器名)、Tempo は BLE のクロックに同期できます。
- Mac は「Audio MIDI 設定」→ MIDI スタジオ → Bluetooth から、iPad はアプリの Bluetooth MIDI 設定からつなぎます。 MIDoRI を入れ直したあとペアリングできないときは、iPad / Mac の Bluetooth 設定で「Midori」を削除してからやり直してください。
スクリプトから
widi = BLE_MIDI_HOST.connect("WIDI") # 名前で(必要ならスキャン)
dev = MIDI::Device.new(MIDIDevices.ble_midi_host("WIDI"))
MIDI.route(MIDIDevices.ble_midi_device, MIDIDevices.amy) # iPad → AMY詳細: docs/BLE_MIDI.md