DTM
出典: フリー教科書『ウィキブックス(Wikibooks)』
画像映像・音楽入門 > DTM
目次 |
[編集] DTM入門
DTM(DeskTop Musicの略?)はコンピュータを使って音楽を作る活動の事である。DTMは伝統的に高価な機材とソフトウェアを用いて行う活動とされており、廉価な代替物が手に入れにくかった分野です。しかし、現在ではMIDIの作成から音を出力する過程までが比較的手軽にできるようになっている(もちろん機材があればその過程が簡潔かつより高度な編集が可能であることはいうまでもありません)。
ここでは、Linuxを利用してMIDIを作成し、ソフトウェア音源を利用して実際に音を鳴らすまでの手順について述べます。LinuxについてはUNIX/Linux入門などを参照してください。
[編集] MIDI
最初にMIDIについて解説します。元々計算機で音を扱う方法として、空気の振動を電気的な波形に変換し、それを離散化してデジタルデータとして扱うことができることを高等学校情報Cで述べました。計算機上で、音を扱う方法は基本的にこれ1つしかありません。
コンピュータ上の音楽ファイルとしてはWAVファイル、MP3ファイル、Ogg Vorbisファイルなど、様々な保存形式があり、これらはどれも異なった方法で音を扱っているように思えます。しかし、実際にはこれらはどれも同じデータ(サンプルレートなどの違いはあれど)を扱っており、異なっているのはデータではなくデータを圧縮する方法となっている。
残念なことにデータの圧縮は数学的な過程でこれらの違いを理解することは非常に困難である。フリーな圧縮形式であるOgg Vorbisの圧縮方法はWeb上で公開されているので、もしも興味があれば見てみるのもよいかも知れません([1])。
ここまででコンピュータが音を扱う方法は基本的に1通りしか無いことを述べて来ました。MIDIはいくつかの方法で用いられますが、MIDIもまたコンピュータ上で音を扱う方法である。しかし、これまでに見てきた方法とは本質的に異なった方法で音を扱います。より正確にいえば、音そのものではなく楽譜のデータを扱う方法といった方がよいかも知れません。
もちろん楽譜と音は互いに異なったものである。楽譜は音そのものではなく、楽譜にそって演奏された音楽が音です。そのため、楽譜の情報を扱うMIDIと音を扱うOggなどの形式は本質的に異なった情報である。
ただし、ソフトウェアシンセサイザなどのソフトウェアを利用すると、あたかもMIDIファイルが音を扱うファイルであるかのようにMIDIファイルの内容を演奏できてしまいます。そのため、MIDIファイルが音を扱う形式であると述べても決して間違いとはいえません。しかし、MIDIファイルとOggファイルが扱う情報は本質的に異なったものであるという事ははっきりさせておく必要がある。
[編集] MIDIの構成
音を扱う情報と楽譜を扱う情報は非常に異なっている。
まず、楽譜が扱う情報は(あまり)曖昧さがありません。音の高さ1つを取っても例えばミとファの間には音は存在しないことになっています。一方、 音自体を情報として扱う視点から見れば、ミの音は周波数659Hzの音であり、ファの音は周波数698Hzの音(周波数については後述)であるので、その間には当然多くの音が存在し得ます。
このことから分かる通り、楽譜が扱う音は実際に音そのものとして存在し得る音よりもかなり少ない種類の音を扱います。このことは、情報をデジタル化することを考えるとありがたい事である。なぜなら、少ない種類の情報はより少ない量の情報で表すことができるからである(より正確な議論は情報量を参照)。
ここまででMIDIが扱う情報の性質に付いて述べました。次に、実際のMIDIがどのような情報を扱っているかについて述べます。まず最初に、どんな情報を扱うかを直観的に述べる。そのあと実際の情報の表し方も述べますが、これはプログラマ向けの内容なのでMIDIを使うことが目的ならそこは読まなくてもよいでしょう。
楽譜を扱う上で重要な情報はある音程の音を出力する事である。MIDIでは、この命令のことをNOTE_ONと呼びます。また、反対の命令として、ある音程の音の出力を取り止めることをNOTE_OFFと呼びます。
基本的なMIDIはNOTE_ONとNOTE_OFFの命令を繰り返すことで構成される。しかし、楽譜に記述される情報はそれだけではありません。例えばある曲においては、楽譜の複数部分を同時に演奏する必要がある。例えば、ピアノは両手で演奏される場合には、弾き手は楽譜の2つの部分を同時に演奏する必要があります。MIDIでは、これらの楽譜の部分をチャンネルと呼びます。MIDIを扱う場合には複数のチャンネルを扱う方法を規定する必要がある。
また、実際の演奏で利用される楽器の種類も、楽譜によって指定される。そのため、MIDIではいくつかの楽器を使い分ける必要がある。
ここからは実際に上で述べられた情報がどのようにデジタルデータとして扱われているかについて述べる。MIDIは情報を扱う手段として
命令 データ
というフォーマットで記述されるw:バイト列を使います。命令、データともにバイト列ですが、データの量は、命令の種類によって変化している。命令の種類は数多いのですが、ここではNOTE_ONと、NOTE_OFFだけを扱います。
各々の命令に対して、トラックを扱う手段が必要です。MIDIが同時に扱えるトラックは少なくとも16種類あることが保証されている。そのため、16種類のトラックに対して、NOTE_ON、NOTE_OFFを送る命令があればよいわけである。
チャンネルn(n<16)に対するNOTE_ON命令は次の命令で表される。
0x9n 0x.. 0x..
ここで、nは、(16進数で)0からfまでの値を取ります(16進数については高等学校情報Cを参照してください)。NOTE_ON命令は2バイトのデータを取ります。最初のデータは音程を表す情報です。音程はキーボードにある順で順に値がふられています。まず、真中のド (C3?) が0x60で、以降ド#:0x61、レ:0x62と続いていきます。次に、2つめのデータは、音が演奏される強さを表します。
NOTE_OFF命令も同じように2バイトのデータをとります。チャンネルnに対するNOTE_OFF命令は
0x8n 0x.. 0x..
となる。ここで、NOTE_OFFの場合には音の強さは関係ないのでデータの2バイト目は任意の値を設定する。
実際の演奏ではNOTE_ONとNOTE_OFFの間の時間、つまり対応する音の演奏時間も伝達されます。この時間のことをデルタタイム (Delta Time) と呼びます。デルタタイムは特殊な形式で書かれるのでMIDIファイルを読むときには注意が必要である(rosegardenx.x.x/sound/MidiFile.cppのgetNumberFromMidiBytesを参照)。
まず、デルタタイムを表すバイトについて、最後のバイトについては0、それ以外のバイトについては1と、各バイトの最も左のビットを設定する。これによってMIDIを扱うプログラムはどこまでがデルタタイムを表すバイトなのかを判断できます。実際のバイト列は次のようになる。
1xxxxxxx 1xxxxxxx ... 1xxxxxxx 0xxxxxxx
実際の時間は各々のバイトについて最も左のバイトを取り去り、それ以外のビットを全てつなげた値で計算する。例えば、デルタタイムが1バイトで表されるときには、デルタタイムを表すバイト列は
0xxxxxxx
で表され、0から127=27単位までの時間経過を表せます。2バイトでは
1xxxxxxx 0xxxxxxx
となり、0から、16384=214単位までの時間経過が表される。
例えば、童謡'かえるのうた'の最初のフレーズである'ドレミファミレド'をチャンネル0で演奏するには(ただし、デルタタイムは160単位、音の強さは40とする)、
90 60 40 81 20 80 60 7f 00(ド) 90 62 40 81 20 80 62 7f 00(レ) 90 64 40 81 20 80 64 7f 00(ミ) 90 65 40 81 20 80 65 7f 00(ファ) 90 64 40 81 20 80 64 7f 00(ミ) 90 62 40 81 20 80 62 7f 00(レ) 90 60 40 81 20 80 60 7f 00(ド)
となる。 ここで、値は全て16進数でかかれています。途中の81 20は、上の数え方を利用すると
1000 0001 0010 0000 -> 000 0010 010 0000 = 28 + 25= 128+32 = 160
となる。
[編集] MIDIソフトウェアシンセサイザ
ここまででMIDIがどのように楽譜の情報をデジタル化するかを見て来ました。ここからはこの情報を実際に音の情報に変換する方法について述べる。
最も簡単な音の合成は対応する音程のw:正弦波を順番に書き込んで行くことです。ただし、サンプルレートの問題があるので、手作業で正弦波を作成しても正しい音程で演奏されないことが予想されます。一般に正しいサンプルレートで演奏するには、サンプルレートを指定できる形式で保存し、後にその形式の音楽ファイルを再生するのが簡単です。
ここでは正弦波を作成するプログラムとして、w:en:SoXを利用します。SoXは音楽ファイルを扱うための簡潔なコマンドラインプログラムで、機能の1つとして正弦波、矩形波の合成がある。具体的にはn Hz(nは整数)の正弦波を出力するには、
$sox infile outfile synth sine n
というコマンドを使います。ここで、infileは音楽ファイルですが、outfileの長さを定めるためだけに使われます。
各々の音の周波数は半音離れるごとに21 / 12だけずれることと、440Hzがラの音に対応すること(音階を参照)を考えることで、上で用いたドレミファミレドは、
ド:523Hz レ:587Hz ミ:659Hz ファ:698Hz
(小数点以下切捨て)に対応する事がわかる。
SoXでは作成した音楽ファイルをつなげて一つの音楽ファイルを作成することができます。音楽ファイルをつなげるためには、
$sox infile1 infile2 ... infilen outfile
のコマンドを利用する。
ここまでで簡単な音楽合成を行う方法を述べました。しかし、実際の音楽演奏では音は正弦波ではなく、より複雑な波形を持っていることが普通である。
このような複雑な波形を合成するには、あらかじめ対応する楽器の波形を記録しておき、適宜その波形を出力することが有効な手段となる。このように波形のデータから音楽データを合成するソフトウェアをシンセサイザ (en:Synthesizer) と呼ばれる。また、楽器に対応する波形データとしてサウンドフォントen:SoundFont (.sf) が知られている。
ここではシンセサイザとしてTimidity++ () を利用します。ここからはTiMidity++の使い方を説明しますが、既に何らかの方法でMIDIが再生できる場合にはこの章はとばして次に進んでください。
[編集] Timidity++
[編集] MIDIシーケンサ
ここまででMIDIを再生する方法について述べました。ここからはMIDIを作成する方法について述べる。
MIDIを作成するソフトウェアをMIDIシーケンサと呼んでいる。Linuxで動くMIDIシーケンサとして有名なものに、en:Rosegardenがあります。ここからはRosegardenの説明をするので、他の方法でMIDIを作成する人は別の資料を探した方がよいでしょう。