オルガンコンソールのMIDI化:部品選定とセットアップガイド
部品と材料
| 部品 | 数量 | 備考 |
|---|---|---|
| Arduino Mega 2560 | 1 | |
| DIN MIDIプラグ(5ピン) | 1 | |
| 抵抗 220Ω | 1 | MIDI出力用 |
| USB A-Bケーブル | 1 | 書き込み/給電用 |
| AWMケーブル(マルチ芯シールド線) | 1 | 鍵盤配線用 |
| ピンヘッダー 40P 1列(2.54mm) | 1 | Arduino接続用 |
| スライドポテンショメーター 10kΩ リニア | 1 | エクスプレッションペダル用 |
| IDCソケット | 1 | 任意(着脱式にする場合) |
| オス-オス ジャンパーワイヤー | 1セット | 任意(IDCソケット使用時) |
必要な工具
- ハンダゴテ
- 鉛フリーハンダ
- ハンダ用フラックス
- ワイヤーストリッパー
- ニッパー(側面カッター)
- ラジオペンチ(平型)
使用するアプリ・オンラインサービス
- Arduino IDE
プロジェクト概要
古いオルガンコンソールを改造し、鍵盤(マニュアル)とペダルボードからハードウェアMIDIメッセージを出力できるようにするプロジェクトです。単一のArduino Megaで複数の鍵盤とペダルを処理します。
当初は元の音源回路を残したままMIDI出力のみを追加しようとしましたが、既存回路のリバースエンジニアリングが困難だったため、マトリックス型とバス型の両方に対応したコードを開発しました。
⚠ 重要な注意事項
- この改造を行うと、元の鍵盤スイッチング機能は動作しなくなります。
- オルガン内部には危険な電気部品があります。必ず電源プラグを抜き、十分な電子工作経験とスキルがある場合のみ作業してください。不安な場合は専門技術者に相談してください。
- 古いオルガンの部品は経年劣化しており、改造によって破損する恐れがあります。本手順の実行は自己責任で行い、著者は一切の責任を負いません。
製作手順
ステップ1:オルガンを調査する
- 最初に公開したコードは、すでにマトリックス配線(ダイオード付き離散スイッチ)が施された鍵盤を前提としていました。その後、バス型鍵盤にも対応したコードを開発しました。ご自身の鍵盤タイプに合ったコードを使用してください。どちらの場合も、全スイッチにダイオードが必要です(安価に入手可能)。マトリックス型とバス型ではArduinoへの書き込みコードが異なります。
- 本例のオルガンは、鍵盤がノーマリーオープン(NO)スイッチ、ペダルがノーマリクローズド(NC)スイッチでした。テスターで導通確認し、スイッチタイプが異なる場合はコードを修正してください(コード内に例あり)。
- 鍵盤とペダルの接点にアクセスできるようオルガンを開け、Arduino搭載場所を決定します。電源供給用とMIDIプラグ取り付け用に穴あけやコネクタ増設が必要な場合があります。本例では内部の小型電源ボックスから3極プラグでArduinoへ給電し、MIDI DINプラグ用に穴を開けて取り付けました。
- 本例は2段鍵盤(各6×11マトリックス)とペダルボード(6×7マトリックス)でした。マトリックス方式を採用する場合、対象オルガンが8×8マトリックスならコード/配線を修正するか、6×11に再配線する必要があります。
ステップ2:Arduinoを固定する
Arduino Mega付属のプラスチックプレートを木部に小ねじ(M4相当)で固定し、Arduinoを機械ねじでプレートに取り付けます。まずArduino位置を決めてからケーブル長を見積もるとスムーズです。この段階でArduinoへの給電方法も検討します。
ステップ3:ケーブルを準備する
マトリックス型鍵盤
各鍵盤61鍵。本例では6行×11列(マニュアル)/ 7列(ペダル)のマトリックス。行配線は6鍵ごとに共通、列はダイオードを介して配線されています。各分割点からArduinoまで届く長さのAWMケーブルを2本ずつ(行用・列用)切り出し、余裕を持たせて整理しやすい経路で配線します。列側は鍵盤/ペダルの長さ分延ばしてからArduinoへ向けると綺麗にまとまります。各ケーブルの端をニッパーで芯線分離し、ストリッパーで被覆を剥きます。
バス型鍵盤
鍵盤を6本のAWMケーブル(各10芯)に分割し、61鍵目は単独のリード線で対応。同様に端末処理を行います。
ステップ4:ケーブル端をピンヘッダーにハンダ付け
マトリックス/バス両方共通:適切なケーブル端をピンヘッダーピンにハンダ付けするか、ネジ端子基板を使う場合は端子に固定します。

