編集履歴一覧に戻る
lipoyangのアイコン画像

lipoyang が 2025年01月15日16時43分18秒 に編集

コメント無し

本文の変更

-

# 1. コンセプト

+

# コンセプト

大正琴という楽器をご存じでしょうか? 大正琴は大正時代に考案された楽器で、左手で鍵盤を押さえ、右手のピックで弦を弾いて演奏するのが特徴です。現在ではアンプで音を増幅する電気大正琴や、シンセサイザーでさまざまな音色を出せる電子大正琴も存在します。 ![大正琴](https://camo.elchika.com/9c415448bb1a35b2b66dee092f042749965ded6c/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f65363836663263622d316331322d343731392d623966382d3934363239653238386636312f36303539333464372d386264382d343539372d383033642d303135663561636436323261/) 「大正こンパクと」は省スペースを追求した新しい電子大正琴です。8個のキーと4本の弦で2オクターブ以上の音域をカバーします。

-

# 2. 動画

+

# 動画

@[youtube](https://www.youtube.com/watch?v=B-H45Hiuvkg)

-

# 3. 仕様

+

# 仕様

「大正こンパクと」は ①~⑧の8個のキーと、G線・D線・A線・E線の4本の弦を持ちます。各弦の音域は、G線がG3~D4、D線がD4~A4、A線がA4~E5、E線がE5~B5です。詳しくは下表に示します。 ![キャプションを入力できます](https://camo.elchika.com/f359d23645113bce001b23ff9b2e4e54902b48ea/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f65363836663263622d316331322d343731392d623966382d3934363239653238386636312f66653235376433392d313231652d346262632d616535352d626430326366393436613762/) 4本の弦の振動をエレキギター用のピックアップで検出しますが、どの弦が弾かれたかを周波数で判別できればよいので正確な調律は不要です。スピーカに出力する音は、上記の表にしたがった音程をデジタルで生成します。音の生成にはサンプリング音源データを用い、琴の音色を再現します。 ![キャプションを入力できます](https://camo.elchika.com/aa65b05e774370d49a2d5bdaa239ff09b754b012/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f65363836663263622d316331322d343731392d623966382d3934363239653238386636312f63623938623038632d373832652d346438352d386161342d343634643266636631636634/) 以上の仕様を実装するため、マイコンボードは SPRESENSE を使用しました。 SPRESENSEの拡張ボードは スピーカ出力端子やマイク端子、マイクロSDカードスロットを備えており、またオーディオ系や楽器作りのための豊富なライブラリとサンプルコードも用意されているためです。ピックアップはSPRESENSEのマイク端子に接続します。

-

# 4. ハードウェア ## 主な部品 - SPRESENSEメインボード および 拡張ボード - ピックアップ (4弦エレキギター用) - D級アンプモジュール (PAM8403使用) - スピーカ - メカニカルキースイッチ : Cherry MXスイッチ (赤軸) - エレギタの弦 : D'Addario EXL110 - ロSDカー - DC/DCコンバータ DC4.5~9V → DC5V / 1A

+

# ハードウェア ## 部品 |名称|型番・備考| |---|---| |SPRESENSEメインボード / 拡張ボード| CXD5602PWBMAIN1 / CXD5602PWBEXT1 | |ピックアップ (4弦エレキギター用) | Amazonで見つけたもの。1弦-4弦間 30mm | | メカニカルキースイッチ | Cherry MXスイッチ (赤軸) × 8個| | キャップ| DSAキーキャップ 赤×4個 (黒鍵用), 黄×4個 (白鍵用)| |スピーカ|8Ω 2W / SS-30-802W | |D級アンプモジュール | PAM8403使用 / MOD602-PAM8403-15SP | |スッチ付きミニジャッ|3.5mmステレオミニジャック スイッチ付き / MJ-352W-C| |音量調整用ボリューム|基板用2連可変抵抗 Aカーブ 10kΩ 6φ軸| |DC/DCコンバータ| DC4.5~9V → DC5V, 1A / OAS6R0-0505 | |主電源スイッチ|超小型波動スイッチ / KCDI-11 2P| |埋め込み電池ボックス| 単三電池4セル用 / タカチ LD-4B|

## 結線図 ![キャプションを入力できます](https://camo.elchika.com/562f3e63465e5370ce7063b7c69b4f10813ae874/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f65363836663263622d316331322d343731392d623966382d3934363239653238386636312f61613139636365612d363235652d343037332d386561612d386263383733306439313665/) ## 製作 上記の結線図の通りに電装系を製作しました。キーボード部の基板はユニバーサル基板で作りました。そのためキーピッチは、2.54mm ×8 = 20.32mm となり、一般的なキーピッチである 3/4インチ = 19.05mm よりやや広くなります。キースイッチの足はユニバーサル基板の穴位置にピッタリは合わないので少し折り曲げてハンダ付けしています。電装系はひとまず下の写真のように適当な板に固定した状態で動作確認してから筐体に組付けます。 ![キャプションを入力できます](https://camo.elchika.com/62d59a84f5def587e8ec13e8f4f765825753e46f/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f65363836663263622d316331322d343731392d623966382d3934363239653238386636312f30643761383934632d613233392d343834362d616564362d306536653838363630636332/)

-

# 5. ソフトウェア

+

## 一口メモ - 夜中でもヘッドホンを使って演奏できるようにスイッチ付きミニジャックを設けました。ヘッドホンを挿すとスピーカからは音が出なくなります。 - SPRESENSE 拡張ボードに搭載のヘッドフォンアンプ NJU72040 は 80mW @ 32Ω と、スピーカを直接駆動するには弱いので、D級アンプを設けました。 - 4弦用のピックアップで弦の間隔が10mm程度のものというのがなかなか見つからず、たまたまAmazonで見つかったものを使用しました。 # ソフトウェア

## 開発環境

-

- IDE : PlatformIO (詳しく→ [PlatformIO で Spresense](https://lipoyang.hatenablog.com/entry/2024/11/12/201737) )

+

- IDE : PlatformIO (環境導入について → [PlatformIO で Spresense](https://lipoyang.hatenablog.com/entry/2024/11/12/201737) )

- フレームワーク : Arduino - 依存ライブラリ : ssprocLib ## 構成 ![キャプションを入力できます](https://camo.elchika.com/66b77567953cdaea9870fa81aee889b976622cbb/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f65363836663263622d316331322d343731392d623966382d3934363239653238386636312f37333036353132622d363731332d343265382d396334312d613962396334623664376230/) ## 弦の振動の検出 SPRESENSEで簡単に楽器を開発するライブラリとして、[Sound Signal Processing Library for Spresense](https://github.com/SonySemiconductorSolutions/ssih-music/) (ssprocLib) が提供されています。ssprocLib の VoiceCapture クラスはマイク端子から入力された音声信号の周波数と音量を解析します。これを利用してピックアップで拾った弦の振動の周波数を解析し、どの弦が弾かれたかを判定します。 VoiceCaptureクラスはメインコアとサブコアが協調動作するようになっており、メインコアでマイク入力をバッファし、サブコアでFFT(周波数解析)を演算します。サブコア側のプログラムは、ssprocLib のサンプルコードの YuruHorn_SubCore1.ino をベースに修正したものを使用します。YuruHorn_SubCore1.ino は人の声を入力するためのものなので、周波数のパラメータなどを変更しました。 メインコア側のプログラムは、VoiceCaptureクラスを継承した Kompactoクラスを作成し、鍵盤入力も受けてノートオン/ノートオフを発行するようにしました。 ```cpp:Kompacto.h #pragma once #include <VoiceCapture.h> // 「大正こンパクと」クラス // VoiceCaptureクラスを継承 (マイク入力からピーク周波数と音量を取得できる) class Kompacto : public VoiceCapture { public: // コンストラクタで鍵盤のピン番号、各弦の周波数、後段を指定 Kompacto(const int* pin_keyboard, const float* f_strings, Filter& filter) : VoiceCapture(filter), PIN_KEYBOARD(pin_keyboard), FREQ_STRINGS(f_strings) {}; // 開始処理をオーバーライド bool begin() override; protected: // サブコアからピーク周波数検出を受けるコールバックをオーバーライド // freq_number : 周波数の分子 // freq_denom : 周波数の分母 (freq_number / freq_denom が Hz単位になる) // volume : 音量 void onCapture(unsigned int freq_numer, unsigned int freq_denom, unsigned int volume) override; private: const int* PIN_KEYBOARD; // キーボードのピン番号のテーブル const float* FREQ_STRINGS; // 弦の周波数のテーブル unsigned int _prev_volume; // 前回の音量 int _detect_cnt; // 有効な検出の連続カウンタ int _last_note; // 各弦の最後の音符 }; ``` ## 琴の音の生成 ssprocLib の SFZSink クラスはSFZ形式のサウンドフォントを利用でき、簡単にサンプリング音源を実装できます。ただし、SFZSink で扱える SFZ にはかなり制約があります。そこで、SFZSink で扱えるSFZに変換するスクリプト [import-sfz.py](https://github.com/SonySemiconductorSolutions/ssih-music/tree/develop/tools) が提供されています。 琴の音色のSFZデータとして、SFZ Instruments から [13 Strings KOTO (Ui_KOTO)](https://sfzinstruments.github.io/folk/koto/) のデータをダウンロードして利用しました。Ui_KOTO には13弦琴の多様な奏法のSFZデータが収録されていますが、その中でもいちばんふつうの奏法のデータと思われる(?) Sustain_Front.sfz を上記の import-sfz.py で変換しました。 ところが、変換した SFZ を SFZSink に与えても音が再生できません。 SFZファイルを確認したところ、かなり複雑な指定がされていました。そこで、サンプルコード用の音源ファイル([assets.zip](https://github.com/SonySemiconductorSolutions/ssih-music/releases/latest/download/assets.zip)) の SawLpf.sfz を参考に手作業で簡単なSFZファイルを作成したところ、再生できました。ポイントとして、SawLpf.sfz は持続的なノコギリ波の音色なので loop_mode=loop_continuous ですが、琴は撥弦楽器であり持続しないので loop_mode=no_loop としました。それにともない、loop_start や loop_end もなくしました。サンプル音源データ(WAVファイル)は、 import-sfz.py で変換されたものを使用しました。 ```xml:koto.sfz <group> loop_mode=no_loop <region> key=50 sample=Koto/050050_Front_d3_Sustain1.wav <region> key=51 sample=Koto/051051_Front_d#3_Sustain1.wav <region> key=52 sample=Koto/052052_Front_e3_Sustain1.wav <region> key=53 sample=Koto/053053_Front_f3_Sustain1.wav <region> key=54 sample=Koto/054054_Front_f#3_Sustain1.wav <region> key=55 sample=Koto/055055_Front_g3_Sustain1.wav <region> key=56 sample=Koto/056056_Front_g#3_Sustain1.wav <region> key=57 sample=Koto/057057_Front_a3_Sustain1.wav <region> key=58 sample=Koto/058058_Front_a#3_Sustain1.wav <region> key=59 sample=Koto/059059_Front_b3_Sustain1.wav <region> key=60 sample=Koto/060060_Front_c4_Sustain1.wav <region> key=61 sample=Koto/061061_Front_c#4_Sustain1.wav <region> key=62 sample=Koto/062062_Front_d4_Sustain1.wav <region> key=63 sample=Koto/063063_Front_d#4_Sustain1.wav <region> key=64 sample=Koto/064064_Front_e4_Sustain1.wav <region> key=65 sample=Koto/065065_Front_f4_Sustain1.wav <region> key=66 sample=Koto/066066_Front_f#4_Sustain1.wav <region> key=67 sample=Koto/067067_Front_g4_Sustain1.wav <region> key=68 sample=Koto/068068_Front_g#4_Sustain1.wav <region> key=69 sample=Koto/069069_Front_a4_Sustain1.wav <region> key=70 sample=Koto/070070_Front_a#4_Sustain1.wav <region> key=71 sample=Koto/071071_Front_b4_Sustain1.wav <region> key=72 sample=Koto/072072_Front_c5_Sustain1.wav <region> key=73 sample=Koto/073073_Front_c#5_Sustain1.wav <region> key=74 sample=Koto/074074_Front_d5_Sustain1.wav <region> key=75 sample=Koto/075075_Front_d#5_Sustain1.wav <region> key=76 sample=Koto/076076_Front_e5_Sustain1.wav <region> key=77 sample=Koto/077077_Front_f5_Sustain1.wav <region> key=78 sample=Koto/078078_Front_f#5_Sustain1.wav <region> key=79 sample=Koto/079079_Front_g5_Sustain1.wav <region> key=80 sample=Koto/080080_Front_g#5_Sustain1.wav <region> key=81 sample=Koto/081081_Front_a5_Sustain1.wav <region> key=82 sample=Koto/082082_Front_a#5_Sustain1.wav <region> key=83 sample=Koto/083083_Front_b5_Sustain1.wav <region> key=84 sample=Koto/084084_Front_c6_Sustain1.wav ``` ## スケッチ ```cpp:main.cpp #include <SFZSink.h> #include "Kompacto.h" // 鍵盤のキー1~8のピン番号 static const int PIN_KEYBOARD[] = { PIN_D00, PIN_D01, PIN_D02, PIN_D03, PIN_D04, PIN_D05, PIN_D06, PIN_D07 }; // 各弦の判定周波数[Hz] (音階とは特に関係なく、調整しやすい周波数でよい) static const float FREQ_STRINGS[]={ 1000.0F, // G線 1500.0F, // D線 2000.0F, // A線 2500.0F, // E線 }; // 琴のSFZデータを指定してSinkを生成 SFZSink sink("Koto.sfz"); // 定数とSinkを指定して楽器を生成 Kompacto inst(PIN_KEYBOARD, FREQ_STRINGS, sink); // 初期化 void setup() { // 楽器の初期化 if (!inst.begin()) { Serial.println("ERROR: init error."); while (true) delay(1000); } } // メインループ void loop() { // 楽器の更新 inst.update(); } ```

-

# 6. 筐体

+

# 筐体

筐体は厚さ4mmのMDFで組み立てることにし、Autodesk Fusionで設計しました。干渉のチェックおよびネジ穴位置のチェックのため、SPRESENSEボードの3Dモデル ([こちら](https://developer.sony.com/spresense/development-guides/hw_design_ja.html)からダウンロード) を取り込んで使用しました。 ![3Dモデルの設計](https://camo.elchika.com/10dbfa93ce1c315637dbfb6cf468d67f9b936f74/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f65363836663263622d316331322d343731392d623966382d3934363239653238386636312f62323561643063662d653762632d346662362d386436342d346138346535383934623835/) レーザー加工用の2次元データを作るため、部品ごとにスケッチを作成して「プロジェクト」で投影図を作成したのち、スケッチを「DXF形式で保存」します。部品ごとのDXFデータができたら、それらを1枚のMDFから切り出せるように Inkscape 上で並べます。

-

ただし、スプライン曲線を含むスケッチをDXF形式で保存して、Inkscapeで開くとスプライン曲線が表示されません。Autodesk Fusionは5次のスプラインを用いていますが、Inkscapeなど多くのソフトでは3次のスプラインしかサポートしていないためです。そこで、Pythonスクリプトを用いてスプラインをポリラインに変換しました。詳細は[こちらの記事](https://lipoyang.hatenablog.com/entry/2024/09/02/141048)を参照してください。

+

ただし、スプライン曲線を含むスケッチをDXF形式で保存して、Inkscapeで開くとスプライン曲線が表示されません。Autodesk Fusionは5次のスプラインを用いていますが、Inkscapeなど多くのソフトでは3次のスプラインしかサポートしていないためです。そこで、Pythonスクリプトを用いてスプラインをポリラインに変換しました。使用したPythonスクリプトについては[こちらの記事](https://lipoyang.hatenablog.com/entry/2024/09/02/141048)を参照してください。

![レーザー加工用データ](https://camo.elchika.com/26645e00f46ba873b11c3e1ed4bf53d9d6d89697/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f65363836663263622d316331322d343731392d623966382d3934363239653238386636312f30393165346131372d343838362d343264652d396537392d396165353835653836333830/) 今回、レーザー加工は [Anymany](https://anymany.net/) さんにお願いしたので、データの書式はそちらの指定に従いました。切り出された部品は仮組みして確認したのち、木工用ボンドで固定します。 ![MDFをカットして組み立て](https://camo.elchika.com/8e3f57f9d8759a1a5c22f952a64885d1520a6f21/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f65363836663263622d316331322d343731392d623966382d3934363239653238386636312f38346138626234622d633938312d343634312d613765632d653631393963303730653930/) MDFは塗料が染み込みやすいので、まずサンディングシーラーを刷毛塗りして研磨し、表面を樹脂化します。塗装はラッカー塗料の缶スプレーを用い、半光沢仕上げにしました。私は気管支が弱いので、塗装の際は塗装ブースと[防塵・有機ガス用マスク](https://www.monotaro.com/p/1961/3913/)を使用します。 ![塗装](https://camo.elchika.com/6782ff93d3d05b65dfea82c690658134c0a647ea/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f65363836663263622d316331322d343731392d623966382d3934363239653238386636312f62386365366638372d363034302d346466302d613763652d376630613038633939343839/) 塗装ができたら電装系とペグ等を取り付けて組み立て、弦を張って完成です。 ![電装系の取り付け](https://camo.elchika.com/297a019f2673512a249fb82e3b7844ceb4be8d15/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f65363836663263622d316331322d343731392d623966382d3934363239653238386636312f37336139666131642d376337642d346235342d613331632d656237653032343062383239/) # 7. 課題 - 5~6本の弦が同時に鳴る大正琴と比べると音の厚みが欠けるので、同時発声できるようにしたい。 - モード切り替えで、自動トレモロ奏法ができるようにしたい。(キーを押している間はトレモロ奏法の音を再生) - ふつうの大正琴より演奏が難しい。(イベント展示に備えて練習が必要。) - 次に弾くべきキーと弦をLEDで光らせるガイド機能がほしい。(曲データはSDカードに保存) - どのキーと弦を弾いても正しい音を鳴らしてくれるモードもほしい。 # 8. GitHubリポジトリ https://github.com/lipoyang/Kompacto