如何製作一個基本的減法合成器(軟體)?
Sylenth1鎮樓怎樣編寫一個簡單的減法合成器呢?本人某工科院校計算機專業但學校眾多課程中就沒有音頻編碼等相關課程,想自己嘗試做一個簡單的減法合成器,不知師從何門,我覺得不用做成vst插件放在DAW 里(因為也不會真的用它做音樂),做成一個普通界面化軟體就可以,但真的不知道如何下手,請教了@Kanato@詩云@Vinjn張靜@孟奇@Bill Xia@謝小龍
Wow!想不到知乎上還有這麼冷門的問題!
為了更好地回答這個問題,於是花了1個半小時用Max/MSP做了一個非常簡(cu)約(cao)的減法合成器(如下)。
減法合成器視頻下面來說說思路吧:
1. 減法合成器(Subtractive Synthesizer)原理
要做一個減法合成器首先要知道減法合成器的工作原理。一般合成器有加法(Additive Synthesizer)、減法、FM等種類。加法合成器是通過用許多不同的簡單的波形相加來得到諧波豐富的波形,來模仿原聲樂器。而減法合成器與之相反,是將一個含有豐富的泛音與諧波的基礎波形,通過濾波器(Filter)對波形進行各種衰減(Attenuate)來模擬原聲樂器的波形特徵。用流程圖表示如下:(1)核心部分:構成減法合成器的最重要的三個部分分別是用於產生波形的振蕩器(Oscillator)、濾波器(Filter)以及用於控制音色的起音、衰減、保持、釋音包絡線(ADSR Envelope)。
(2)豐富模組
在基本框架的基礎上,我們可以再加上一些其他的可調控參數的組件,從而獲得更加豐富的音響。比如增加一個振蕩器,並且可以選擇振蕩器發生的波形以及頻率等。然後通過ADSR以及低頻振蕩器(LFO)來進一步控制音色。為了獲得更加豐富的音響效果,Sylenth1的兩個LFO可以調製的參數非常多,從振蕩器的頻率、到濾波器的頻率到相位等等都可以改變,LFO自身可變參數也很多,比如振蕩頻率(Rate)、震蕩幅度(Gain)等等,並且兩個LFO之間還可以互相調製,所以用Sylenth1作出FM合成器那種聲音也是可能的。