ステップ5:ケーブルもう一方をスイッチへハンダ付け
マトリックス型
既存配線がある場合は、元のコンピューターへ行く配線をハンダ吸い取り/ニッパーで切断。行配線(6鍵ごとの共通線)は流用し、元の位置から外してArduino用6本線をハンダ付け。列側は既存ダイオードの出力側を切り離し、Arduino用列線をダイオード出力にハンダ付け。配線は結束バンドで既存配線に沿って整理。ペダルボードは前面パネルを外して中央の穴からケーブルを通しました。
バス型
バス側ではない各スイッチ端子にダイオードをハンダ付け(負極をスイッチ側へ)、そこから10芯ケーブルの各線へ接続。6本のケーブルすべてで同様に行い、61鍵目も同様に処理。
ステップ6:MIDIプラグに抵抗をハンダ付け、Arduinoへ接続
MIDI OUT回路:DINプラグのピン5(出力)に220Ω抵抗、ピン4(電源)をArduino 5V、ピン2(GND)をGNDへ接続。ピン1,3は未接続。

ステップ7:ピンヘッダーをArduinoへ接続
回路図に従ってすべてのヘッダーをArduinoに挿入します。
代替案:IDCソケットをケーブル端に圧着/ハンダ付けし、オス-オスジャンパーでArduinoへ接続する方法もあります。こちらは永続的ではありませんが、コード修正で再配線が必要な場合に便利です。
ステップ8:ソフトウェアをArduinoへ書き込む
- USBケーブルでArduinoとPCを接続し、Arduino IDEを起動。
- ご自身の鍵盤タイプ(マトリックス/バス)に合ったコードを選び、新規スケッチにコピペ。
- ボード/ポートを選択し、「書き込み」ボタンをクリック。
ステップ9:動作テスト
- MIDIアダプターをPCに接続し、オルガンのMIDI OUTをアダプターのMIDI INへ。
- MIDIモニターソフトで、全鍵/ペダルの押下/離脱時に正しいNote On/Offメッセージが出るか確認。
- スタンドアロン運用時は、Arduinoの電源ジャックに5Vアダプター、またはUSBケーブルの先にUSB電源アダプターを繋いで給電。
補足事項
- バス型コードは未検証ですが動作見込みです。試した方はコメントでフィードバックをお願いします。
- バス型ではダイオードが必須。ダイオードの負極(カソード・帯のある側)をスイッチ側へ向けてハンダ付けしてください。マトリックス型では負極をスイッチから離す向き(アノードをスイッチ側)になります。
- エクスプレッションペダル用ポテンショメーター入力にも対応しました。
- バス型でピン13を使う場合、Arduino基板上の内蔵LEDを無効化する必要があります(ハンダ吸い取りで除去するか、精密ペンチで慎重に潰す)。
- バスバーが「リン青銅」製の場合、接触不良が起きやすく信頼性が下がります。全バス/全接点をそれぞれ束ねて配線すれば改善しますが、リン青銅バスには12Vキーリングが推奨されます(本プロジェクトでは非対応)。
エクスプレッションペダル用ハードウェア(ポテンショメーター取り付け)

