こちらの記事に、下記のご質問を頂きました。
NTS-1が好きでカスタムオシレータを使っていましたが、mk2は発売から間もなく対応したカスタムオシレータが見つかりませんでした。
どなたか作っていないか?とweb検索してこの記事にたどり着きました。
これを機に自作してみようかと思ったのですが、音楽のプログラミングどころかそもそもプログラミング自体に触れたことがなく、何をどうしていいのやら…という状態です。ど素人がNTS1 mk2に対応したオシレータを作ろうとしたとき、何から学び、何ができるようになる必要があるでしょうか?
もしよろしければ、入口だけでもアドバイスいただけないでしょうか?
お答え
これってなかなか難しいご質問で、人による、っていう部分も結構あるんですけれども、まずは本当の「全くのど素人」という想定でお答えしてみます。
もう40年も前の話ですが、任天堂が初代ファミリーコンピューターを出す前、結構な数の中学生や高校生がプログラミングをしていたと思うんですね。それはなぜかというと、ファミコン以前には、ゲームをするには、今で言うパソコン、当時はマイコンと言ってましたけれども、マイコンでプログラムを自分で書いたり、あるいは人が作ったプログラムを雑誌を見ながら入力したりするしかなかったんです。もちろん、当時からゲームのプログラムを買うことはできましたが、一本3000円ぐらいしていましたから、簡単にお小遣いで買えるようなものでもなかったと思います。
私を含めて、その当時の中学生とかがどうやってプログラミングを覚えたかというと、まあ見よう見まねで覚えたんですね。本や雑誌を見ながらいろんなプログラムをマイコンに入力して、動かして、そのプログラムを読んだりどこかを変えてみたりして、だんだんプログラムってどういうものなのかっていうのを覚えていきました。慣れてくると、それまでにいろんなプログラムを読んで身につけた、「プログラムの部品」を組み合わせて、だんだん自分のオリジナルのものが作れるようになってきます。それを続けて、だんだん大きなプログラムが作れるようになっていきました。
もちろんそういうやり方には弊害もあって、一番大きな問題は体系的な知識が身につかないことですね。何が重要で何が些末なものなのか。背景にどんな理論があるのか。大きなプログラムを作るにはどういうやり方が有効なのか。そういったことを学ぶ機会は、こういったやり方ではなかなか得られません。
ということでご質問に戻って、logue SDKでオシレータを作るときにどこから始めたらいいか、ということなんですが、私はこれに関しては、先ほどの40年前の中学生と同じように、入り口は見よう見まねがいいんじゃないかと思います。
なぜかというと、「体系的な知識を身につけてから始めよう」と思うと、恐ろしくたくさんの知識体系を身につけないといけなくなってしまうんですね。ちょっと考えただけでもこれぐらいあります。
・音の基本(周波数とは?倍音とは?などなど)
・音声信号処理の基本(サンプリング、DA変換の注意点、etc.)
・シンセサイザの基本(矩形波とは?鋸波とは?FMによる波形生成とは?ウエーブテーブルとは?など)
・デジタルでの波形合成の基本(エイリアスノイズとは?エイリアスノイズの出ない波形合成方法は?ノイズの生成方法は?など)
・デジタル信号処理(フーリエ変換のような基礎知識、デジタルフィルタの使い方など)
・Cプログラミング、C++プログラミング
・組み込みプログラミング(特に演算性能やメモリに関する制約)
・数値演算(浮動小数点数、固定小数点数、補間のテクニック、各種算術関数の近似値の求め方など)
・最適化/高速化の雑多なテクニック(ビット演算、事前準備したテーブルの利用、インライン展開、などなど)
・最低限のLinuxコマンド(ls, cd, mkdir, rmdir, pwd, cp, cp -r, rm)およびファイル名その他の約束事などの知識
・テキストエディタの使い方
・ビルドツールの基本(コンパイルとは何か、Makefileの書き方とmakeコマンドの使い方、gitの使い方、などなど)
こんなの全部勉強しないと始められないとしたら、絶対嫌になってしまいますよね。それでは元も子もないので、まず見よう見まねで実際にプログラミングを初めてから、必要な部分を勉強して行くのが良いと思います。回り道する場合もあるかもしれませんが、途中でやめてしまうよりはよっぽど良いです。
その第一歩は、logue SDKにサンプルとして入っているWavesオシレータをビルドして、つまりソースコードをコンパイルしてwaves.nts1mkiiunitというファイルを生成し、それをNTS-1 mkIIにダウンロードして動かすことができるようになることです。
ビルドするツールは、素人ということなのでDocker版を使うのが良いのではと思います。ちょっと起動に時間がかかりますが、気になるほどではないと思います。
やってみよう
ということで、ここからは後編です。WindowsにDockerとlogue SDKをインストールして、wavesオシレータをビルドしてみましょう。
Windowsですと、まずWSL2というWindows上で動くLinux環境をインストールする必要があります。これはコマンドプロンプトから
wsl --install -d Ubuntu-22.04
と入力するとインストールが始まります。完了した後、一度Windowsの再起動が必要です。(Windows Updateみたいなものです。)
再起動するとインストールの続きが行われて、完了するとユーザ名とパスワードを設定するように指示されます。ここのでユーザ名は好きなアルファベットで決めて構いません。(Windowsのユーザ名とは違って結構です。)パスワードは2回入力します。
すると、ずらずらとメッセージが出て(Linuxの起動時に出るメッセージです)から入力待ちになります。こんな感じです。
これで、Windows上でLinuxが動作するようになりました。最後に「$」が表示されているはずです。これは「プロンプト」といって、「入力してください」という意味です。
ここで、LinuxにDockerをインストールします。以下のリンクの記事を開いて、「いちおう全部書いておくと、こんな感じだった。」の後に書かれているコマンドを、全部順番に実行してください。「echo」で始まる行は、2行に渡っていますのでコピペする際は2行ともコピーしてください。いくつかのコマンドで、実行途中で「Y/n」と聞かれた場合は、単にリターンキーを押せばOKです。
これで準備ができたので、続いてlogue SDKをインストールします。Webでlogue SDKのDockerインストール方法のページを開いてください。「セットアップ」という項目があり、実行すべきコマンドが記載されています。
$マーク(プロンプト)の後の部分(コマンド)を、自分のPCのLinuxのプロンプトの後にコピペしてください。こんな感じです。
1行コピペしたらリターンキーを押してください。コマンドが実行されます。続く2つのコマンドも実行してください。正常に実行出来たら以下のようになっているはずです。
同様にして、「コンテナをビルド」するためのコマンドを実行してください。「コンテナをビルド、とは何か?」とは今は考えなくて結構です。これもツールそのものを構築するための一連の処理だと考えてください。なお、もし「./build_image.sh」がエラーで実行できなかった場合は、代わりに「sudo ./build_image.sh」を実行してください。
以上で、ようやくツールのインストールが完了しました。ここまでは、一度だけ実行すればOKです。
では、wavesオシレータをビルドしてみましょう。以下のコマンドを入力してください。
./run_cmd.sh build nts-1_mkii/waves
もしエラーで実行できなかった場合は、
sudo ./run_cmd.sh build nts-1_mkii/waves
を試してみてください。以下のようなメッセージが出ていれば、ビルドが成功しています。
このビルドしたファイルを、Windows側からアクセスするには、エクスプローラを開いてパス名のところに「\\wsl$」と入力します。すると、「Ubuntu-22.04」というフォルダが表示されるはずです。
このフォルダを開いて、さらに以下のように順に下の階層のフォルダを開いていってください。
Ubuntu-22.04\home\WSL2でのあなたのユーザ名\logue-sdk\platform\nts-1_mkii\waves
ここが、今ビルドしたwavesが入っているフォルダです。ビルドが成功していれば、waves.nts1mkiiunitというファイルができているはずです。
WSLを終了するには
exit
と入力してください。再度WSLを立ち上げるには
wsl
でOKですが、先ほどのlogue SDKのディレクトリへ行くには、WSL起動後
cd /home/あなたのユーザ名/logue-sdk
と入力する必要があります。
次の段階としては、先日の記事のオシレータをビルドすることを目指してはどうでしょうか。
wavesと同じフォルダにある「dummy-osc」フォルダをコピーして、osc.hの中身を記事のコードに置き換えれば、基本的にはいけるはずです。ビルド時には、フォルダ名の指定を間違わないように気を付けてください。
コメント