2. 如何製作減法合成器
我做的這個合成器就是根據圖3那個增加了一部分模組以後的流程圖來設計的。做起來也很簡單。(1)振蕩器:首先是振蕩器,振蕩器比較簡單,能簡單地進行波形選擇就行了。然後要做AB兩個振蕩器的話,就複製粘貼一下就行。
(2)濾波器:
這裡借鑒了一下Sylenth1的思路,可以分別選擇振蕩器A、B以及AB形式進行濾波。同樣非常簡單。
(3)ADSR
因為做的很簡(cu)約(cao),所以這裡的ADSR就沒有嚴格地用poly+adsr~製作了,取而代之的是用接受到得力度信號來觸發line部件輸出一個值來控制原信號的電平強度,從而產生ADSR的效果。也是非常簡單。
(4)LFO
**這個地方我也是根據Sylenth1的LFO來設計的,然而這樣做到底對不對我也不是很清楚,先暫時存疑(?)了,期待能和知道如何實現這一部分的老師們探討!這個LFO的核心還是可以選擇波形的振蕩器,然後可以通過不同的旋鈕來調節振蕩頻率(1~128Hz)以及振幅。然後根據不同的選項發送調製過的信號到不同的被調製模組。這裡我只做了控制濾波器的cutoff以及振蕩器AB的音高的兩個調製器。同理題主也可以自己設計控制更多的東西,比如振蕩器相位、聲像、ADSR包絡中的參數等等。
3. 後續的改進
(1)UI設計
參見【圖1】。做完了以後,自然就是設計UI啦,我這個從小美術都沒上過80分的人,就不誤人子弟啦。我覺得像Sylenth1那樣把各個模組分開放就行,我這裡就把振蕩器AB、濾波器、包絡以及LFO分開放了。不過Sylenth1這個配色也是滿滿的vintage味啊。。。(2)更多可調參數由於是減法合成器,所以你必須足夠「多」才有東西可減,所以可以像Sylenth1那樣加入不同的voice數量,更多的音符以及detune等等。LFO可以控制改變的參數也可以相應增加。當然最重要的還是濾波器,我個人覺得Sylenth1這個濾波器還不夠好,如果能加入根據音高改變中心頻率(Center frequency)的濾波器或者是多段EQ的話,這個合成器可以模擬的聲音的範圍還可以進步一擴大。(3)效果器除了減法效果器本身以外,還可以自己設計一些諸如Reverb、Delay、Flager、Chorus、Distortion之類的效果器。Reverb的實現比較麻煩,建議從簡單的distortion和delay開始做。(4)APPMaxMSP能直接發布mac app,不過如果用puredate製作的話,可以使用一些插件做成可以上架App store的app。Max和PD都可以發布VST,不過由於我也正在糾結怎麼做成VST中,所以不能給更好的建議啦。如果不想使用這類跳線+模組式的圖形編程軟體製作的話,也可以使用Supercollider、ChucK、C++甚至是Mathematica、MatLab來製作。個人感覺用Mathematica製作減法合成器應該也不會很難。反正不管是什麼語言,只要記的減法合成器的核心部件就是振蕩器、濾波器以及ADSR就行啦。
參考資料:1. Cycling74.com,. 2016. "MSP Filter Tutorial 4: Subtractive Synthesis - Cycling "74 Wiki". MSP Filter Tutorial 4: Subtractive Synthesis.2. FLOSS Manuals,. 2016. "/Chapter: B-Subtractive-Synthesis / CSOUND". /chapter: B-Subtractive-Synthesis / CSOUND.3. Wikipedia,. 2016. "Subtractive Synthesis". Subtractive synthesis.4. YouTube,. 2016. "Max MSP Tutorial 05B1: Subtractive Synthesis [1]". https://www.youtube.com/watch?v=AZBlnZdvtAw.減法合成器無非就是濾掉一些不要的頻率,所謂的濾掉不是完全地清除,而更多地只是削弱,比如我們不要60H~200Hz這個頻率段,那麼減法合成器要做的就是降低這個頻率段的響度,也就是讓它不被聽見,當然要記住它還在,並未消失,只是我們聽不到而已,所以這就是為什麼一說到減法合成器就會提到濾波器,因為濾波器的功能就是濾掉不需要的頻率。
只要知道減法合成器需要濾波器,那麼問題就不那麼難了,本來想用Puredata來進行講解,但發現一些回答者有用到了Max,索性我就來點不同的,就選擇Reaktor和Supercollider。
一、Reaktor
首先需要一個振蕩器模塊和濾波器模塊,為了更好地說明減法合成器,我們可以用一個產生白噪音的模塊。


這就是一個非常簡單的減法合成器,不過再更進一步的減法合成器肯定少不了控制,於是那個控制振幅的ADSR就上場了,於是我們就可以整合ADSR進來,控制濾波器的截止頻率,當然還有振幅的控制。

