KORG NTS-1用オシレータを公開しました

 KORG NTS-1用のカスタムオシレータを複数作っているのですが、そのいくつかを公開しましたのでご紹介します。
 

SuperSaw

 SuperSawっぽい名称のオシレータを搭載するシンセサイザーは現代では多数あります。そのオリジナルは1990年代中期にリリースされたRoland JP-8000まで遡ります。いわゆる初期のバーチャルアナログシンセサイザーですが、7個の鋸波を組み合わせSuperSawとネーミングしたオシレータを始めて搭載したシンセサイザーです。
 実装に当り、ADAM SZABO氏のスウェーデン王立工科大学メディアテクノロジーの学士論文"How to Emulate the Super Saw"を参考にしています。実はJP-8000の実機も持っているのですが、手元には無いので再現度の比較はできていません。それでも、頭の中の記憶と比べるとかなり「それらしい」雰囲気の出音が得られているように思います。
github.com
 

PCMHit

 PCMならアコースティックピアノを鳴らしたいところですが、NTS-1はモノシンセということになっており、(ボイスアサイナ部分が伏せられていたり、全てのNOTEONメッセージが拾えるわけでもないため、)普通には単音しか鳴らせません。単音で音階付けて鳴らして面白そうなPCM音、というわけで思いついたのが「オケヒ」ことオーケストラヒットだったので作りました。
 1990年代初頭の比較的マイナーな機材の出音を独自にサンプリング・加工した波形を使用しています。NTS-1のユーザーオシレータは32KB以内という制約があるため、最終的には量子化ビット数8・サンプリング周波数32KHzまでダウンサンプリングしています。ところで、NTS-1にはファイルシステムはありませんから、WAVEファイルを読み込むようなコードは書けません。どうにかしてPCMデータをバイナリにエンベッドする必要があります。リンカを使ってRAW PCMをオブジェクトファイルにしてみると、元ファイルより600バイト程度の無駄なオーバーヘッドが生じるようです。普通のPCなら特に気にもしませんが、32KB以内という制約下では非常に勿体なく思えます。ので、愚直にソースコード中に配列として埋め込んでいます。(ヘッダファイル中のPCMROOTNOTE, PCMFS, PCMWAVEを書き換えれば、お好きな符号無し8bit PCMを再生させることができます。)
 なお、NTS-1自体は内部処理32bit(Q31)・サンプリング周波数48KHzで動作しているようなので、PCM波形の読み出し時にリニア補完を噛まして階段状の出力波形になることを抑止していますので、露骨なLoFi感は控えめです。
 また、前述の通り元PCMのサンプリング周波数が32KHzですから、お好みでナイキスト周波数16KHzより高い成分をNTS-1本体のLPFで削った方が自然な音になるでしょう。
github.com
 

DualOsc (2021/1/17追記)

 特に珍しくもない2OSC構成のオシレータです。OSC1,2の波形選択とデチューン量とミックスバランス、さらにOSC2をOSC1にシンクさせる設定が可能です。
 加えて、デチューン量をNTS-1が元々持っているLFOで変調可能としています。シンクを有効にして、デチューンを強めにかけたうえで、LFOで変調するとPWMにも似たいい感じの効果をSaw waveでも感じられます。
 なお、logue-sdkには含まれない三角波オシレータも実装しています。NTS-1用に自力でコードを書き始めたばかりの方にとっては、周期波形を生成するオシレータの実装方法の参考になるかもしれません。
github.com
 

KovidTone Tokyo (2021/1/24追記)

 コビットーントーキョーと読みます。東京都の2020年のCOVID-19統計情報を使用した加算合成・ウェーブシーケンス搭載オシレータです。COVIDの頭文字を"K"にしているのは、KAWAI K5000に代表される加算合成と、KORG WAVESTATIONに代表されるウェーブシーケンスをリスペクトした結果です(もちろん両社と私は無関係です)。
 そもそも何を言っているのか解らないという方が多いかと思われますが、N日から1週間の日別の新規感染者数を倍音成分の強度にマッピングした加算合成と、基準日Nをシフトするウェーブシーケンスで音声を生成します。基本概念は昨年考案し、以下の投稿に記載したものと同じです。
