Friday night funkinの自作MODの作り方3(サウンドフォント)

※この一連の記事は「kade engine」という初期の方に作られたMOD engineを紹介しています。現在「psych engine」などのプログラミング要素が最低限になったMOD engineが開発されていますので其方を検索してみてください。

なお本記事はFNFMODで使われるサウンドフォントについて説明した者です。こちらはどのengineを使うにしても共通してくるところなので上記の事を頭に置きつつ読んでい頂ければ幸いです。(2023/03/02追記)


!注意!

この記事に掲載されている情報のうち、?音声ファイルは何個必要?の部分が間違っています。(具体的には単音としての構成は間違っていませんが、最近追加された公式のofficial chromaticの構成に合っていません)。大変申し訳ありません。

初めに

こんばんは、メルーネです。
自キャラの3Dモデル作成にかまけて更新が遅くなりました。
すみません…。

言い訳はさておき、今回はサウンドフォントについてまとめようと思います。サウンドフォントとは非常にザックリいうと『自分で録ったwavファイルやoggファイルを使って作ったDAWで使える自作音源』です。拡張子は.sfz。OS備え付けのメモ帳と基になる音声ファイルがあればすぐ作れます。

(今回の説明では、私自身が最近まで#と♭の意味すらよく分かってなかった楽譜読めない人間なので音楽的な説明は省略させていただきます。なので、今回の記事は『公式のサウンドフォントを元に自キャラのサウンドフォントを作成する』ことを目標に、『コードは多分こんな感じの事を書いてるんじゃないかな』というのを交えながらまとめていきたいと思います。)

Q.サウンドフォントは必須ですか?

A.自分の声などの録音した音複数種類扱う場合、あった方が音楽作るのが楽じゃないかと思います。必須ではありません。

具体的に例を挙げると、公式のbfやDad,Pico、MODのTabiなど『あー』とか『えー』とか『ぴー』とか人間の声を基にした複数の音の種類があるキャラを作る場合にはサウンドフォントを作ると楽です(多分)

逆に作ろうとしているキャラがMODのAgotiやRuvのように(恐らく)楽器から音をとっているキャラの場合にはほぼ要らないと思います。

Q.UTAUで代用できない?

A.出来ます。

(そもそもサウンドフォントに手を出すに至った経緯が、IOSアプリのmedlayからmidi出力→UTAUで歌わせてwav出力→ios版FL studioでミックスとかしてたら盛大に音がズレて治せなかったというものであってUTAU使えるならUTAUの方が早いです。更にUTAUをDAW上でVSTプラグインとして動かせるようにした猛者がニコ動にいらっしゃって、それ使えば伴奏と同時進行で作れるのでぶっちゃけサウンドフォントより楽なんじゃないかと思わなくもないですね)

DAW上でのドレミの表記

DAW上では基本的にドレミをアルファベットを使って表示しています。そのため、これ以降の説明もアルファベットでの音階表示を使います。そこで一応簡単に表記の仕方を書いておこうと思います。(もう分かってるよ!という方は読み飛ばしてください。)

さて、説明ですが、まずドから次のドまでは12個の音階があります。
ご存じの通りカタカナだと
ド→ド#→レ→レ#→ミ→ファ→ファ#→ソ→ソ#→ラ→ラ#→シ 
となっています。

アルファベット表記ではドをCとしてABCDEFGを使って表します。
これを上と同じように並べると次のようになります。
C→ C#→ D→ D# →E→ F→ F#→ G→ G#→ A→ A#→ B

更にDAWではオクターブの高さを数字で表します
C#2 とか G6 とかいう表記です。
使っているソフトによりますが一番低いオクターブは-2~0高い方で7~9に設定されていることが多いようです。(因みにフリーソフトであるUTAUの使える音域は0~7で、ボカロ曲大体2~5の範囲で歌われています。1とか6あたりになると人間が歌うのきつそうだなぁ……という音程になります。オクターブと数字の関係の大まかなイメージを掴めますでしょうか)

今回の記事ではこの表記が沢山出てきますが、C = ド と 数字はオクターブの高さ だけ覚えてもらえればとりあえずOKです。

サウンドフォントを作る

では、本題です。
サウンドフォントを作るには以下の三つの手順が必要です。

1)音声ファイルを用意する(.wavや.ogg)。
2)メモ帳などでコードを書く。
3)『名前をつけて保存』から拡張子を『.sfz』にして保存。
この時元のtxtファイルが残っていた方が後で編集しなおせて良い。
sfzファイルの保存場所にも注意。