{ WhiteNoise.ar }.play
接著搞個低通濾波器:
{ LPF.ar(WhiteNoise.ar) }.play
最後來點複雜的:
(
{
var gate, env, sig;
gate = Dust.kr(2);
env = EnvGen.kr(Env.adsr, gate);
sig = LPF.ar(
WhiteNoise.ar,
env.range(40, 10000));
sig = sig * env;
}.play
)
看了一下其他答案,對於減法合成有一個誤解:
信號減去信號不是減法合成,得到的結果會是反相疊加,相當於Mix。減法合成是要用濾波器的。推薦一本書,有中文版:電子音樂技術_互動百科個人建議修Max/MSP(自行百度)減法的基本就是在基礎的波形上濾掉一些不需要的波形,所以理論上來說,兩個osc,一個濾波,一個lfo,一個放大器足矣,寫的話一般在max里寫,本人新手,大牛勿拍,
一直都想著寫個合成器玩,並且留意著相關的資料。前一段時間突然看到個很好的庫和教程就跟著寫了個vsti出來(雖然現在還相當粗糙),現在感覺可以回答題主的問題了。既然題主說只是想做個合成器作為實踐,那麼以下就以如何通過編程手段製作合成器為主來寫吧。順便,知乎貼鏈接和排版都好麻煩,如果支持markdown就好了,於是下面的內容幾乎沒排版就從notepad粘貼過來了。
在寫之前首先你得知道一些東西是幹嘛的,實質是什麼。因為大多手段你可能都需要手動去實現這些內容,所以你需要至少搞清楚一些基本的「原件」,比如什麼是Osc,什麼是Filter,LFO是幹嘛的,EG又是什麼鬼等等。接下來就可以試著畫個路由圖表示它們之間的關係了。於是這屬於前置知識,必須得知道的要不然沒法寫。