COVID-19のデータを楽器に転用する - 記憶は人なり
 データを見える化することを可視化やデータビジュアライゼーションと言いますが、このオシレータは高い倍音成分が強くなることは感染状況が悪化していることを示しますので、可聴化あるいはデータオーディブライゼーションと言うこともできます。
 蛇足ながら、これを作りたくて昨年来Linux ALSAを使ったシンセサイザーを作る、すなわちRaspberryPiのようなシングルボードコンピュータと組み合わせてデジタルシンセサイザーをまるっと作るということを個人的に始めました。パーツをほいほい買いに行けるような状況ではないのでハードウェア周りを除けばほぼ完成しており、MIDIシグナルを基に音声を生成するソフトウェアシンセサイザー部分は書き終えていたりします。世界各国の統計情報をRDBで保持し、OpenMPで並列処理しながらリアルタイムにOSC/FILTER/AMP/EGといった要素を計算し音声生成するみたいな処理を書きました*1
 閑話休題、過去の加算合成やウェーブシーケンスは音作りが非常にめんどくさいという特徴がありました。例えばK5000は256倍音まで扱えましたが、256個も個別にパラメータ設定するの、非常にめんどくさいです。というか、無理でしょう。もちろん、簡略化するための手段は用意されていましたが、それでは普通のシンセサイザーとあまり違わないものになってしまいがちです。同様にWAVESTATIONも大量の短いPCM波形を任意に選択して任意の順番で並べてウェーブシーケンスを組むことが出来ましたが、ポチポチポチポチ非常に面倒くさいものでした*2。KovidToneでは加算合成に用いる倍音は(基音も含めて)7個で、それぞれのレベルは7日間の新規感染者数から自動設定されます*3 *4。また、何月何日から何日間をウェーブシーケンスさせるかを指定するだけ*5の、簡単操作です。
github.com
 

OpTwo (2021/1/24追記)

 2オペレータFM音源です。実在する特定の機種の再現を狙ったものではありませんが、周波数比の設定だけはYAMAHAの4OP FMシンセサイザーのDX21と同じ値を設定可能なつくりにしています。DX21は私が始めて購入したFMシンセサイザーで大好きなのです。
 (恐らく当時のFMシンセサイザーは同様だと思いますが、)DX21はRATIOを変えてもリアルタイムに音は変更されません。一旦NOTE OFFして、再度NOTE ONしないと、出音に反映されなかったのです。ですので、打ち込みベースラインのように短い音を連打しつつRATIOを変更するようなことをやって遊んでいました。一方、OpTwoではリアルタイムにパラメータ変更が反映されます。長い音でもRATIOを変えながら派手にギュルギュル*6鳴らすことができます。あんまり派手に動かすのはSE意外に実用性は無さそうですが、小幅な変更は意外と多用途に使えるんじゃないでしょうか。
 なお、OpTwoでは後期のFMシンセサイザーのように、オペレータ波形に正弦波以外も利用可能です。正弦波、三角波矩形波、鋸波の4種類から選択可能です。
github.com
 

Additive (2021/1/24追記)

 前掲のKovidToneはプリセット加算合成とでも言えそうですが、こちらは手動で倍音成分を調整可能な普通の加算合成です。(基音より低い倍音はありませんが)ドローバーオルガンと同様です。LFO倍音レベルを変調可能で変調対象は、無し、奇数倍音だけ、偶数倍音だけ、全部から選択可能です。
github.com
 



 これらはソースコードだけではなく、NTS-1 digital Librarianで転送可能なバイナリファイル(*.ntkdigunit)もリポジトリに格納してありますので、プログラマではないNTS-1ユーザでも利用可能です。自己責任でご利用ください。
 

 他にも、FM(2OP)、DC(Digital Cyclic)*7Sync付きDual加算合成、疑似ポリフォニック音源、辺りを作ってみたのですが、コードが散らかっていたり、パラメータを整理したりする必要があるので今のところ公開していません。そのうち公開するかもしれません。

(2021/2/8追記)
 上記の全オシレータのピッチベンド時の挙動を修正し、v1.0-1にアップデートしました。
 



以上。

*1:NTS-1のオシレータを書くのが簡単だと思っているのは、この経験によるものかもしれません

*2:私、K5000シリーズは新品で売ってた時代に楽器店で触っただけですが、WAVESTATIONは液晶バックライト消えの実機と、iOS版と持ってますが実機での音作りは非常に面倒でした。

*3:この際、当該7日間で値を正規化しますので、日によって大きな音量差が発生することを防ぎ、楽器としての実用性を担保しています。

*4:当然ながら、この仕組みですから7日間連続で新規感染者が0の場合は音が出ませんが、感染抑制に成功していることを表しています。残念ながら2020年初頭にしか該当する期間はありませんが。

*5:N日とN+1日の切り替え時の違和感を低減するため、クロスフェードを指定することも可能です。また、ウェーブシーケンス対象最終日に達すると、初日に戻ってループしますので音が止まってしまうことはありません。

*6:前述の通りRATIOはDX21と同じ値を採用しているため、滑らかな変化ではなく、階段状に変化します。

*7:恐らくゲーム機界隈で波形メモリ音源と言っているものと同様