将来的に詳細を追記予定ですが、現在の設計を簡単に説明します。ペダル連結部にはホームセンター入手の「L字ブラケット」を使用(既存ブラケットに追加、またはペダル直付け用にもう1個)。機械ねじ+ナット+ワッシャー2枚で緩めに固定し、可動域を確保。金属ロッド(1/4インチアルミニウム棒)の一方にアイボルトをJ-B Weldで接着、もう一方をL字ブラケットに機械ねじで固定。
ポテンショメーター取り付けベースは透明アクリル板をホビーナイフでスコア入れて折り、必要サイズにカット。小さなアクリル片でポテンショメーターを嵩上げし、接合面をサンディングしてJ-B Weldで接着、木工用クランプで24時間固定。穴あけは電気ドリルで実施。
ベース下部を小型家具用ヒンジで固定(M4機械ねじ)、ヒンジもう一方をオルガン床板に木ねじで固定。ヒンジ形状によりアクリル板と床の間にスペーサー用ブラケットを追加。ロッド通し用のPTFE(テフロン)ブロックをロボットパーツ通販で購入、ホビーソーでカットし3穴ドリル加工、機械ねじでアクリルブラケットに固定。
エクスプレッションペダルブラケット詳細手順(2021/12/9更新)
材料
- 8×10インチ アクリル板
- テフロンブロック
- アルミニウム棒 1/4インチ(ホームセンター/金属材料店)
- J-B Weld
- リニアポテンショメーター(スライド型10kΩ)
- 小型家具用ヒンジ
- 小型家具用ブラケット
- 小型アイボルト
- 短いM4木ねじ
- 各種金物:テフロンロックワッシャー×1+対応機械ねじ(ペダル取り付け用)、機械ねじ×2・ワッシャー×4・ナット×2(テフロンブロック固定用)、機械ねじ(ブラケット-ロッド接続用)、機械ねじ×2・ワッシャー×4・ナット×2(ヒンジ-アクリル固定用)
工具
- ホビーナイフ、定規
- 精密ドライバー/普通ドライバー
- モンキーレンチ
- ペンチ、電気ドリル・ドリルビット
- ホビーソー、ベンチバイス
- 小型木工クランプ、耐水ペーパー(細目)
- アイス棒・段ボール切れ端、濡れ布巾
手順
- 現在のペダル取り付けブラケットを確認。空き穴があればそれを使用、なければ既存ねじ穴に長めの機械ねじを通して併用。
- オルガン底板の内側に電子部品がないか確認、あれば退避。
- アクリル板を3″×4.5″、3″×0.5″、2.4″×0.3″の3ピースにカット(スコア入れ→バイスで折る・ペンチで割る。保護メガネ着用)。
- テフロンブロックをホビーソーで約3/4″カットし、3″×1.5″×3/4″ブロックを作成。
- 大アクリル板底辺にヒンジ合わせで2穴、テフロンブロック3″×1.5″面にロッド通し邪魔にならない位置で2穴。大アクリル板上部(テフロンブロック取り付け位置)にテフロンブロック穴と合う2穴。小アクリル片(2.4″×0.3″)にヒンジ反対側合わせで2穴。
- ポテンショメーター底面、大アクリル板接着面、3″×0.5″片の両面をサンディング、濡れ布巾で拭く。
- J-B Weldを段ボール上でアイス棒で混ぜ、大アクリル板→3″×0.5″片→さらにJ-B Weld→ポテンショメーターの順で積層、クランプで軽く固定し24時間硬化。
- テフロンブロックに1/4″ドリルビットで貫通穴(ロッド軸線=ポテンショメーター可動軸と一致させる)。
- アルミニウム棒を、ポテンショメーター底面からペダル全押し込み位置までの長さにカット。
- J-B Weld硬化後、ヒンジとテフロンブロックを機械ねじ・ワッシャー・ナットで大アクリル板に固定。ポテンショメーター可動軸のアイボルトをロッドに通し、テフロンブロックへ挿入。ガタがある場合はこの段階でアイボルトもJ-B Weld接着(その場合は先にアイボルトを通してからテフロンブロック固定)。
- ペンチでアイボルト位置を保持し、家具用ブラケットをロッドもう一方の端に機械ねじで固定。向きに注意。
- ペダルブラケットの空き穴に新しい機械ねじ→テフロンロックワッシャー→ナットで締め、ブラケットが自由に動くトルクに調整。既存ねじ穴を使う場合は古いねじを外し、長めのねじで同様に固定し、余ったねじ山にブラケット+ロックワッシャーを追加。
- ヒンジ下部をオルガン内部底面で前後スライドさせ、ロッドが真っ直ぐになり、小アクリル片が位置する場所でペダル動きとポテンショメーター動きが最も一致する位置を探す。木ねじ2本でヒンジ下部を底板に固定(アクリル板がヒンジと底板の間に入るように)。
最後に
Arduino Project Hubの投稿/質問には通知が来ないようです。より速い返信をご希望の場合は、以下のフォーラムページに投稿してください(通知が届きます)。
プログラムコード
ご自身の鍵盤構造に合った方を選んで書き込んでください。
マトリックス型鍵盤用コード
// Name: Arduino Mega Midi Controller v21
// Created: Feb 4, 2021
// Author: Larason2
// Acknowledgements: Bald Engineer, Amanda Ghassaei, jeffb42, GrumpyMike
byte keysA[11][6]; // 鍵盤A(Upper Manual)
byte keysB[11][6]; // 鍵盤B(Lower Manual)
byte keysC[7][6]; // ペダルボード
byte lastA[11][6];
byte lastB[11][6];
byte lastC[7][6];
int noteOn1 = 144; // Ch1 Note On
int noteOff1 = 128; // Ch1 Note Off
int noteOn2 = 145; // Ch2 Note On
int noteOff2 = 129; // Ch2 Note Off
int noteOn3 = 146; // Ch3 Note On
int noteOff3 = 130; // Ch3 Note Off
int velocity = 100;
int chan6 = 181; // Ch6 Control Change
int chan7 = 182; // Ch7 Control Change
int Exp = 11; // Expression Controller
int LastPot6 = 1;
int LastPot7 = 1;
void setup() {
Serial.begin(31250); // MIDIボーレート
// 鍵盤A ピン初期化(行: 2,22-52偶数、列: 32-52偶数)
pinMode(2, INPUT); pinMode(22, INPUT); pinMode(24, INPUT); pinMode(26, INPUT);
pinMode(28, INPUT); pinMode(30, INPUT); pinMode(32, INPUT); pinMode(34, INPUT);
pinMode(36, INPUT); pinMode(38, INPUT); pinMode(40, INPUT); pinMode(42, INPUT);
pinMode(44, INPUT); pinMode(46, INPUT); pinMode(48, INPUT); pinMode(50, INPUT);
pinMode(52, INPUT);
// 鍵盤B ピン初期化(行: 3,23-53奇数、列: 33-53奇数)
pinMode(3, INPUT); pinMode(23, INPUT); pinMode(25, INPUT); pinMode(27, INPUT);
pinMode(29, INPUT); pinMode(31, INPUT); pinMode(33, INPUT); pinMode(35, INPUT);
pinMode(37, INPUT); pinMode(39, INPUT); pinMode(41, INPUT); pinMode(43, INPUT);
pinMode(45, INPUT); pinMode(47, INPUT); pinMode(49, INPUT); pinMode(51, INPUT);
pinMode(53, INPUT);
// ペダルボード ピン初期化(アナログピン使用)
pinMode(A2, INPUT); pinMode(A3, INPUT); pinMode(A4, INPUT); pinMode(A5, INPUT);
pinMode(A6, INPUT); pinMode(A7, INPUT); pinMode(A8, INPUT); pinMode(A9, INPUT);
pinMode(A10, INPUT); pinMode(A11, INPUT); pinMode(A12, INPUT); pinMode(A13, INPUT);
pinMode(A14, INPUT);
}
void loop() {
// --- 鍵盤A 読み取り(6行×11列) ---
// 行ピンをプルアップ入力、列ピンを順次ローレベル出力してスキャン
pinMode(22, INPUT_PULLUP); pinMode(24, INPUT_PULLUP); pinMode(26, INPUT_PULLUP);
pinMode(28, INPUT_PULLUP); pinMode(30, INPUT_PULLUP); pinMode(2, INPUT_PULLUP);
pinMode(32, OUTPUT); digitalWrite(32, LOW);
keysA[0][0] = digitalRead(2);
pinMode(32, INPUT);
pinMode(34, OUTPUT); digitalWrite(34, LOW);
keysA[1][0] = digitalRead(22); keysA[1][1] = digitalRead(24); keysA[1][2] = digitalRead(26);
keysA[1][3] = digitalRead(28); keysA[1][4] = digitalRead(30); keysA[1][5] = digitalRead(2);
pinMode(34, INPUT);
pinMode(36, OUTPUT); digitalWrite(36, LOW);
keysA[2][0] = digitalRead(22); keysA[2][1] = digitalRead(24); keysA[2][2] = digitalRead(26);
keysA[2][3] = digitalRead(28); keysA[2][4] = digitalRead(30); keysA[2][5] = digitalRead(2);
pinMode(36, INPUT);
pinMode(38, OUTPUT); digitalWrite(38, LOW);
keysA[3][0] = digitalRead(22); keysA[3][1] = digitalRead(24); keysA[3][2] = digitalRead(26);
keysA[3][3] = digitalRead(28); keysA[3][4] = digitalRead(30); keysA[3][5] = digitalRead(2);
pinMode(38, INPUT);
pinMode(40, OUTPUT); digitalWrite(40, LOW);
keysA[4][0] = digitalRead(22); keysA[4][1] = digitalRead(24); keysA[4][2] = digitalRead(26);
keysA[4][3] = digitalRead(28); keysA[4][4] = digitalRead(30); keysA[4][5] = digitalRead(2);
pinMode(40, INPUT);
pinMode(42, OUTPUT); digitalWrite(42, LOW);
keysA[5][0] = digitalRead(22); keysA[5][1] = digitalRead(24); keysA[5][2] = digitalRead(26);
keysA[5][3] = digitalRead(28); keysA[5][4] = digitalRead(30); keysA[5][5] = digitalRead(2);
pinMode(42, INPUT);
pinMode(44, OUTPUT); digitalWrite(44, LOW);
keysA[6][0] = digitalRead(22); keysA[6][1] = digitalRead(24); keysA[6][2] = digitalRead(26);
keysA[6][3] = digitalRead(28); keysA[6][4] = digitalRead(30); keysA[6][5] = digitalRead(2);
pinMode(44, INPUT);
pinMode(46, OUTPUT); digitalWrite(46, LOW);
keysA[7][0] = digitalRead(22); keysA[7][1] = digitalRead(24); keysA[7][2] = digitalRead(26);
keysA[7][3] = digitalRead(28); keysA[7][4] = digitalRead(30); keysA[7][5] = digitalRead(2);
pinMode(46, INPUT);
pinMode(48, OUTPUT); digitalWrite(48, LOW);
keysA[8][0] = digitalRead(22); keysA[8][1] = digitalRead(24); keysA[8][2] = digitalRead(26);
keysA[8][3] = digitalRead(28); keysA[8][4] = digitalRead(30); keysA[8][5] = digitalRead(2);
pinMode(48, INPUT);
pinMode(50, OUTPUT); digitalWrite(50, LOW);
keysA[9][0] = digitalRead(22); keysA[9][1] = digitalRead(24); keysA[9][2] = digitalRead(26);
keysA[9][3] = digitalRead(28); keysA[9][4] = digitalRead(30); keysA[9][5] = digitalRead(2);
pinMode(50, INPUT);
pinMode(52, OUTPUT); digitalWrite(52, LOW);
keysA[10][0] = digitalRead(22); keysA[10][1] = digitalRead(24); keysA[10][2] = digitalRead(26);
keysA[10][3] = digitalRead(28); keysA[10][4] = digitalRead(30); keysA[10][5] = digitalRead(2);
pinMode(52, INPUT);
// 行ピンを元の入力モードに戻す
pinMode(22, INPUT); pinMode(24, INPUT); pinMode(26, INPUT);
pinMode(28, INPUT); pinMode(30, INPUT); pinMode(2, INPUT);
// --- 鍵盤B 読み取り(同様) ---
pinMode(23, INPUT_PULLUP); pinMode(25, INPUT_PULLUP); pinMode(27, INPUT_PULLUP);
pinMode(29, INPUT_PULLUP); pinMode(31, INPUT_PULLUP); pinMode(3, INPUT_PULLUP);
pinMode(33, OUTPUT); digitalWrite(33, LOW);
keysB[0][0] = digitalRead(3);
pinMode(33, INPUT);
pinMode(35, OUTPUT); digitalWrite(35, LOW);
keysB[1][0] = digitalRead(23); keysB[1][1] = digitalRead(25); keysB[1][2] = digitalRead(27);
keysB[1][3] = digitalRead(29); keysB[1][4] = digitalRead(31); keysB[1][5] = digitalRead(3);
pinMode(35, INPUT);
pinMode(37, OUTPUT); digitalWrite(37, LOW);
keysB[2][0] = digitalRead(23); keysB[2][1] = digitalRead(25); keysB[2][2] = digitalRead(27);
keysB[2][3] = digitalRead(29); keysB[2][4] = digitalRead(31); keysB[2][5] = digitalRead(3);
pinMode(37, INPUT);
pinMode(39, OUTPUT); digitalWrite(39, LOW);
keysB[3][0] = digitalRead(23); keysB[3][1] = digitalRead(25); keysB[3][2] = digitalRead(27);
keysB[3][3] = digitalRead(29); keysB[3][4] = digitalRead(31); keysB[3][5] = digitalRead(3);
pinMode(39, INPUT);
pinMode(41, OUTPUT); digitalWrite(41, LOW);
keysB[4][0] = digitalRead(23); keysB[4][1] = digitalRead(25); keysB[4][2] = digitalRead(27);
keysB[4][3] = digitalRead(29); keysB[4][4] = digitalRead(31); keysB[4][5] = digitalRead(3);
pinMode(41, INPUT);
pinMode(43, OUTPUT); digitalWrite(43, LOW);
keysB[5][0] = digitalRead(23); keysB[5][1] = digitalRead(25); keysB[5][2] = digitalRead(27);
keysB[5][3] = digitalRead(29); keysB[5][4] = digitalRead(31); keysB[5][5] = digitalRead(3);
pinMode(43, INPUT);
pinMode(45, OUTPUT); digitalWrite(45, LOW);
keysB[6][0] = digitalRead(23); keysB[6][1] = digitalRead(25); keysB[6][2] = digitalRead(27);
keysB[6][3] = digitalRead(29); keysB[6][4] = digitalRead(31); keysB[6][5] = digitalRead(3);
pinMode(45, INPUT);
pinMode(47, OUTPUT); digitalWrite(47, LOW);
keysB[7][0] = digitalRead(23); keysB[7][1] = digitalRead(25); keysB[7][2] = digitalRead(27);
keysB[7][3] = digitalRead(29); keysB[7][4] = digitalRead(31); keysB[7][5] = digitalRead(3);
pinMode(47, INPUT);
pinMode(49, OUTPUT); digitalWrite(49, LOW);
keysB[8][0] = digitalRead(23); keysB[8][1] = digitalRead(25); keysB[8][2] = digitalRead(27);
keysB[8][3] = digitalRead(29); keysB[8][4] = digitalRead(31); keysB[8][5] = digitalRead(3);
pinMode(49, INPUT);
pinMode(51, OUTPUT); digitalWrite(51, LOW);
keysB[9][0] = digitalRead(23); keysB[9][1] = digitalRead(25); keysB[9][2] = digitalRead(27);
keysB[9][3] = digitalRead(29); keysB[9][4] = digitalRead(31); keysB[9][5] = digitalRead(3);
pinMode(51, INPUT);
pinMode(53, OUTPUT); digitalWrite(53, LOW);
keysB[10][0] = digitalRead(23); keysB[10][1] = digitalRead(25); keysB[10][2] = digitalRead(27);
keysB[10][3] = digitalRead(29); keysB[10][4] = digitalRead(31); keysB[10][5] = digitalRead(3);
pinMode(53, INPUT);
pinMode(23, INPUT); pinMode(25, INPUT); pinMode(27, INPUT);
pinMode(29, INPUT); pinMode(31, INPUT); pinMode(3, INPUT);
// --- ペダルボード読み取り(6行×7列、NCスイッチなので反転処理) ---
pinMode(A3, INPUT_PULLUP); pinMode(A4, INPUT_PULLUP); pinMode(A5, INPUT_PULLUP);
pinMode(A6, INPUT_PULLUP); pinMode(A7, INPUT_PULLUP); pinMode(A2, INPUT_PULLUP);
pinMode(A8, OUTPUT); digitalWrite(A8, LOW);
keysC[0][0] = digitalRead(A2);
pinMode(A8, INPUT);
pinMode(A9, OUTPUT); digitalWrite(A9, LOW);
keysC[1][0] = digitalRead(A3); keysC[1][1] = digitalRead(A4); keysC[1][2] = digitalRead(A5);
keysC[1][3] = digitalRead(A6); keysC[1][4] = digitalRead(A7); keysC[1][5] = digitalRead(A2);
pinMode(A9, INPUT);
pinMode(A10, OUTPUT); digitalWrite(A10, LOW);
keysC[2][0] = digitalRead(A3); keysC[2][1] = digitalRead(A4); keysC[2][2] = digitalRead(A5);
keysC[2][3] = digitalRead(A6); keysC[2][4] = digitalRead(A7); keysC[2][5] = digitalRead(A2);
pinMode(A10, INPUT);
pinMode(A11, OUTPUT); digitalWrite(A11, LOW);
keysC[3][0] = digitalRead(A3); keysC[3][1] = digitalRead(A4); keysC[3][2] = digitalRead(A5);
keysC[3][3] = digitalRead(A6); keysC[3][4] = digitalRead(A7); keysC[3][5] = digitalRead(A2);
pinMode(A11, INPUT);
pinMode(A12, OUTPUT); digitalWrite(A12, LOW);
keysC[4][0] = digitalRead(A3); keysC[4][1] = digitalRead(A4); keysC[4][2] = digitalRead(A5);
keysC[4][3] = digitalRead(A6); keysC[4][4] = digitalRead(A7); keysC[4][5] = digitalRead(A2);
pinMode(A12, INPUT);
pinMode(A13, OUTPUT); digitalWrite(A13, LOW);
keysC[5][0] = digitalRead(A3); keysC[5][1] = digitalRead(A4); keysC[5][2] = digitalRead(A5);
keysC[5][3] = digitalRead(A6); keysC[5][4] = digitalRead(A7); keysC[5][5] = digitalRead(A2);
pinMode(A13, INPUT);
pinMode(A14, OUTPUT); digitalWrite(A14, LOW);
keysC[6][0] = digitalRead(A3);
pinMode(A14, INPUT);
// 行ピンを元に戻す
pinMode(A3, INPUT); pinMode(A4, INPUT); pinMode(A5, INPUT);
pinMode(A6, INPUT); pinMode(A7, INPUT); pinMode(A2, INPUT);
// NCスイッチ用データ反転
for (int c = 0; c < 7; c++) {
for (int r = 0; r < (c==0 || c==6 ? 1 : 6); r++) {
keysC[c][r] = keysC[c][r] == 0 ? 1 : 0;
}
}
// --- MIDI送信: 鍵盤A (Ch1, Note 36-96) ---
// 状態変化検出でNote On/Off送信(last配列で前回状態管理)
// ※ 以下、全鍵分を展開(冗長だが確実)。ループ化も可能だが元コード踏襲。
// ここでは代表的な数鍵のみ掲載し、パターンを示す。完全版は元ソース参照。
// 例: A36 (keysA[0][0])
if (keysA[0][0]==0 && lastA[0][0]==0) { MidiSend(noteOn1, 36, velocity); lastA[0][0]=7; }
if (keysA[0][0]==1 && lastA[0][0]==7) { MidiSend(noteOff1, 36, velocity); lastA[0][0]=0; }
// 以降、keysA[1][0]→Note37, keysA[1][1]→Note38 ... keysA[10][5]→Note96 まで同様
// --- 鍵盤B (Ch2, Note 36-96) ---
// 同様のパターンで lastB 使用
// --- ペダルボード (Ch3, Note 36-67) ---
// NC反転済みなので、keysC==0 で NoteOn, ==1 で NoteOff
// 例: C36 (keysC[0][0])
if (keysC[0][0]==0 && lastC[0][0]==0) { MidiSend(noteOff3, 36, velocity); lastC[0][0]=7; }
if (keysC[0][0]==1 && lastC[0][0]==7) { MidiSend(noteOn3, 36, velocity); lastC[0][0]=0; }
// 以降 keysC[6][0]→Note67 まで同様
// --- エクスプレッションペダル (アナログピン0→Ch6, ピン1→Ch7) ---
int Cur6 = analogRead(0);
int Map6 = map(Cur6, 0, 1023, 0, 127);
if (abs(Cur6 - LastPot6) >= 8) { MidiSend(chan6, Exp, Map6); LastPot6 = Cur6; }
int Cur7 = analogRead(1);
int Map7 = map(Cur7, 0, 1023, 0, 127);
if (abs(Cur7 - LastPot7) >= 8) { MidiSend(chan7, Exp, Map7); LastPot7 = Cur7; }
}
void MidiSend(int one, int two, int three) {
Serial.write(one); Serial.write(two); Serial.write(three);
}
バス型鍵盤用コード
// Name: Arduino Mega Midi Controller 61x4 plus 3 potentiometers
// Version 1.0
// Created: April 12, 2021
// Author: Larason2
// Acknowledgements: Bald Engineer, Amanda Ghassaei, jeffb42, GrumpyMike
// 4鍵盤分(61鍵×11列相当のバス配線)
byte keysA[11][6], keysB[11][6], keysC[11][6], keysD[11][6];
byte lastA[11][6], lastB[11][6], lastC[11][6], lastD[11][6];
int noteOn1=144, noteOff1=128, noteOn2=145, noteOff2=129;
int noteOn3=146, noteOff3=130, noteOn4=147, noteOff4=131;
int velocity=100;
int chan6=181, chan7=182, chan8=183, Exp=11;
int LastPot6=1, LastPot7=1, LastPot8=1;
void setup() {
Serial.begin(31250);
// ピン2-53, A0-A8 を入力初期化
for (int p=2; p<=53; p++) pinMode(p, INPUT);
for (int p=A0; p<=A8; p++) pinMode(p, INPUT);
// 列選択ピン
pinMode(A9, INPUT); pinMode(A10, INPUT); pinMode(A11, INPUT); pinMode(A12, INPUT);
// ポテンショメーターピン
pinMode(A13, INPUT); pinMode(A14, INPUT); pinMode(A15, INPUT);
}
void loop() {
// 全キーピンをプルアップ
for (int p=2; p<=53; p++) pinMode(p, INPUT_PULLUP);
for (int p=A0; p<=A8; p++) pinMode(p, INPUT_PULLUP);
// --- 鍵盤A: 列A9をローレベルでスキャン ---
pinMode(A9, OUTPUT); digitalWrite(A9, LOW);
// 61鍵を keysA[11][6] にマッピングして読み取り(ピン2-53, A0-A8 順)
// 以下、読み取りコードは冗長のため省略。元ソースは全展開されています。
pinMode(A9, INPUT);
// --- 鍵盤B: 列A10 ---
pinMode(A10, OUTPUT); digitalWrite(A10, LOW);
// 同様に keysB へ読み取り
pinMode(A10, INPUT);
// --- 鍵盤C: 列A11 ---
pinMode(A11, OUTPUT); digitalWrite(A11, LOW);
// 同様に keysC へ読み取り
pinMode(A11, INPUT);
// --- 鍵盤D: 列A12 ---
pinMode(A12, OUTPUT); digitalWrite(A12, LOW);
// 同様に keysD へ読み取り
pinMode(A12, INPUT);
// 全ピンを入力モードに戻す
for (int p=2; p<=53; p++) pinMode(p, INPUT);
for (int p=A0; p<=A8; p++) pinMode(p, INPUT);
pinMode(A9, INPUT); pinMode(A10, INPUT); pinMode(A11, INPUT); pinMode(A12, INPUT);
pinMode(A13, INPUT); pinMode(A14, INPUT); pinMode(A15, INPUT);
// ※ NCスイッチ用反転処理はコメントアウト済み(必要なら有効化)
// --- MIDI送信: 4鍵盤分 + 3ポテンショメーター ---
// 鍵盤A-D 各々 last配列でエッジ検出し Note On/Off 送信
// パターンはマトリックス版と同様(チャネルと配列名が異なるのみ)
// エクスプレッションペダル (A13→Ch6, A14→Ch7, A15→Ch8)
int Cur6 = analogRead(13); int Map6 = map(Cur6, 0, 1023, 0, 127);
if (abs(Cur6 - LastPot6) >= 8) { MidiSend(chan6, Exp, Map6); LastPot6 = Cur6; }
int Cur7 = analogRead(14); int Map7 = map(Cur7, 0, 1023, 0, 127);
if (abs(Cur7 - LastPot7) >= 8) { MidiSend(chan7, Exp, Map7); LastPot7 = Cur7; }
int Cur8 = analogRead(15); int Map8 = map(Cur8, 0, 1023, 0, 127);
if (abs(Cur8 - LastPot8) >= 8) { MidiSend(chan8, Exp, Map8); LastPot8 = Cur8; }
}
void MidiSend(int one, int two, int three) {
Serial.write(one); Serial.write(two); Serial.write(three);
}
回路図
- 6×11マトリックス鍵盤/ペダルボード + ポテンショメーター入力 配線図
- バス型鍵盤 + ポテンショメーター入力 配線図
製造プロセス
- デジタル変革成功の戦略的青写真:失敗を避け、確実なROIを実現する
- Eclipse Ditto 1.0 —— デジタルツイン開発のための「デバイス・アズ・ア・サービス」プラットフォーム
- 2020年を形作るトップ3デジタル製造トレンド
- インバー36部品:材料、特性、信頼できる購入先
- カーペット業界向けデジタル切断ソリューション – OMNI CNC
- 自動車ソフトウェアコンポーネントのISO 26262認証取得
- IoTデバイス向け堅牢なクラウドベース・ソフトウェア・アップデート
- デジタルアセット管理(DAM)完全ガイド:データ駆動型資産エクセレンスへの包括的戦略
- ULによる難燃性プラスチック部品の包括的試験
- プラスチック部品接合の4大実証済み技術:メカニカル、溶剤、UV、超音波
- ポリプラスチックス、自動車外装部品向け高性能ガラス入りPETグレード「RH030」「RH045」を発表