今回は『本家のソースコードを改造して自キャラの音源を作る』のが目的なので、まずは以下のURLから本家のソースコードをご覧ください。また、ページ上部のFNFsoundfontsからbfのサウンドフォントをダウンロードできるので是非ダウンロードしてください。実際に完成形が手元にあった方が何かと分かりやすいです。

本家bfのサウンドフォントのソースコードです。
       ↓ https://github.com/NyxTheShield/FNFSoundfonts/blob/main/SFZ/The%20Boyfriend%20Soundfont(by%20NyxTheShield).sfz

これを元に解説をしていきます。
一番最後に今回参考にさせていただいたサイトを記載していますので、そちらも併せてご覧ください。

またbfのサウンドフォントにはランダムに音がなるキースイッチも含まれていますが、そこまでまだ理解できていないので今回の記事ではランダム化に関するコードの解説はしません。


ソースコードの大まかな構成

初めにコードの大まかな構成についての説明です。
サウンドフォントのコードは主に次の4つのブロックに分けられ、コードの内容とその影響する範囲が違っています。上から順に説明します。

<control>→全体に影響を及ぼしたりDAW上で影響のある項目が設定されています。(公式のサウンドフォントに使われているlabel_ccNはDAW上でパロメータの名前を変更するようですが、理解が及びませんでした。申し訳ないです)

<global>→全体の設定を記述する場所です。bfのサウンドフォントだとビブラートとかアタックとかフェードアウトとか『こんな風に音を鳴らすよ』というのが書いてあります。音楽的な説明が必要になるので今回の記事では此処の部分の詳しい説明は省きますが、そのままコピペして使っても大丈夫だと思います。

<group>→複数の<region> を一個のまとまりとして捉え、その設定を記述する場所です。簡単に言うと『このスイッチを押してるときは「あー」の音を鳴らすよ』みたいなことを設定できます。

<region>→一音一音の設定です。『このキーを押してる時にはこのwavを使ってね』ということを設定します。


以上を踏まえるとソースコードは下のような構成で書かれていることがわかります。

=================================<control> ←全体の設定1
   ~~~~~~~~~~(色んな記述)
<global> ←全体の設定2
   ~~~~~~~~~~
   ~~~~
<group> ←次の<group>までの<region>に適用される設定(グループA)
   ~~~~~~~~~~
   ~~~~~
<region>←グループAの設定が適用される音1
   ~~~~~~
<region>←グループAの設定が適用される音2
   ~~~~~~
<group> ←此処から別のグループ(グループB)の設定
   ~~~~~~~~~~
   ~~~~~
<region>←グループBの設定が適用される音1
   ~~~~~~
<region>←グループBの設定が適用される音2
   ~~~~~~
==================================

<group>の中身について

続いて<group>の中身を見ていきたいと思います。
<group>のソースコードを抜粋すると下記のような記述になっています。
こちらを上から順にざっくり解説していきます。

<group>
group=0 
sw_default=0
sw_lokey=0
sw_hikey=11
sw_last=0
sw_label=Aah

group=0
グループ番号を設定します。
この場合このグループは0番のグループという意味です。

sw_default=0 
→デフォルトでキースイッチの指定番号を押された状態にする、という意味です。この場合、0が押された状態になりますが、此処でいう0は唯の数字ではなくC-1を指します。サウンドフォントのコードでは音階をアルファベット(C-1~G9)の他、0~127で表記することができます。
つまり、C-1 = 0 であり、 C0 = 12 です。 

キースイッチというのは『ある特定のキーを押すと音色が変わる』仕組みです。実際にひいている音階とは別に、例えば今回の例だとC-1を押すと今まで『おー』だったのが『あー』に代わる、みたいなものです。

(このコードがどんな機能をしているのかは正直分からないのですが音を鳴らした後に勝手にキースイッチが解除されることを防いでいる可能性があるような気がします。『あ』を発音した後にキースイッチによって他の発音に代わるまではずっと『あ』の音を使う……みたいな……分かんないですね。有識者助けて……)

