第 4 章 k 最近傍法を用いた提案手法
4.3 発音時刻検出方法
42
43
Fig4.4 スネアドラム単音のエンベロープとmironsets関数による発音時刻検出結果
mirpeaks 関数により検出された発音時刻のうちピークの高い順に上位 10 個と、
mironsets関数により検出された2つの発音時刻を比較した表をTable4.1に示す。
Table.4.1 mirpeaks関数とmironsets関数でそれぞれ検出された発音時刻の比較
関数の種類 mirpeaks mironsets
発音時刻
(秒)
1.0051 1.0113
1.0098 3.3455
3.3379 1.0068 1.021 1.0141 1.0133 1.0166 3.3421 3.3465
44
この比較結果を見ると、mirpeaks関数は実際の発音時刻に対して、その周辺に大量の候 補を検出することがわかる。一方、mironsets関数は実際の発音時刻に対して1つずつ候補 を検出していることがわかる。そして、それぞれの候補のうち最も実際の発音時刻(1.0000 秒)に近いもの(Table4.1の赤色で示された値)を比較すると、mirpeaks関数のもののほ うが近いことがわかる。
これの原因としては、打楽器が発音してから最大音量に達するまでにはわずかな時間差 が存在する(これをアタックタイム(attack time)という)が、mironsets関数が最大点に到 達したときの時刻を検出しているのに対し、mirpeaks関数は立ち上がりの間も発音時刻と して検出できるからだと考えられる。
この結果から、テンプレートに使用する打楽器単音の発音時刻検出にはmirpeaks関数を 使用することとし、検出結果の中からピークの高い順に 3 個の候補を選んで使用する。こ うすることでテンプレートの開始時刻に幅をもたせ、バリエーションを増やして楽曲とマ ッチングさせやすくなる。
発音時刻の位置からは一定時間長の波形を切り取るが、その長さはあらゆる打楽器の発 音後音量が減衰する時間までをカバーできるよう考慮して約0.5秒間とする。切り取る波形
の例をFig.4.5に示す。図で赤く網掛けされた部分が切り取る範囲となっている。
Fig.4.5 切り取る波形の例(網掛け部分が切り取る範囲)
45
4.3.2 楽曲に含まれる楽器音の発音時刻検出
読み込んだ楽曲の波形から楽器の発音時刻を検出する場合も、打楽器単音の場合と同様
にMIRtoolboxに用意されている関数を使用する。ただし、楽曲の場合、何らかの音が鳴っ
ている状態の波形が数分間続くので、mirpeaks関数を使用して発音時刻を検出しようとす ると膨大な候補が出力される。この候補に対して全てマッチングしようとすると非現実的 な時間が必要となる。また、長めの楽曲を使用する場合は候補数が多すぎてメモリエラー を起こすこともある。これらの理由から、楽曲に対しては mironsets 関数を使用して発音 時刻を検出することとする。
Fig.4.6にmironsets関数を使用して楽曲の楽器の発音時刻を検出した例を示す。
Fig.4.6 mironsets関数を使用した楽曲中の楽器の発音時刻の検出例
楽曲の場合、打楽器以外の楽器音も含まれているため、打楽器音が他の音に隠れて正し く発音時刻を検出できていない可能性がある。そこで、mironsets関数により検出された発 音時刻に対し、補正をかけたものを候補として追加する。具体的には、各発音時刻の前後 それぞれ50マイクロ秒の範囲で、10マイクロ秒刻みでずらした時間、計10個を発音時刻 の候補に追加する。
追加した補正後の発音時刻も含めて、すべての発音時刻候補の位置から一定時間長の波 形を切り取る。マッチングを行うためにはテンプレートと同じデータ形式である必要があ るので、こちらの長さもテンプレートと同様に約0.5秒間とする。
46