工業製造
産業用モノのインターネット | 工業材料 | 機器のメンテナンスと修理 | 産業プログラミング |
home  MfgRobots >> 工業製造 >  >> Manufacturing Technology >> 製造プロセス

オルガンコンソールの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ソケット使用時)

必要な工具

使用するアプリ・オンラインサービス

プロジェクト概要

古いオルガンコンソールを改造し、鍵盤(マニュアル)とペダルボードからハードウェアMIDIメッセージを出力できるようにするプロジェクトです。単一のArduino Megaで複数の鍵盤とペダルを処理します。

当初は元の音源回路を残したままMIDI出力のみを追加しようとしましたが、既存回路のリバースエンジニアリングが困難だったため、マトリックス型とバス型の両方に対応したコードを開発しました。

⚠ 重要な注意事項

  • この改造を行うと、元の鍵盤スイッチング機能は動作しなくなります。
  • オルガン内部には危険な電気部品があります。必ず電源プラグを抜き、十分な電子工作経験とスキルがある場合のみ作業してください。不安な場合は専門技術者に相談してください。
  • 古いオルガンの部品は経年劣化しており、改造によって破損する恐れがあります。本手順の実行は自己責任で行い、著者は一切の責任を負いません。

製作手順

ステップ1:オルガンを調査する

ステップ2:Arduinoを固定する

Arduino Mega付属のプラスチックプレートを木部に小ねじ(M4相当)で固定し、Arduinoを機械ねじでプレートに取り付けます。まずArduino位置を決めてからケーブル長を見積もるとスムーズです。この段階でArduinoへの給電方法も検討します。

ステップ3:ケーブルを準備する

マトリックス型鍵盤

各鍵盤61鍵。本例では6行×11列(マニュアル)/ 7列(ペダル)のマトリックス。行配線は6鍵ごとに共通、列はダイオードを介して配線されています。各分割点からArduinoまで届く長さのAWMケーブルを2本ずつ(行用・列用)切り出し、余裕を持たせて整理しやすい経路で配線します。列側は鍵盤/ペダルの長さ分延ばしてからArduinoへ向けると綺麗にまとまります。各ケーブルの端をニッパーで芯線分離し、ストリッパーで被覆を剥きます。

バス型鍵盤

鍵盤を6本のAWMケーブル(各10芯)に分割し、61鍵目は単独のリード線で対応。同様に端末処理を行います。

ステップ4:ケーブル端をピンヘッダーにハンダ付け

マトリックス/バス両方共通:適切なケーブル端をピンヘッダーピンにハンダ付けするか、ネジ端子基板を使う場合は端子に固定します。

オルガンコンソールのMIDI化:部品選定とセットアップガイド

ステップ5:ケーブルもう一方をスイッチへハンダ付け

マトリックス型

既存配線がある場合は、元のコンピューターへ行く配線をハンダ吸い取り/ニッパーで切断。行配線(6鍵ごとの共通線)は流用し、元の位置から外してArduino用6本線をハンダ付け。列側は既存ダイオードの出力側を切り離し、Arduino用列線をダイオード出力にハンダ付け。配線は結束バンドで既存配線に沿って整理。ペダルボードは前面パネルを外して中央の穴からケーブルを通しました。

バス型

バス側ではない各スイッチ端子にダイオードをハンダ付け(負極をスイッチ側へ)、そこから10芯ケーブルの各線へ接続。6本のケーブルすべてで同様に行い、61鍵目も同様に処理。

ステップ6:MIDIプラグに抵抗をハンダ付け、Arduinoへ接続

MIDI OUT回路:DINプラグのピン5(出力)に220Ω抵抗、ピン4(電源)をArduino 5V、ピン2(GND)をGNDへ接続。ピン1,3は未接続。

オルガンコンソールのMIDI化:部品選定とセットアップガイド

ステップ7:ピンヘッダーをArduinoへ接続

回路図に従ってすべてのヘッダーをArduinoに挿入します。
代替案:IDCソケットをケーブル端に圧着/ハンダ付けし、オス-オスジャンパーでArduinoへ接続する方法もあります。こちらは永続的ではありませんが、コード修正で再配線が必要な場合に便利です。

ステップ8:ソフトウェアをArduinoへ書き込む

ステップ9:動作テスト

補足事項

エクスプレッションペダル用ハードウェア(ポテンショメーター取り付け)

オルガンコンソールのMIDI化:部品選定とセットアップガイド

