8

私は Java を使用した音楽のトランスクリプションに関するプロジェクトを持っています。つまり、音を録音して WAV ファイルに保存するアプレットを作成しました。プレーヤーは、トランスクリプションしたい曲だけを再生する必要があります。その時点で、保存された WAV ファイルから情報を取得し、この情報を使用して MIDI ファイルを作成する必要があり、MIDI ファイルを作成した後、そのための楽譜 (楽譜) を生成する必要があり、これらすべてを実行する必要がありました。 Javaで。

これらのことをどのように行うことができるかについての明確な説明を求めてどこでも検索しましたが、直接的なものは見つかりませんでした:(私はJavaが初めてなので、誰かに助けてもらいたいです。それは:

  1. WAV ファイルで再生中のノートに関する情報を取得します。
  2. ノートを知る。
  3. WAV ファイルに相当する MIDI ファイルを作成します。
  4. MIDI ファイルから SCORE を生成します。

読み取られているデータに対してセグメンテーションを実行した後、高速フーリエ変換も試しましたが、それは完全に間違った方向に進んだと思います:(

上記のトピックと、これらをJavaでのみプログラミングする方法について誰かが私を助けてくれれば、本当に高く評価されます:)

ちなみに、このプロジェクトは:
プレーヤーがピアノで音符を弾く >> 演奏を記録する >> プレーヤーが演奏のスコアを取得するというものです。

4

5 に答える 5

3

私は決してこの分野の専門家ではないので、これがすべてゴミである場合は事前にお詫び申し上げます。

ファイルから音符を取得するには、WAV ファイルに対してFFT (高速フーリエ変換)を実行する必要があると思いますが、一度に10 ミリ秒程度の音しか出ません。次に、その時間フレームの FFT で最高のピークを見つけ、次の 10ms の「フレーム」などに移動します。再度 FFT を実行し、最高のピークが前のピークと異なる周波数である場合、それは新しい音であると表示されます。ノートの長さを確認するには、互いに特定のしきい値内にあるピークの数を数え、各フレームに使用している時間 (10ms など) を掛けます。

繰り返しますが、私は専門家ではなく、おそらく他の方法もあるでしょう。

それはさておき、これがお役に立てば幸いです...少しでも。

于 2011-02-07T08:46:05.373 に答える
1

私はその分野の専門家ではありませんが、Xuggler (Java ffmpeg ラッパー) で少し遊んでいたことがあります。このライブラリは、メディア ファイルから多くの興味深いデータを抽出することができ、ファイルのトランスコーディングやその他多くの優れた機能を可能にします。ここにリンクがあります: http://www.xuggle.com/xuggler/

于 2011-02-07T09:25:23.570 に答える
1

私は同じ考えを念頭に置いて、非常に単純だが不完全な解決策を試しました。fdreger の投稿で指摘されているように、プロのソフトウェアでさえ、実際にはこのタスクを正しく実行できません。(IntelliScore、AudioScore、およびその他のソフトウェアのデモ版をいくつか試しましたが、ポリフォニック音楽を扱う場合、これらのどれも特に効率的ではないようでした)

しかし、自分で試してみたい場合は、ここにあるソースコードを使用しました : http://www.psychicorigami.com/2009/01/17/a-5k-java-guitar-tuner/頻度の決め方。(FFTはより正確になりますが、より複雑になります)。

画面にメモを表示するために、ここにある abc4j ライブラリを使用しました: http://code.google.com/p/abc4j/

ただし、上で指摘したように、モノフォニック音楽 (1 つの声) でのみ機能します。

幸運を!

于 2012-02-12T17:15:07.050 に答える
1

What you want to do is currently impossible. The scope of what you described is beyond anything current professional music programs can do, and they have literally hundreds of man-years of programmers' time invested.

You might achieve something if you radically cut your requirements.

  • to find the pitch of sound, use FFT; this is the easiest part; you will have to restrict yourself to single notes here, you will not be able to cleanly read chords.

  • 曲の拍子記号や速度 (bpm) を検出することはできません。唯一のチャンスは、アプリケーションにある種のメトロノームを組み込み、プレーヤーに拍子を合わせるように強制することです。スイング時間をサポートしたい場合は、プレーヤーによっても設定する必要があります。

  • MIDI を作成するときは、すべての音符をクオンタイズします (= 始点と終点を小節の 1/4、1/8、または 1/16 に最も近い位置に移動します)。

  • 既製の組版システムを使用してスコアを作成します。musictexはあなたのために働くかもしれません。自分で描画するよりも、tex ファイルを生成する方がはるかに簡単です。もし私があなただったら、譜面を組む際の規則のいくつかを無視するでしょう (私は確かに連桁を削除します。連桁に関しては非常に多くの規則があります)。

メロディーを 1 つに制限し、音楽の組版のほとんどを無視することを選択し、ピアノ奏者に独自のメトロノームを使用させ、リズミックの選択を制限すると、成功する可能性があります。

于 2011-03-11T10:48:33.143 に答える
0

Audacityと呼ばれる非常に優れたオープン ソースのサウンド エディターがあります。はい、C++ で書かれていますが、ソース コードで探している答えが見つかるかもしれません。C++ コードを Java に変換することはそれほど難しくありません。

于 2011-02-07T08:49:45.700 に答える