ここは、NSFの作り方について書くページです。
(2ch発祥のmck wikiが実はありますが、おーるいんわん志向?で)
(2ch発祥のmck wikiが実はありますが、おーるいんわん志向?で)
※記事作成した管理人はNSFわからないので前身wikiの丸写しです。
■NSF00:初めに
■半角文字で書く
NSFのソースには半角文字のみ使用しましょう。 A c4e4g4e4c1 と書くのは問題ないけど、 A c4e4g4e4c1 とか書いたら多分エラーです。 あと、大文字と小文字は意味が異なるので注意。 目に見えない全角スペースとかでもエラー出ます。 |
■コメント
ただし、コメントだけは例外です。 //(コメント文) と書けば、//以降は無効になるので、全角文字も問題ありません。 A ec<a>fc<a>f+c<a>fc<a>ec<b>d //FF6のボス戦の最初 のようにメモに使えます。 |
フレーム
NSFでは、演奏を毎秒60フレームという単位で行います。 つまり1フレーム=1/60秒です。 説明の中で時折「フレーム」という言葉が出てくるので覚えておきましょう。 |
ここでは、基本ということで、とりあえず最低限必要なことを。
とりあえず曲らしいものを作るにはここだけで十分、かも。
とりあえず曲らしいものを作るにはここだけで十分、かも。
■NSF01:基本
■チャンネル
音楽(NSF)@FCに書いてある通り、NSFでは 矩形波*2 + 三角波*1 + ノイズ*1(+ DPCM) の4音(5音)を用いて曲を作っていきます。 これらの音は、個別に演奏を指定していくことになります。 指定するために、各音ごとにチャンネル名が指定されており、 -A:矩形波1 -B:矩形波2 -C:三角波 -D:ノイズ -E:DPCM となっています。 例えば、矩形波1の演奏内容は A @2 v10 o5 q8 c4f4g4c4 b-2a4g4 f4e8f8g4d4f2e2 などのように指定します。 |
■音高
音の高さは、音名(ドレミ)とオクターブ数で指定します。 音名は、以下のようにa~gのアルファベットで表現します。 ド=c、レ=d、ミ=e、ファ=f、ソ=g、ラ=a、シ=b、 これに加えて、アルファベットの後に+や-を付ける事で、 #や♭を表現します。つまり、 [c] [c+/d-] [d] [d+/e-] [e] [f] [f+/g-] [g] [g+/a-] [a] [a+/b-] [b] で1オクターブ中の12音を表現します。 これは、音の高さもこの順番(aやbの方がcより高い)なので注意。 次にオクターブですが、これは、o(1~7くらい?の数字)で指定します。 例:A o3 cdegcdegcgedcged //あれ、変なプレリュード 数字が大きいほど高い音です。 一度指定してやれば、以降の音は全てそのオクターブで鳴らされます。 また、現在のオクターブ数から相対的に1上げる、下げるといったことも出来ます。 1オクターブ上げる場合には > 、下げる場合には < を書けば オクターブを変更することが出来ます。 例:A o3 cdeg>cdeg>c<gedc<ged //おお、まともなプレリュード なお、同じ「o4c」を鳴らすと、三角波パートの方が矩形波パートより1オクターブ低く聞こえます。 三角波パートは、矩形波パートよりオクターブの数字を1つ上げるようにしましょう。 |
■休符
音を鳴らさないことを指定する音符です。 音名の代わりに r と書きましょう。 (DPCM、つまりEチャンネルの場合は w の方がいいそうです) |
■音長1
音の長さは、音名の後に数字(と付点)を書くことで指定します。 数字は、「○分音符」の○の数字です。 また、付点(音長が無印○分音符の1.5倍になる)は、 数字の後に半角のピリオド . を書いて指定します。 例:c4. //ドの付点4分音符(8部音符3つ分) 数字と付点だけで表現できない音長は、複数の長さをくっつけて指定しましょう。 数字同士を ^ で繋げれば、それらを合わせた長さだけ鳴らします。 例:c2^8 //ドの2分音符+8部音符(8部音符5つ分) また、よく使う数字や見栄えの良くない数字について、 デフォルトの音長に指定することで記述を省略することが出来ます。 例1:c16d16e16g16>c16d16e16g16>c16<g16e16d16c16<g16e16d16 例2:l16 cdeg>cdeg>c<gedc<ged ↑どちらも同じ演奏情報 |
■音長2
音長1の方法で指定した音長の内、実際にどれくらいの間鳴らすのかを q コマンドで指定できます。 何のことか分からないって? 例えば、 例1:A l8 crcre-rcr crcre-rcr crcre-rcr g-rfre-r<b-r> と、ずーっとスタッカート気味に演奏するとき、 「指定した音長の半分だけ鳴らす」と指定できればいいね、という話です。 書式は、 q(1~8) で、これを指定すると、以降の全ての音は 「指定した音長の初めの(数字)/8だけ音を鳴らす」ようになります。 例2:A l8 q4 cce-c cce-c cce-c g-fe-<b-> //例1と同じ また、もっと細かく「最後の○フレームだけ音を止める」という指定も出来ます。 書式は @q(数字) で、これを指定すると、以降の全ての音は 「指定した音長の(数字)フレーム前まで鳴らす」ようになります。 Cチャンネルの三角波は連続して鳴らすと全く切れ目無く演奏するので、 歯切れ良くするために@q1、@q2などを指定することが良くあります。 |
■初期化
↑に書いてある内、 ・o(数字):オクターブ数を指定 ・l(数字):音長を指定しなかった際のデフォルト音長を指定 ・q(数字):実際に音を鳴らす時間を指定 の3つは、初期化情報として最初に書いておくと見やすくなります多分。 C o3 l8 @q2 C aaaaaagg aaaaaagg aaaaaagg aaaaaagg |
ちなみに、ノイズ、つまりDチャンネルは、 オクターブを指定しても意味がありません。 |
■NSF02:頻出コマンド
■@(0~3の数字)……音色指定1[AB]
NSFの仕様の説明に、矩形波には4つの音色があると書いてありますが、 それを指定するのがこのコマンドです。 @0が汚い音、@2がクリーンな音、@1がよく使う音、@3=@1、 というのが管理人の認識ですが、実際に鳴らして感じを掴みましょう。 ちなみに、@1と@3は本当に(ほぼ)同じ音です。 例:A @0c4 @1c4 @2c4 @3c4 |
■v(0~15の数字)……音量指定1[ABD]
v(数字)は、音量を指定するコマンドです。 数字は 0(無音?)~15(最大) の間で指定します。 例:A o5 l8 @q2 v8 dr<bge>d<bg brgrb4.a |
■@v(0~255の数字)……音量指定2[ABD]
超重要コマンドです。 NSFの出来の20%位はこいつに握られていると言って過言ではありません。 これは、フレーム単位での音量変化を登録し、指定するコマンドです。 まずは、チャンネルの外で音量変化の登録を行います。書式は @v○={1フレーム目の音量 2フレーム目の音量 ……} となっています。これは、チャンネルの外に書きます。 つまり、○:**@v0={~} ×:A @v0={~} ということです。 音量は1フレームごとに次の数値に変化し、最後の数字に来ると 以後はその数字を維持し続けます。 ただし、途中に|を挟んでやると、|以降の数値変化がループします。 つまり、{10 9 | 8 8 7 7 }={10 9 8 8 7 7 8 8 7 7 8 8 7 7……} ということです。 次に、登録した音量変化をチャンネルに指定します。書式は A @v○ です。 |
■NSF03:NSFのいろいろなテクニック
■無音部分をフル活用する
例1 フレーズの切れ目を綺麗に響かせる @v1 = { 10 9 } @v2 = { 4 3 3 2 } A @2 @v1 o4 q8 l4 f2b-2a1 rfb-a gf>d2 ;↓ A @2 @v1 o4 q8 l4 f2b-2 @vr2 @q1 a1 w @vr255 q8 fb-a gf>d2 リリースエンベロープ機能を使用した例。 @v2がリリース用のエンベロープで、チャンネルの中では@vr[数字]で 指定します。 @vr255とすると、リリースエンベロープの指定が解除されます。 リリースエンベロープは、qや@qで発音しない部分や、 wで指定した休符の部分に使用されます。 rで指定した休符には適用されません。 |
なお、@vr[数字]を指定しているときにq8を指定すると、最初からリリース用のエンベロープで鳴ってしまうバグがあります。 回避法としては、@q1を使い、その途切れる1フレーム分を、 @v2 = { 9 4 3 2 } と、リリースエンベロープの中に書き込んでしまうという手もあります。 |
例2 2つのパートを交互に演奏する A t120 @2 v9 l8 q8 o4 rcrcrcrc B t120 @2 v9 l8 q8 o4 rererere C t120 l8 q8 o4 cr<gr>cr<gr マーチのリズム。これだと3パートが必要で、メロディが鳴らせない。 でも、 B t120 @2 v9 l8 q8 o4 rererere C t120 l8 q8 o4 c>c<<g>>c<c>c<<g>>c Cパートの休符部分を活用して、ベースと和音を交互に演奏することで、 2パートで同じような表現が可能。 これでAパートをメロディに使えます。 |
例3 いわゆる「セルフディレイ」 超高等テクニック。 @v1 = { 10 } @v2 = { 2 } A @2 o4 l8 q8 @v1 crdrerfr g1 ;基本 A @2 o4 l8 q8 @v1 crd@v2c@v1e@v2d@v1f@v2e @v1g1 ;応用 ;つまり、1拍半遅らせてディレイの音を鳴らす。 ;効果は高いけど、MMLが非常に見にくくなるのが難点といえば難点。 ;ただし、ppmckの最新バージョンでは、もっと見やすく書けます。 A @2 o4 q4 @v1@vr2 SD1 c4d4e4f4 SDOF @vr255 q8 g1 SD[数字]でセルフディレイを開始し、SDOFで解除。 qコマンドや@qコマンドで指定した発音しない部分に、 リリースエンベロープを使って、ディレイの音を自動的に挿入します。 詳しくはppmckのドキュメントを参照してください。 |
■LFOの考え方
LFOには大きく分けて、「ピッチLFO」と「ボリュームLFO」があります。 ピッチLFOは @EP1 = { 0 0 0 0 0 0 0 0 0/ 1 0 0 -1 0 0 } や @MP1 = { 10, 3, 1, 0 } といった具合に指定。 ボリュームLFOは、 @v1 = { 10 10 10 10 10 10 10 10 10 /9 9 9 10 10 10 } といった具合に指定。 どちらも効果がありますが、ボリュームLFOの方が上品な感じかも。 ちなみに実際の楽器などの場合はどうでしょうか。 弦楽器やギター: 弦のどこに指を置くかで音程が決まります。 LFOをかけるときは弦の上で指を震わせる=音程が変動するので、 ピッチLFOをかけていることになります。 管楽器(金管・木管とも): 管楽器は、唇を震わせて音を出します。息の量に応じて音量が変わりますが、 唇を震わすということは息の量が周期的に変動するということです。 つまりボリュームLFOということになります。 ファミコンの音源では、どちらを使うかはケースバイケースですが、 うまく使い分けるとリッチなサウンドが作れます。 |
■2音が重なってしまう時の対処法
2つの音が同音になってひずんでしまう状況の対処例として、 以下の方法があります。 A @2 v10 q8 o4 e1^1^1 B @2 v10 q8 l8 o4 cdefgab>c dc<bagfed c1 これだと、o4eが重なるところで音が歪む可能性があります。 次のように、重なる部分で、短い方の音に一時的にデチューンをかけると 回避できます。 A @2 v10 q8 o4 e1^1^1 B @2 v10 q8 l8 o4 cd D1 e D0 fgab>c dc<bagf D1 e D0 d c1 |