13

私が達成しようとしているのは、Pythonアプリケーションからギターコードを演奏することです。必要に応じて、和音の周波数を知っています(または計算できます)。

正しい周波数で複数の正弦波を生成する低レベルのレッグワークを行っても、エンベロープも正確である必要があるため、正しく聞こえないだろうと思います。そうしないと、ギターのようには聞こえませんが、ハムのように聞こえます。

興味深いことに、linux soxコマンドプレイは、次のような非常に説得力のある個別のメモを生成できます。

play -n synth 0 pluck E3

だから本当に私が求めているのは、

a)コード全体を実行するために再生コマンドを靴べらにすることは可能ですか(理想的には、ピックストリングストロークをシミュレートするために開始時間がわずかに異なります)-私はこれを行うことができませんでしたが、フォークするいくつかのバッシュフェアリーダストがあるかもしれませんプロセスなどなので、正しく聞こえます。これが可能であれば、コードからbashコマンドを呼び出すだけで解決します(ホイールを再発明するのは好きではありません)。

b)(さらに良い)これ(ギターコードサウンド)を達成する方法はPythonにありますか?アクセス可能なPythonMIDIライブラリをいくつか見てきましたが、率直に言って、MIDIは、私が知る限り、私が望むサウンドには適していません。

4

3 に答える 3

13

The manual gives this example:

play -n synth pl G2 pl B2 pl D3 pl G3 pl D4 pl G4 \
               delay 0 .05 .1 .15 .2 .25 remix - fade 0 4 .1 norm -1

これにより、シンセの6つの同時インスタンスが(個別のオーディオチャネルとして)作成され、5つのチャネルがわずかに増加して遅延し、それらが1つのチャネルにミックスダウンされます。

結果はかなり説得力のあるギターコードです。もちろん、ノートや遅延を非常に簡単に変更できます。また、「ギター」のサステインとトーンを試してみたり、オーバードライブ効果を追加したりすることもできます。詳細については、マニュアルを参照してください。

于 2012-06-14T12:43:12.537 に答える
6

a)ハックな方法は、バックグラウンドサブプロセスを生成して各playコマンドを実行することです。バックグラウンドサブプロセスではシェルが終了するのを待たないため、play一度に複数のを実行できます。このようなものが機能します:

for p in "C3" "E3" "G3"; do ( play -n synth 3 pluck $p & ); done

ninjageckoが私がこれを書いているのと基本的に同じものを投稿したことがわかります。

b)MIDIデータについて理解するための重要なポイントは、それがサウンド自体ではなく、サウンドを生成するための高レベルのレシピのようなものであるということです。つまり、各MIDIノートは、ピッチ、強弱レベル、開始時間と停止時間、およびその他のさまざまなメタデータとして表現されます。実際のサウンドはシンセサイザーによって生成され、さまざまなシンセサイザーがさまざまなレベルの品質で機能します。MIDIファイルから取得するサウンドが気に入らない場合は、MIDIの問題ではなく、シンセサイザーの問題であるため、より適切なサウンドを見つける必要があります。(実際には、通常$$$かかります。ほとんどの無料または安価なシンセサイザーはかなり悪いです。)

An alternative would be to actually dig under the hood, so to speak, and implement an algorithm to create your own guitar sound. For that you'd want to look into digital signal processing, in particular something like the Karplus-Strong algorithm (one of many ways to create a synthetic plucked string sound). It's a fascinating subject, but if your only exposure to sound synthesis is at the level of play and creating MIDI files, you'd have a bit of learning to do. Additionally, Python probably isn't the best choice of language, since execution speed is pretty critical.

If you're curious about DSP, you might want to download and play with ChucK.

于 2011-07-13T23:11:34.560 に答える
4

a)コード全体を実行するために再生コマンドを靴べらにすることは可能ですか...?

サウンドアーキテクチャがサポートしている場合は、オーディオを同時に出力する複数のコマンドを実行できます。ALSAを使用している場合は、にdmixまたはその他のバリアントが必要です~/.asoundrcsubprocess.Popen多くの子プロセスを生成するために使用します。これが仮想的にbashスクリプトである場合、次のことができます。

command1 &
command2 &
...

b)(さらに良い)これ(ギターコードサウンド)を達成する方法はPythonにありますか?

MIDIにコンパイルし、FluidSynthなどのソフトウェアシンセサイザーを介して出力します。

于 2011-07-13T22:50:45.960 に答える