Cakewalk by Bandlab TTS-1で純正律

TTS-1を使って純正律にチャレンジしてみた。 やり方がズバリ書いてあるサイトもなく、オンライン・ヘルプを読みながら、MIDIの勉強もしつつ、という感じなので、ちゃんと理解しているわけではない。

方法としては、TTS-1のユニバーサル・ノンリアルタイム・システム・エクスクルーシブ・メッセージを使用して、 C~Bまでの12音について、各ピッチを指定することで実現してみた。

このユニバーサル・システム・エクスクルーシブ・メッセージは元々メーカーごとに独自の機能を実現するためのシステム・エクスクルーシブを、互換性を確保するためユニバーサルを追加して各社共通のMIDI規定となったという経緯がある。言葉的にエクスクルーシブで、ユニバーサルって矛盾してないか?

まずCakewalkのワークスペースをAdvance等にする。初期設定ではBasicになっていてイベントリストの表示ができないため。


TTS-1のトラックを作成し、そのトラックから下図のようにイベントリストを選択する。


イベントリストのプラスアイコンをクリックして1行新規で作る。今回はトラックの頭に情報を入れてみた。これによって再生するときに情報が読み込まれて音律が適用されるので。 種類のNoteというところをクリックすると下図のようにウインドウが開くので、「特別」の「SysxData」を選択しOKボタンを押す。


データのところにスケール/オクターブ・チューニング情報を書き込む。 絵では、とりあえず下記の純正律を入れてみた。

純正律 key = C
F0 7E 7F 08 08 40 00 7F 40 38 44 50 32 3E 36 42 4E 30 4E 34 F7


これで一度再生すれば、TTS-1に情報が送られ、純正律になる。 音はこんな感じで、和音に濁りがない。一度途切れてから平均律でも鳴らしているので、明らかな差があることが確認できると思う。



音色は、TTS-1のサイン波を使ってみた。アタックやらモジュレーションを調整すればこういう実験にも十分使える。


データの意味

システム・エクスクルーシブ・メッセージは、最初にF0で、最後にF7にするのがお約束。2番目以降はTTS-1のオンライン・ヘルプによると、下記のようになっている。
  • 7EH:IDナンバー(ユニバーサル・ノンリアルタイム・メッセージ)
  • 7FH:デバイスID(Broadcast)
  • 08H:サブID#1(MIDI Tuning Standard)
  • 08H:サブID#2(Scale/Octave Tuning 1-byte Form)
  • ffH:チャンネル/オプション・バイト1
    bits 0 to 1 = channel 15 to 16
    bits 2 to 6 = 未定義
  • ggH:チャンネル・バイト2
    bits 0 to 6 = channel 8 to 14
  • hhH:チャンネル・バイト3
    bits 0 to 6 = channel 1 to 7
  • ssH:12 byte tuning offset of 12 semitone from C to B
    00H = -64セント
    40H = 0セント(平均率)
    7FH = +63セント

お約束の項目は多いが、ffH、ggH、hhHだけは気を付ける必要がある。チャンネルを指定する項目だが、とてもマイコン向きの書き方をしている。突っ込んだ資料もないので、予測して実験した結果はこうなっている。

MIDIで一度に転送できるビット数が16進数で7FHまで、10進数にすると127となる。また2進数だと0111 1111までとなる。これを見ると明らかなのだが、7ビットしか一度に転送できない。しかも、この項目は2進数の情報をそのまま扱ってチャンネルを決定している。

hhHでは1~7chまでを扱っている。1chだけ適用したければ01Hと書けば0000 0001となり、1になっている1chだけ適用され、他のチャンネルは適用されない。

またhhHで、05Hと書けば、0000 0101となるので、適用されるのは1chと3chということになる。1~7ch全部に適用させたい場合は7FHと書く。そうすると0111 1111ということになる。2進数に慣れていないと結構面倒な話だと思う。何でこんな面倒な仕様になっているかというと、最もローコストで自由に適用チャンネルを選択できるからなのだ。

しかしながら、Cakewalkとの相性問題だと思うのだが、キチンと動作しないことが判明。もしくは私の解釈か、使い方が間違っている。 そもそも今どきのPCで2進数をガチで扱うこと自体が難しくなっている。 まぁチューニングは全チャンネル適用するのが普通なので、7FHと書いておけばよいと思う。それなら問題ない。

ssHは音律の定義データで、C~Bまでの12音の平均率とのズレを書くところ。下記で説明する。


音律の計算

音律のための計算はやや面倒で、まず平均律の各音からセント単位でどれぐらいズレているかを調べるところから始まる。 ここでは平均律の場合を考えてみる。 平均律はズレがないということで、12音すべてが0セントということになる。実際のメッセージは以下のようになる。

平均律
F0 7E 7F 08 08 40 00 7F 40 40 40 40 40 40 40 40 40 40 40 40 F7

途中から40という数字(16進数)が12個並んでいるが、これがC~Bまでの12音で、それぞれ0セントということになっている。ここからセント単位でずらすことで、いろんな音律を作り出せるという仕組み。
次になぜ0セントが40(16進数)になるかということなのだが、0セント基準で最大プラスマイナス64セント変更できるようになっている。計算機的に整数にしたいので、0~64~127に振るようになっている。0セントは真ん中の64ということになる。ただ、これは10進数なので、さらに16進数に変更する必要がある。64(10進数)を16進数に変換すると40になるという具合。

参考として純正律(Key=C)を表にしてみた。
音名 平均律基準(セント) 純正律 差(セント) 10進数 16進数
C 0 0 64 40
C# 0 -8 56 38
D 0 +4 68 44
D# 0 +16 80 50
E 0 -14 50 32
F 0 -2 62 3E
F# 0 -10 54 36
G 0 +2 66 42
G# 0 +14 78 4E
A 0 -16 48 30
A# 0 +14 78 4E
B 0 -12 52 34


メッセージの詳細は、TTS-1のオンラインヘルプのスケール/オクターブ・チューニングという部分に書いてある。 これを理解して、cakewalkとTTSで純正律を実現するのに、結構時間がかかった。