sw_lokey=0
sw_hikey=11
sw_last=0
→sw_lokeyとsw_hikeyでキースイッチで使う音階の範囲を指定します。通常余りに低い音は歌唱用としては使わないので0~11(つまりC-1~B-1)を音を出すのではなくキースイッチの切り替えとして使うようにします。
sw_lastはキースイッチの範囲の内、どのキーが最後に押されたらこのグループの音を出すかを設定します。この場合だと、このグループは0(C-1)が最後に押されたキーだと、このグループに所属している<region>の音が鳴ります。

sw_label=Aah
→キースイッチに名前を付けます。この場合だと『Aah』と表示されます。


以上を元にソースコードに注釈を入れると下記のようになります。

<group>
group=0 //グループ番号。
sw_default=C-1 //デフォルトでC-1を押した状態にする
sw_lokey=C-1 //キースイッチ範囲の上限
sw_hikey=B-1 //キースイッチ範囲の上限
sw_last=C-1 //最後にC-1が押された場合
sw_label=Aah //キースイッチの名前

<region>の中身について

次は<region>の中身を見ていきます。
<region>の中身は至ってシンプルです。ソースコードは以下の通り。

<region>
sample=samples/BFa_C3+KA#2-D#3.wav
sw_last=0
lokey=34
hikey=39
pitch_keycenter=36
loop_mode=loop_continuous

sample=samples/BFa_C3+KA#2-D#3.wav
→音源として使用する音声データを指定します。
sfzファイル(今書いているコードの事です)と音源が同じフォルダ内にあるならば、sample=【音声ファイル名】でokです。
公式のような状態なら
sample=【音声ファイルの入っているフォルダ名】/【音声ファイル名】
となり、更に『あー』とか『えー』とかで分けているなら
sample=【音声ファイルの入っているフォルダ名】/【分けている中で指定したい音声ファイルが入っているフォルダ名】/【音声ファイル名】
となります。

sw_last=0
→先述の通りです。

lokey=34
hikey=39
pitch_keycenter=36
→lokeyとhikeyで、sampleで指定した音声ファイルを使用する範囲を設定します。この場合だと34~39(A#1~D#2)、つまりラ#1~レ#2の範囲で指定した音声ファイルを使用します。
pitch_keycenterは指定した音声ファイルがどの音階のものなのかを設定します。この場合だと36(C2)です。この音階を基準に他のキーで使用した時の補正が入るので必ず正しい音階を入力してください。

loop_mode=loop_continuous
→ループを設定します。この場合はループがオンです。音声ファイルの長さを超えて音を鳴らしたときに一定の場所をループさせることで音を鳴らし続けます。

以上を元にソースコードに注釈を入れると下記のようになります。

<region>
sample=samples/BFa_C3+KA#2-D#3.wav  //音声ファイルの指定
sw_last=C-1  //最後にC-1が押された場合
lokey=A#1  //この<region>の音が鳴る範囲の下限
hikey=D#2  //この<region>の音が鳴る範囲の上限
pitch_keycenter=C2  //指定した音声ファイルのキー
loop_mode=loop_continuous  //ループがオン

Q.音声ファイルは何個必要???

A.一種類の音声に対して10個。

本家のソースコードを改造して作ることを前提にしてお話ししますと、bfのソースコードでは順番が前後しているため少しわかりにくいですが、1オクターブにつき、A# B C C# D D# の範囲を設定している<region>と E F F# G G# Aの範囲を設定している<region>で構成されています。

つまり、1オクターブにつき、
A#~D#(ラ#~レ#)の範囲→C(ド)の音声ファイル
E~A(ミ~ラ)の範囲→F#(ファ#)の音声ファイル

の2つの音声ファイルが用意されています。

更にこれが 
ラ#1~ラ2 ラ#2~ラ3 ラ#4~ラ5 ラ#5~ラ6 ラ#6~ラ7 の
5オクターブ分設定されているので最終的に必要な音声ファイルは、1種類の音声につき10個となります。

その他サウンドフォント自体の注意

◆DAWによっては押してるキーと鳴ってる音が1オクターブほどズレます。
 なんか変だなと思ったら比べてみてください。
◆コードを書くときに=の両端にスペースを入れてはいけません。
また、全角スペースは一般的にプログラミングではエラーの原因になりやすいそうなので使用は避けた方が良いと思います。

今回参考にさせていただいたサイト様



この記事が気に入ったらサポートをしてみませんか?