LoginSignup
0
1

音声データをMIDIで完全再現する

Posted at

目次

1.はじめに
2.概要
3.詳細
4.結果
5.やってみての感想

はじめに

 Youtubeで音の錯覚がバズっていたのを見かけたので、自分でも作ってみたいなと思い実行に至った。

※音の錯覚とは、
 MIDIだけで相当数の音を組み合わせることで、元の音声を再現するもの。

概要

 フーリエ変換をすることで、元の波形を周波数とその位相に変換することができます。その原理を利用して、MIDIで設定する楽器を正弦波にし、MIDIだけで人のボーカルも含めた曲を再生できるようにしました。(フーリエ逆変換相当の部分をMIDIで行う。)
原理としては、Mp3に近いと思います。

詳細

MIDI
 バズっていた音の錯覚動画では、楽器はピアノ(初期設定?)や電子ピアノなどになっていたと思われます。これらの楽器は倍音成分が少ないので比較的高精度に再現できるのだと考えてますが、今回は完全再現していきたいので、より正弦波に近い楽器を設定していきたいと思います。
 Windows標準搭載のMIDI音源であるMicrosoft GS Wavetable SW Synthには、搭載されていない楽器が複数あり、それには正弦波も含まれていました。ここで別のMIDI音源(SGM-V2.01)に変更することで対応しました。

フーリエ変換
 音声ファイルから得られた波形をフーリエ変換していくのですが、次の問題が浮上しました。

 1.フーリエ変換する周期の設定
 2.連続で変化する周波数成分の対応
 3.音階に相当する周波数のみのフーリエ変換で十分なのか
 4.位相はどうするか

1.については、ある周波数fでフーリエ変換するとき、その3周期分の区間ごとに設定しました。周期ごとにしておくことで窓関数の設定が必須でなくなりました。

2.については、MIDIの音量の段階が127段階あり、閾値を設定しないとノートの数が非常に多くなってしまい処理落ちしてしまうため、10段階分以上変化したときノートの音量を変更する処理にしています。

3.については、音階相当の周波数のみのフーリエで十分人の声などは聴くことができましたが、音質で言うとラジオ相当です。もう少し精度を上げたいと考えたので、Pitch Bend機能を使用し、微分音(6分音)を導入しました。
※微分音は、半音よりさらに細かく分けられた音程を指す。

4.については、MIDIの分解能およびテンポを最大に設定しても高周波の位相を再現できないため、断念しました。

環境
・実装はJavaで行っています。

結果

 このMIDIデータは約70MBであり、Dominoで読み込むのに約2分かかりました。

やってみての感想

 想定外なレベルで精度よく再現できたと思います。ある楽曲のボーカルを分離しそれだけMIDIファイル化し、他のMIDIファイルとマージするという応用もあると思うので、可能性は感じています。

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1