接下來就是尋找一些類庫等幫助你寫合成器了。實際上你或許會發現幫你寫vsti的類庫似乎比直接寫合成器軟體的類庫要多,那麼其實你就可以直接找個庫來肝了(所以下面的內容以VST插件為例)。合成器說起來重要的部分有兩個,一個是如何處理信號(DSP),一個是如何搞個好看的界面(GUI)[1]。
當然了這兩塊兒內容上你的選擇和參考資料很多,DSP的lib可以大把的抓所以在此就不再舉例了,GUI方面,除了可以使用Steinberg VST SDK(Developers : | http://www.steinberg.net/)自己造輪子之外,你還可以選擇JUCE,WDL等類庫幫你"生產"。
Juce具備完善的文檔和一套很完備的解決方案,如果你打算把你的插件以GPL形式開源的話完全可以使用Juce,不過如果你打算畢源,那就得買授權了。WDL則是另一個不錯的選擇,這是由reaper的廠商Cocko Inc維護的一套lib,並有一套GUI解決方案[2]。當然,也有一些提供更方便的解決方案可以幫助你生成一些代碼的工具,如Faust和RackAFX。選擇類庫可以很大程度節省你造輪子的時間,選一個你喜歡的然後就可以開始了。
因為不同庫的使用方法不同,這裡也不能給出一個很統一的說明或者教程。如果你沒有好想法,建議選擇Juce或者WDL。Juce官網就提供了很好的教程供你開始上手,WDL雖然缺乏文檔但是WDL的代碼非常易讀,以及網上也有一些教程(如Making Audio Plugins)供你參考。選好之後,從寫一個最簡單的Sine波形生成器開始,逐步完成你的Synth吧。
然後夾雜一下私貨,就是開頭提到的我寫的VSTi,已開源到GitHub,選用的庫就是WDL-ol。寫到圖示這樣的程度實際並沒有花多長時間,只是做了一點微小的工作,所以題主大可放心,這個輪子還是很好造的。如果你對製作過程好奇,其實跟著上面提到的WDL教程之外,就剩你自己的自由發揮了。我僅出於瞎點技能樹,寫的不見得合理,很慚愧,僅供參考吧。

除了用c++外,你還可以使用java,ruby或者任意其它語言來達到你寫合成器的目的。暫時就不再舉例了。
最後提及一下不使用編程手段實踐DSP或者說寫合成器的玩法。網上有很多可視化且模塊化的工具,比如其它答主提到的Max/MSP[3],或者SynthEdit,或者Reaktor,再或者FL的FlowStone。你可以不寫一行代碼就做出你自己的合成器(亦或是效果器)。但是如果你真的想對原理上進行了解的話,去通過編程的手段的確更能幫助你,以及自己實現代表著你能更好的控制你的代碼。由於題主的描述本身就是計算機專業想自己寫個簡單的減法合成器玩,那顯然應當選擇自己寫代碼實現咯。至少寫完之後,自己也會覺得很激動人心。
如果你要寫一個很高級的合成器的話,引用一位偉人的話,「需要付出艱苦努力。只要把握規律,堅持不懈,日積月累,就一定能不斷有所收穫」。寫完這個答案,希望能幫到答主和同樣有想寫合成器的人給出一個引導,就做了一點微小的工作,謝謝大家。
--------------------------
[1]實際上,就VST而言,一個 vst plugin 並不要求一定有一個界面。如果你壓根不打算在GUI上浪費時間,直接拿著 VST SDK 肝就是了,宿主會給你提供一個界面幫你使用的。[2]IPlug,原本是WDL的一部分,後官方稱因社區衍生版本比官網的厲害所以從WDL repo移除並由社區維護了。社區維護的fork中官網推薦的有WDL-OL和WDL-Tale。[3]這個是可以和AbletonLive整合的,完整版的Ableton可以使用Max for Live組件。[4]寫這個合成器從開始看WDL-ol的教程到寫到現在如圖的狀態花了也不到十天,所以其實看上去很難,實際寫出來的確不難的。謹以此為例鼓勵大家動手去做。以上謝邀。
1. 學信號與系統、數字信號處理;
2. 你是計算機專業,我想你應該已經知道怎麼編寫 PC 上的圖形界面程序了;3. 學減法合成器基本原理;4. 學其他音頻效果器的基本原理,如均衡器、壓限器、混響器、延遲效果器等等;5. 學 MIDI 規範;6. 開始編程。以上第二步開始均可邊寫邊學。看到有人推薦書就順手也推薦一本吧~推薦夏田大大翻譯的聲音合成及採樣技術,聲音合成的原理可以科普一下,寫的很淺很合適科普~
Audulus。
打著音頻編程軟體的旗號,看起來也跟pure data和max很像,但實際上跟編程關係不大,更像是模塊化合成器,所以如果知道一些基本的知識,Audulus相對來說更容易上手,也有一些很方便的功能。同時也可以作為VST來使用,自己也可以載入VST。
而且界面很好看,超級好看。
蘋果獨佔,不過官方說有做windows版的計劃。其實你都不用用實時API做成DAW插件。寫個Python腳本,把數據處理一下,寫到wav文件就行。這樣調試起來還快。
Max/MSP、PureData、SynthMaker、Reaktor等都可以達到你的需求。
想再深入研究可以玩玩Csound、Pyma、Super Collider等。具體怎麼做我也不會,請諮詢google及youtube。ps:I had a dream to make a synth。減法合成不就是一個聲音減去一些其他聲音嗎?那就是把你原來的聲音生成的式子列出來然後逐格相減啊?如果原波是乾淨sin那就是??sin要減去的波是另外一個sin那就??sin的減法公式我國中背過但是我相信隨便的wiki都能查到的然後就以每秒48000次的速度生成就好啦?事實上再不講求即時的需求下這樣寫絕對沒問題然後再看看有沒有特定的快速演算法(我確實不知道怎麼再說了不過如果逼我寫應該就會這樣寫吧)
推薦閱讀:
※本科電氣工程及其自動化有必要學習單片機、微機原理與介面技術這類的課程嗎?
※零線的電流去那裡了?
※交流電源兩端電壓在隨時變化,那麼為什麼尾端能接地呢?接地的時候電流不會從接地點跑調嗎?
※通過註冊電氣工程師的大牛們是如何搞定那幾十門課幾十本書的?
TAG:數字音頻工作站DAW | 音頻 | 電子工程師 | 電氣工程師 |

