先ほど見たように割込みルーチンの中でdn[x]にd[x]をどんどん足していきます。このd[x]はRakuChordの鍵盤の押下により「音程に対応した値」が代入されています。「音程に対応した値」というのはhttps://github.com/inajob/rakuchord/blob/cc088ecfc711f7f432e1a3cc55a3f5a8bb0b9c37/firmware/src/tones.hに定義しています。このソースコードによると「音程に対応した値」というのは周波数そのものとなっています。(NOTE_A4が440、NOTE_A5が880となっていることからも、これが良く知っている周波数と同じであることがわかります。)一方、d[n]の値は割込みルーチンの中で、上位6ビットを使ってテーブルを引いています。波形テーブルは64サンプルで1波形を表しています。dn[x]は16ビットですが、その上位6ビット(0~63)を取り出すことでこのサンプルを読みだしています。d[x]の値を変数としてdn[x]が何回の割込みで1周するかを計算します。割込みの発生間隔は上で求めたので、これを掛け合わせることで波形1周期にかかる時間が計算できます。式を変形します波形1周期にかかる周波数を求めます(↑の逆数)これによりd[n]の値は周波数をだいたい2で割ったものとなります。実際にはd[n]の値の表す周波数より1オクターブ低く、かつ少し誤差のある音が鳴っていることがわかります。オーディオアンプどの方法をとったとしても、Arduinoのピンから出てくる信号のレベルは低いものです。イアホンや小さなスピーカであれば何とか音が鳴りますが、大きな音を鳴らしたい場合は、Arduinoとは別にオーディオアンプが必要です。RakuChordではLM386というICを利用してこれを実現しています。調べるとLM386を採用したオーディオアンプのモジュールも販売されているため、回路を作るのが面倒な人は、これらを使うのが良いでしょう。ブルーメディア:まとめArduinoで和音を生成する方法を紹介しました。この方法は私が様々なライブラリや、タイマーの仕様を読んで試行錯誤して作成したもので、この方法が唯一の方法ではありませんが、Arduinoで1から和音を生成したい人にとっては試行錯誤の足掛かりとなるのでは、と考えています。(もっと良い方法や、間違いなどがあれば教えてください。→https://twitter.com/ina_ani)Arduinoでちょっとリッチな音が鳴るようなガジェットを作りたい人の助けになれば幸いです。11:41Arduinoだけで和音を鳴らす方法Tweet広告を非表示にするもっと読むコメントを書く2019-12-262019年まとめピックアップニュース今年はいくつかのトピックに分けて個人的なニュースを紹介します。バズった1年、通販の1年、表面実装の1年、継続の1年、健康の1年、出版の1年と、様々な点で楽しく充実した2019年でした。今年はとにかくバズりました。家事スプレッドシートの件はねとらぼでも記事にしていただいたり、その結果Yahoo!ニュースに載ったりと、普段できない体験ができました。家事スプレッドシートがバズる妻からの指示が完璧すぎるので掃除する。昨年はイベントで販売したRakuChordですが、今年は通販に挑戦しました。3月と9月に販売しましたがいずれも即完売ということで幸先の良いスタートとなりました。通販ということで、多くの知見を得ることができました。昨年まではスルーホール部品のみを使った電子工作をしていましたが、今年は表面実装に挑戦しました。4月に単4電池1本で動くArduino基板を作り、その後は電子ゲーム機HACHIBARを3回、設計を変えつつ基板発注しました。表面実装作品の販売ができそう?というところまで経験を積むことができました。昨年に引き続きKubeWeekly読書メモをほぼ毎週更新することができました。(これは業務だったりもしますが・・)加えて今年は海外の電子工作事例を紹介するブログを開設し、こちらはほぼ平日毎日更新することができました。ここ最近の自分の関心である「Kubernetes」「電子工作」についてインターネット上で一定の発信力を示せたのでは?と考えています。Fit」に切り替え、さらなる健康を獲得しました。(週末30minジョギングはなかなか継続できません・・)inajob.hatenablog.jp出版の1年これは今年というよりは去年頑張ったのですが、私が共同執筆として名を連ねる本が2冊発売されました。書籍の執筆という非常に面白い経験を得ることができました。手伝いつつ、第1段階終了。今のキーバインドだと右と下しか押せないのでクソゲーである。眼底検査(異常なし)「瞑想中」V2青いやつのフックが折れかけているので、新しく作った。今度は輪っかにしてみた。(妻が瞑想中に部屋に間違えて入らないようにするためのもの。家事スプレッドシートがバズる妻からの指示が完璧すぎるので掃除する。ことだったので電子工作してた。(と言いつつ次からはこのスタイルもありだなと思った。新しい方→まだ怪しいところがあるが、前よりは安定して動くようになった。電池駆動だと緑は明らかに暗い。←第二プロトタイプ→第三プロトタイプ部品が減ってるのがお分かりいただけるでしょう。スピーカーボックスを自作してみた。2019年12月6日テレビ周りの配線を整理AudioMixierを追加。kitKorgが発売している1ボイスのハードウェアシンセサイザーです。組み立て式のキットとして販売され、1ボイスのオシレータ、それにつながるフィルタとエンベロープ、さらにモジュレーション、ディレイ、リバーブといったエフェクトをかけることができます。エレクトロニクスこの商品を含むブログを見る外部からのオーディオ入力もサポートしており、外部音源に対するエフェクタとしても利用することができます。テンポシンクのための入出力、MIDI入力、USB(MIDI)とインターフェースも豊富です。極めつけはカスタムのオシレータ、モジュレーションが作成・利用できるという機能まであります。RakuChordなどで音を生成するプログラムをちょっと書いたことがある私にとっては、「プロ」の作ったシンセサイザーのハードウェアからソフトウェアまでを触ることができるこの製品は非常に魅力的でした。組み立てまずは組み立てです。いってもはんだ付けなどは必要ありません。基板兼ケースとなっているパネルを折り曲げて分離します。(辺に折り曲げてしまうと取り返しがつかないのでここが一番緊張しました。)それからそれらをねじで止めて、鍵盤となるリボン抵抗をコネクタで接続し完成です。USBコネクタに電源をつなげると起動し、鍵盤をタッチすることで音が鳴ることが確認できました。音を出して遊ぶ鍵盤を押すと、当然それに対応した音が鳴ります。このリボン抵抗は細かい操作ができず、音出しのテストくらいしか使用に耐えません。USB/MIDI接続を使いMIDIホストと接続することで、この問題は解消できそうです(まだ試していない)しかしアルペジエータの機能を使うことで、それっぽいメロディをNTS-1だけでも演奏することができます。プリセットのオシレータを使い、フィルタ、エンベロープをぐりぐり動かすだけでもかなり面白いです。2019エフェクタとして遊ぶオーディオ入力端子に自作電子楽器のRakuChordをつなげて、エフェクタとして利用してみました。モジュレーションのコーラスエフェクトやリバーブは音に深みが出て非常に面白いです。ディレイはテンポと同期する機能がないため、うまく速度を調整するといい感じに動きますが、合わせるのが非常に難しいです。テンポと同期できるディレイを実装してほしいと思いました。2019オシレータを自作して遊ぶプログラマとして見逃せないのがカスタムオシレータの自作です。調べるとNTS-1で利用できるSDKが公開されており、これを使うことでC/C++でオシレータやモジュレータが作れるようです。github.comしかし、このSDK、ドキュメントが非常に少なく、また海外・国内ともにあまりチュートリアルのようなものがありません。↓に用意されているスクリプトを使うことでLinux,Windows,macOSそれぞれの環境でNTS-1で利用されているSTM32用のgccをセットアップすることができます。GitHubしかし、これらをちゃんとセットアップするのは依存関係も含めて結構手間です。いうことで、まずはこのlogue-sdkの環境をまるっと閉じ込めたコンテナイメージを作成しました。inajob/logue-sdk-dockerこのコンテナイメージを使うことで、Dockerをインストールするだけでlogue-sdkの開発を始めることができます。セットアップは簡単にできるようになったので、いよいよプログラミングです。GitHubこのプログラムはよくできていてwaves.hppというファイルにC++のオブジェクトとして、オシレータが実装されており、waves.cppでlogue-sdkから呼び出されるフックの関数を実装しています。できているのですが、SDKの利用方法を学ぶ際にはもう少し簡単な例が欲しいところです。そこで、とりあえず簡単に「ラ」を鳴らすだけのオシレータを実装してみることにしました。waves.hpp:これは削除simple.cpp:新しく作成。実際にはsimple.cppを作るところ以外はほとんど機械的な変更だけです。}}<<これが今回の”「ラ」が鳴るだけオシレータ”です。見るととても簡単です。要はOSC_CYCLEでどんどんメモリに次の波形を書き込んでいけばよいわけです。ビルドは先ほど紹介したlogue-sdk-dockerを使えば簡単にできます。ビルドができると拡張子ntkdigunitのファイルができるので、Librarianという専用ツールでNTS-1に書き込みます。これでOSCに新しいオシレータが追加されます。まじで「ラ」しか鳴らない様子です。エフェクトやアルペジエータは使えます。2019ついでに、このプログラムを改造して押された音階に対応する音が鳴るようにしてみます。}}<<こんな感じです。osc_w0f_for_noteとかosc_wave_scanfとか、wavesBとかはほかのソースコードを見ながら勘で書いています。この辺もう少しドキュメントが欲しいところです。(そもそもプリセットのwaves[A-D][0-15]にはどんな波形が入っているか書いてあるドキュメントが見当たらない・・)と、こんな具合でC言語と勘があれば自分でオシレータを作ることができることがわかりました。(ここまでのソースコードはhttps://github.com/inajob/simple-oscで公開しています。https://korginc.github.io/logue-sdk/ja/感想このガジェットはDTMをたしなむ人はもちろんですが、「サウンドプログラミングを学びたい人」にとっても非常に便利なものであると感じました。音をソースコードで記述する「サウンドプログラミング」ですが、リアルタイムに鳴らそうとすると、たくさんのタスクが並列に処理されるOSの上では案外書きにくいものです。そこで役に立つのがマイコン上でのサウンドプログラミングです。これまではArduinoやmbedでも似たようなことができましたが、これらはオーディオに特化していないため、パソコンからのMIDI信号受信や、外部音源の取り込み、ディレイを扱うための大きなメモリなど、かなりの周辺機器を自作しないとまともなオーディオプログラミング環境になりません。これにはかなり高度な電子工作、マイコンプログラミングの知識が必要です。このNTS-1はこれらの面倒な部分をすべて受け持ってくれて「サウンドプログラミング」の「おいしいところ」だけを扱うことができます。いった感じで、本当にこれは「サウンドプログラミング界のArduino」というべき開発環境であると感じました。単純にハードウェアMIDI音源、オーディオエフェクタとしても非常に使いやすいし、品質も良いためプログラミングとは無縁のDTMユーザにもおすすめできます。(まぁ私はDTMユーザではないのでこの部分の評価はほかの人の記事を見ていただくほうが良いです)私は自作電子楽器RakuChordの後段のエフェクタとして、また自作電子楽器の音源の研究という2つの目的でこれからもこのNTS-1を活用していきたいと考えています。記事の中にも書いた通りプログラミング周りはドキュメントなどが少なく、これからの盛り上がりが非常に大事であると考えています。NTS-1を買った人は得られた知見を公開してもらえると助かります!またTwitterで情報を記載する際にはハッシュタグ#NTS1を使うことをお勧めします(製品名であるNTS-1はハイフンが含まれておりハッシュタグにできないため。)私も自分が発見したことをブログや下記Scrapboxのページにまとめていこうと思うので、NTS-1ユーザの方は見てみてください。Fitへの挑戦1年間継続できました!去年の11月ごろに購入したWiiとダンスダンスレボリューションですが、ここまでの約1年間、なんだかんだと継続することができました!inajob.hatenablog.jp(といっても「毎日欠かさず」、とまではいきませんでしたが、「ほぼ毎日」といった感じですが・・)普段からあまり運動をしない私ですが、ダンスダンスレボリューションのおかげでまぁ少しは運動習慣をつけることができたのかなと思います。実施方法は「毎朝3曲踊る」というものです。上図が典型的な平日の脈拍です。朝8時ごろにガッと上昇しているところがありますが、ここがダンスレボリューションです。その後通勤のためにしばらく高い状態が続き、続いてお昼、そして夕方の帰宅時に上昇しています。Versaが記録したものです。やって運動習慣が可視化されるのは結構面白いのでおススメです。見るこちらのダンスダンスレボリューションフルフルパーティーで遊んでいました。マリオDDR)も購入しました。(中古ですごく安かったので・・)良く知らなかったのですがWiiではゲームキューブのソフトも遊ぶことができるためソフトとメモリーカードを購入するだけで、遊ぶことができました。(できればメモリーカードもWiiのものが使えると良かったのですが・・)Wii版のダンスレボリューションマットで遊べるかどうかは心配だったのですが、全く問題なく動作しました。こちらのマリオDDRはマリオにまつわる楽曲や、クラッシック曲をベースにした音楽によるダンスレボリューションです。前述のフルフルパーティーに比べると比較的難易度は易しく、ちょっと物足りない感じがしましたが、よく知っている曲でダンスダンスレボリューションを遊べるという点では楽しかったです。心配事があったのですが、問題が起きたのはこれです。Gameこの商品を含むブログを見るこれはWiiの映像出力をHDMIに変換してくれる非常に役に立つアダプタなのですが、頻繁に抜き差しをしていたこともあり、これのオーディオジャックが内部でもげてしまいました。幸いにも電子工作の心得があったため、難なくはんだ付けしなおして事なきを得ました。Wii本体やマットに関しては1年間遊び続けていますが、特に問題は起きていません。ダンスは上達した?ダンスダンスレボリューションが良いのは「自分が進化する」というところです。購入時は全く歯が立たなかった曲も何度もこなすうちにだんだん踊ることができてくるという体験が楽しく、ここまで継続することができました。ダンスレボリューションは1つの曲でも複数の難易度が用意されているため、次から次へとハードルが用意されている感じで、継続していても楽しかったです。フルフルパーティーで「Difficult」の曲は大体A以上は記録できるようになりました「Expert」はなかなか難しく曲によってまちまち・・というところです。「Basic」の曲が楽しい!くらいのところからスタートしたのでかなりの上達です。フルフルパーティに関しては難易度がちょうど僕に合っているらしく、まだ楽しめそうです。マリオDDRについては、一番難しいモードでも比較的簡単にAがとれてしまい、ちょっと簡単すぎかな、という感じでした。効果のほどは・・?こういう健康施策はいまいちわかりやすい効果が出ないものですし、ダンスダンスレボリューション以外の要因も絡んでくるので、効果が出たといっても一概にこれが良かった!ということも難しそうです。足の裏の感覚が変わったこれはダンスレボリューションを始めて1週間ほどで実感があったのですが、歩いているときの足の裏の感覚が少し変わった気がします。今やもうそれが普通になって特に何も感じませんが、何か足の使い方が変わったのかもしれません。風邪が減ったここ2-3年本当によく風邪をひきました。今年は例年に比べて風邪をひく回数が減ったように思います。風邪をが長引くことが減った上記に加えて体調不良の期間が短くなったように感じます。朝シャキッとするようになったダンスダンスレボリューションは朝行っていたのですが、花粉症のシーズンなどは花粉によるだるさや鼻水が少し楽になるように感じました。調べてみると朝に急に運動をすることは健康上あまりよくない、というような話もあるようですが、僕の場合は特に悪いことは今のところ起きていません。他にも行っている運動習慣ダンスダンスレボリューションのほかに、毎朝のラジオ体操、週末の30minジョギング(これは結構サボりがちですが、、)などを行っています。これら2つはダンスレボリューションより以前から行っていたものなので、上記の気づいた変化はダンスレボリューションによるところが大きいのでは?と考えています。(とはいえ、運動習慣が遅延して影響を及ぼすこともあると思うのでなんともわかりません)体重は変化なし僕は体系で言えば「やせすぎ」なので、ダイエット効果は全く期待していませんでしたが、この程度の運動では特に体重が大きく増減することはありませんでした。Plusがおすすめです。購入して数日ですが、早くも背中の筋が痛いです。1年後、さらに健康になれているといいなぁ。Zeroを使った携帯型の変愚蛮怒専用機を作成しました。Linuxを動作させる方法があるようです。これを利用してAndroidで変愚蛮怒を遊ぶ方法を考えてみました。Root」まずはRoot権限なしでAndroid上でLinuxのユーザランドを動かす方法を探します。play.google.comこれを使いました。Rootはもうメンテナンスされていません。そのため新しいAndroid端末ではインストールできません。代わりにUserLAndというソフトが使えそうです。(ただし僕は古いAndroid端末しかもっていなかったのでGNURootしか使えませんでした。)play.google.comおそらくこれから紹介する方法はUserLAndでも動作するのでは?と思いますが、確証はないです。Rootfs」をタップ。Wheezyというソフトをインストールする画面になるので、そのままインストールします。Rootfs」をタップすることでコンソールが起動します。Rootfs」をタップするとRoot権限のコンソールが起動します。必要に応じて2つのコンソールを使い分ける必要があります。Wheezyはすでにパッケージリポジトリがarchiveのものしか存在しないのでまずは/etc/apt/source.listを下記のように編集する必要があります。updateしておきます。ここまででAndroid上にDebianのユーザランドを用意することができました。(ここまでがGNURoot特有の記載です)変愚蛮怒のビルド変愚蛮怒のLinux版はソースコードで提供されています。そのためビルドする必要があるので、必要なライブラリをインストールします。curl依存関係でgccやらいろいろ入ります。ここからは一般ユーザで操作します。変愚蛮怒をダウンロードしてビルドします。make(すごく時間がかかります)これで./src/hengbandにバイナリが生成されます。ここで、./src/hengbandを実行すると、確かに起動するのですが、全体的に文字化けてしまいます。(SHIFT+Qなどで終了できます。)これは変愚蛮怒がEUC-JPにしか対応していないからです。加えてAndroidのTerminalはUTF-8の日本語は表示できますがEUC-JPには対応していません。ここで、役に立つのがcocotです。cocotのビルドvmi.jpcocotは、端末とプロセスの間に割り込んで文字コード変換を行うツールです。これはまさに今欲しい機能です。EUC-JPで動作する変愚蛮怒の出力を受け取り、端末にはUTF-8を返すことで、文字化けを解消できそうです。こちらもAndroid用のバイナリは存在していないので、自分でビルドします。make特に問題なくcocotもビルドできました。openpty()」などと表示されて実行できないので、rootの端末で作業が必要でした。src/hengband日本語も表示された!ということでこれでAndroidでも簡単に変愚蛮怒で遊べるようになりました。この方法をもってしても、まれに表示の一部が文字化けする起きるようです。Piで試したときはX11環境をセットアップしました。Androidでもこの方法で変愚蛮怒を利用することができますが、Androidの容量を非常にたくさん消費するので、あまりお勧めしません。上記の方法でうまくいかない場合はX環境での実行を試してみるのもよいでしょう。Piと同じ方法になると思います。3Dプリンタでケースを作る前回の変愚蛮怒専用機と同様、3Dプリンタでケースを作りました。スマートフォンの中にバッテリーもディスプレイもCPUも内蔵されているため、非常に簡単な作りで、しかもコンパクトに設計できました。キーボードと本体は分離してたほうが遊びやすいですね・・また今後改良していきたいと思います。まとめということで、物理キーボード付きの変愚蛮怒専用Androidが完成しました。ブログを報告するスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。