從計算角度考慮這一點。
語音是您的內置默認輸出,它從頭開始進行了優化,以提高操作系統和硬件中的電源效率和指令周期效率。
p>
現在考慮在樂器上複製音樂。儀器是從未在其操作系統或運行硬件上進行過優化的外部硬件。在計算世界中,使用新的外圍設備要么涉及加載驅動程序(在操作系統級別上為插件),要么使用外圍設備隨附的程序(應用程序層接口)。
具有良好音調的人們可以與為新的外圍設備(儀器)使用高效的操作系統級驅動程序相比。很好,儘管比硬件優化慢。
其他所有對象(沒有完美的音調)都可以與使用應用程序層接口(特定程序)控制外圍設備(儀器)進行比較。與操作系統級別的驅動程序或硬件優化相比,性能較慢和最差。
或者考慮面向數據的觀點。
音頻輸入基本上是模擬的,出於討論目的,假定大腦以簡單的模擬格式(類似於計算機上的WAV文件)存儲音頻輸入。語音輸出本機接受相同的模擬格式,這意味著在回音時幾乎沒有處理開銷。
將音符視為數字(邏輯)格式-音符開始/結束標記序列。要演奏樂器,您必須運行以下算法。為了簡單起見,假設您一次只演奏1個樂器。
樂器D = getCurrentInstrument()。open()P = NoteInputStream(AnalogAudioInputStream(input song),D)而為true時:注意N = P.nextNoteMarker()如果N == null,則退出,否則退出,如果N.isBegin然後D.holdNoteAfterDelay(N,N.delay)否則,如果N.isEnd然後D.releaseNoteAfterDelay(N,N.delay)
偽代碼看起來很簡單。但是到底是怎麼回事?複雜性在上面的API函數中。
getCurrentInstrument()是一個函數,它返回對您手中儀器的引用。比較簡單。 instrument.open()函數完全是另一回事。這會加載樂器的驅動程序-換句話說,您必須“回憶”如何演奏樂器。這包括將邏輯音符在心理上映射到您在樂器上產生音符所要做的任何事情(可能是反向查找表)。如果樂器包括同時按住和釋放許多音符(例如鋼琴),這還包括弄清楚如何優化手指以壓下一組音符。因此,instrument.open()需要大量的處理能力和短期內存(RAM)。
AnalogAudioInputStream(audioInput)可以接收模擬音頻輸入並將其轉換為數據的“流”。
p>
NoteInputStream(analogInput,instrument)接收上述模擬音頻流和一個樂器,並從模擬輸入中提取指定樂器的音符。這是完美音調的體現,它可以識別“主要”樂器並將其頻率實時映射到邏輯音符。
每個音符都表示為鍵,八度,處理前的延遲和開始/ end標誌,表示音符是表示按下還是停止按下。
在樂器上播放模擬輸入:在提取的節點上循環並在樂器上按住/釋放根據指示。保留/釋放音符操作的複雜性在很大程度上取決於樂器,並且顯然如果手指用完或輸入太可笑,可能會失敗。