将来的に詳細を追記予定ですが、現在の設計を簡単に説明します。ペダル連結部にはホームセンター入手の「L字ブラケット」を使用(既存ブラケットに追加、またはペダル直付け用にもう1個)。機械ねじ+ナット+ワッシャー2枚で緩めに固定し、可動域を確保。金属ロッド(1/4インチアルミニウム棒)の一方にアイボルトをJ-B Weldで接着、もう一方をL字ブラケットに機械ねじで固定。

ポテンショメーター取り付けベースは透明アクリル板をホビーナイフでスコア入れて折り、必要サイズにカット。小さなアクリル片でポテンショメーターを嵩上げし、接合面をサンディングしてJ-B Weldで接着、木工用クランプで24時間固定。穴あけは電気ドリルで実施。

ベース下部を小型家具用ヒンジで固定(M4機械ねじ)、ヒンジもう一方をオルガン床板に木ねじで固定。ヒンジ形状によりアクリル板と床の間にスペーサー用ブラケットを追加。ロッド通し用のPTFE(テフロン)ブロックをロボットパーツ通販で購入、ホビーソーでカットし3穴ドリル加工、機械ねじでアクリルブラケットに固定。

エクスプレッションペダルブラケット詳細手順(2021/12/9更新)

材料

工具

手順

  1. 現在のペダル取り付けブラケットを確認。空き穴があればそれを使用、なければ既存ねじ穴に長めの機械ねじを通して併用。
  2. オルガン底板の内側に電子部品がないか確認、あれば退避。
  3. アクリル板を3″×4.5″、3″×0.5″、2.4″×0.3″の3ピースにカット(スコア入れ→バイスで折る・ペンチで割る。保護メガネ着用)。
  4. テフロンブロックをホビーソーで約3/4″カットし、3″×1.5″×3/4″ブロックを作成。
  5. 大アクリル板底辺にヒンジ合わせで2穴、テフロンブロック3″×1.5″面にロッド通し邪魔にならない位置で2穴。大アクリル板上部(テフロンブロック取り付け位置)にテフロンブロック穴と合う2穴。小アクリル片(2.4″×0.3″)にヒンジ反対側合わせで2穴。
  6. ポテンショメーター底面、大アクリル板接着面、3″×0.5″片の両面をサンディング、濡れ布巾で拭く。
  7. J-B Weldを段ボール上でアイス棒で混ぜ、大アクリル板→3″×0.5″片→さらにJ-B Weld→ポテンショメーターの順で積層、クランプで軽く固定し24時間硬化。
  8. テフロンブロックに1/4″ドリルビットで貫通穴(ロッド軸線=ポテンショメーター可動軸と一致させる)。
  9. アルミニウム棒を、ポテンショメーター底面からペダル全押し込み位置までの長さにカット。
  10. J-B Weld硬化後、ヒンジとテフロンブロックを機械ねじ・ワッシャー・ナットで大アクリル板に固定。ポテンショメーター可動軸のアイボルトをロッドに通し、テフロンブロックへ挿入。ガタがある場合はこの段階でアイボルトもJ-B Weld接着(その場合は先にアイボルトを通してからテフロンブロック固定)。
  11. ペンチでアイボルト位置を保持し、家具用ブラケットをロッドもう一方の端に機械ねじで固定。向きに注意。
  12. ペダルブラケットの空き穴に新しい機械ねじ→テフロンロックワッシャー→ナットで締め、ブラケットが自由に動くトルクに調整。既存ねじ穴を使う場合は古いねじを外し、長めのねじで同様に固定し、余ったねじ山にブラケット+ロックワッシャーを追加。
  13. ヒンジ下部をオルガン内部底面で前後スライドさせ、ロッドが真っ直ぐになり、小アクリル片が位置する場所でペダル動きとポテンショメーター動きが最も一致する位置を探す。木ねじ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);
}

回路図

製造プロセス

  1. デジタル変革成功の戦略的青写真:失敗を避け、確実なROIを実現する
  2. Eclipse Ditto 1.0 —— デジタルツイン開発のための「デバイス・アズ・ア・サービス」プラットフォーム
  3. 2020年を形作るトップ3デジタル製造トレンド
  4. インバー36部品:材料、特性、信頼できる購入先
  5. カーペット業界向けデジタル切断ソリューション – OMNI CNC
  6. 自動車ソフトウェアコンポーネントのISO 26262認証取得
  7. IoTデバイス向け堅牢なクラウドベース・ソフトウェア・アップデート
  8. デジタルアセット管理(DAM)完全ガイド:データ駆動型資産エクセレンスへの包括的戦略
  9. ULによる難燃性プラスチック部品の包括的試験
  10. プラスチック部品接合の4大実証済み技術:メカニカル、溶剤、UV、超音波
  11. ポリプラスチックス、自動車外装部品向け高性能ガラス入りPETグレード「RH030」「RH045」を発表