2011-07-13 32 views
13

我想要實現的是從我的python應用程序中彈奏吉他和絃。如果需要,我知道(或可以計算)和絃中的頻率。在linux和/或python中產生吉他和絃的最簡單方法

我在想,即使我做低頻腿部產生多個正弦波的正確頻率,由於信封需要正確也不會聽起來不錯,否則它聽起來不像吉他,但更多的嗡嗡聲。

Tantilisingly,Linux的命令SOX打法可以產生一個非常有說服力個體注意到:

play -n synth 0 pluck E3

所以真的要問我什麼是,

a)是有可能的鞋拔子發揮命令做一個完整的和絃(理想情況下,開始時間略有不同,以模擬撥琴絃中風) - 我一直沒有能夠做到這一點,但也許有一些bash fairydust會叉進程或這樣聽起來很正確。如果這是可能的,我會解決只是從我的代碼調用bash命令(我不喜歡重新發明輪子)。

B)(更好)是否有實現這一(吉他和絃聲音)的蟒蛇的方法嗎?據我所知,我見過一些可訪問的python midi librarys,但坦率地說midi並不適合我想要的聲音。

回答

13

手動給出了這樣的例子:

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,然後將它們混合到一個單一的頻道。

結果是一個非常令人信服的吉他和絃;你當然可以很容易地改變音符或延遲。您還可以播放「吉他」的延音和音色,或者添加超頻效果 - 請參閱手冊瞭解詳細信息。

+0

不錯。我會放棄這一點。目前的解決方案相當不好,而且我發現如果你反覆運行它可能會崩潰,但只要你慢慢做,它聽起來就沒問題。 - 生病嘗試,並在接下來的幾周內回來。 – Sirex

+0

太棒了!我會將接受的答案移到這裏,因爲它確實聽起來好多了。 :-) 謝謝 ! – Sirex

+0

你有沒有想法如何使用'pl'合成器子命令做銳利/平坦? – sehe

4

a)是有可能的鞋拔子發揮命令做一個整體的弦......?

如果你的聲音架構支持它,你可以運行多個命令在同一時間輸出音頻。如果您使用ALSA,則需要在您的~/.asoundrc中使用dmix或其他變體。使用subprocess.Popen來產生許多子進程。如果這是假設一個bash腳本,你可以這樣做:

command1 & 
command2 & 
... 

B)(更好)是否有實現這一(吉他和絃聲音)的蟒蛇的方法嗎?

編譯到MIDI並且經由軟件合成像FluidSynth輸出。

+0

今晚我會試試,但即時通訊Fedora(我假設我的客戶的用戶將主要在Fedora或Ubuntu上),但即時通訊使用pulseaudio。我昨天想到了這個技巧,但是當我嘗試它時,我沒有聽到任何聲音,直到我將這個過程帶回到前臺,這種方式擊敗了這一點。關於B)我想知道sox是做什麼的,因爲我用midi嘗試了每個樂器,聽起來像垃圾,但是sox對我來說聽起來還不錯。也許它是一種幻想。 – Sirex

6

一)的hackish方式是生成一個背景子進程運行每個play命令。由於後臺子進程不會使shell等待它完成,因此可以同時運行多個play。像這樣的東西會工作:

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

我看到ninjagecko貼基本上是一回事,因爲我寫的。

二)關鍵點,實現對MIDI數據是,它更像是一個高層次的配方生產的聲音,而不是聲音本身。換句話說,每個MIDI音符表示爲一個音高,一個動態電平,開始和停止時間以及其他元數據。實際的聲音由合成器產生,不同的合成器以不同的質量水平完成工作。如果你不喜歡你從MIDI文件中獲得的聲音,這對MIDI來說不是問題,這是你的合成器的一個問題,所以你只需要找到一個更好的。 (實際上,這通常需要$ $$$;大多數免費或便宜的合成器都很糟糕。)

另一種方法是真正在引擎蓋下挖掘,可以這麼說,並實現一種算法來創建自己的吉他聲音。爲此,您需要查看digital signal processing,特別是Karplus-Strong algorithm(創建合成彈撥絃聲音的多種方法之一)。這是一個非常吸引人的主題,但是如果你只有在聲音合成方面接觸到play的水平並創建MIDI文件,那麼你需要學習一些東西。另外,Python可能不是語言的最佳選擇,因爲執行速度非常關鍵。

如果你對DSP感興趣,你可能想要下載和使用ChucK

+0

for循環似乎工作,儘管由於幅度有一些削波,但它是一個很好的開始,謝謝:-) - 我大多打折midi作爲一個選項,因爲它會聽起來不同的每個最終用戶的機器。我會看到for循環在哪裏得到我。用「vol」說明符固定的 – Sirex

+0

。這看起來像可行的解決方案,謝謝! :-) – Sirex

相關問題