JavaScript >> Javascript 文檔 >  >> Tags >> web

WebAudio Deep Note,第 3 部分:循環和改變音高

這段旅程從這裡開始,然後繼續,然後稍微轉了個彎,只是為了咯咯笑,現在我們回來了。

在你學會瞭如何播放聲音之後,現在讓我們循環播放它,因為 DeepNote 會持續大約 25 秒,而我們會播放完全相同的大提琴樣本,但時長不到一秒。

循環

幸運的是,循環是 WebAudio 中最簡單的事情。創建緩衝源之後 對象,您只需設置它的 loop true 的屬性 .就這麼簡單。然後它會永遠循環,直到你 stop() 它。

sample = audioContext.createBufferSource();
sample.buffer = audioBuffer;
sample.loop = true;
sample.connect(audioContext.destination);
sample.start();

來來來,聽聽結果。

關於循環源的注意事項

您的源聲音是波(想像一下正弦波)。如果您將正弦的末端準確地切割在開頭的位置,那麼您就是金色的。這是一個笨拙的插圖:

所以,需要一點關注。否則,當結尾沒有很好地流入開頭時,您會聽到咔嗒聲和爆裂聲。就我而言,我嘗試過,但並不太努力。因為我們將有 30 個這樣的循環樣本,並且當它們的長度不同時,由於重新調整(見下),它並不那麼明顯。但是在您最喜歡的 DAW(數字音頻工作站)中進行剪輯時,您應該小心。順便說一句,我的(也就是最喜歡的 DAW)是 Reaper。

改變音高

您可以使相同的聲音聽起來更高(如花栗鼠)或更低(如達斯維德)。最簡單的方法是加快播放速度。想像一下以更高的速度播放磁帶(也是盒式磁帶)。或者在播放時將手指放在黑膠唱片上以減慢它的速度。

這就是 WebAudio 為您提供的開箱即用的播放速率。播放速度更快聽起來更高。但它也更快。如果你以兩倍的速度播放 1 秒的聲音,它聽起來會高一倍,但也更快結束。更難做的是聲音更高或更低但不改變速度。不幸的是,這就是現在太有名的 Autotune 所做的。音高校正。當歌手平穩時,您提高音高但保持速度(節奏)。這就是 WebAudio 沒有為您提供開箱即用的功能。目前。這是可能的,但這不是微不足道的。幸運的是我們的練習,我們可以毫無困難地提高速度。

所以除了 loop 緩衝區源的屬性,你得到一個 playbackRate 也。像這樣:

sample.playbackRate.value = 2;

(為什麼是 .playbackRate.value = 2 而不是 .playbackRate = 2 ,讓我們稍後再說。它與音頻參數的概念有關,實際上是一個很好的API)

播放速率 1 與原始聲音相同。 2 快兩倍,高一個八度。以兩倍速度播放的 440Hz 聲音聽起來像 880Hz。這是同一個A音符,但上面是一個八度。

150Hz

好的,現在回到 DeepNote,整個D 是 150Hz .

如果你看一下音符頻率,D3 是 146.83Hz。但在 DeepNote 中,他們決定 D3 應該是 150Hz。涼爽的。我們可以加快我們的樣本。

此外,我們沒有 D3 大提琴樣品,而是 C3 樣品。因為我們在 Interwebs 上免費獲得它,我們不能對免費挑剔。所以我們需要讓我們的 C3(即 130.81Hz)聽起來像 DeepNote 的 D3。這是一個簡單的比例。看看吧:

const C3 = 130.81;
const c3d150 = 150 / C3; // 1.1467013225;

所以我們需要用微不足道的 1.something 來加快播放速度 從rando C3中製作所需的Deep D。不錯。稍後我們需要演奏更多的音符,但有一個起點是好的。所有其他音符都是這個 c3d150 的直接倍數 由於剛剛調整的基線。如果只是調整,請返回此博客系列的第 1 部分 對你來說聽起來很奇怪。

要聽到 repitching 的實際效果,請轉到示例。我什至添加了一個小複選框,您可以查看原始 C3(速率 1)和花哨 D3(速率 c3d150 之間的區別 )

代碼是:

const C3 = 130.81;
const c3d150 = 150 / C3; // 1.1467013225;

function play() {
  fetch('Roland-SC-88-Cello-C3-glued-01.wav')
    .then(response => response.arrayBuffer())
    .then(arrayBuffer => audioContext.decodeAudioData(arrayBuffer))
    .then(audioBuffer => {
      sample = audioContext.createBufferSource();
      sample.buffer = audioBuffer;
      sample.loop = true;
      sample.playbackRate.value = repitch.checked ? c3d150 : 1;
      sample.connect(audioContext.destination);
      sample.start();
    })
    .catch(e => console.log('uff'));
}

WebMIDI 鍵盤

最後一件事:通過我的 WebMIDI 鍵盤來檢查 reitching 的力量。你可以演奏一整串音符,它們都是一個單一的重調 C4 樣本。

看看那個瀑布,只有 4k 的(漂亮的)HTML 和內聯 JS 以及一個 mp3 樣本。它支持 MIDI。 (WebMIDI 是另一個問題,或者只是查看源代碼 如果你好奇)


Tutorial JavaScript 教程
  1. 學習 JavaScript 和 Vue

  2. 為什麼你應該對可訪問性給予 S***

  3. CleanDocs 文檔模板

  4. 僅當元素可見時才執行單擊功​​能

  5. 在 .NET Core 中檢測操作系統

  6. 如何對 url 進行 JSON 調用?

  7. 瘦 JavaScript — 快!

  1. 無法使用帶點的計算屬性值 – 無法設置為字符串 – JS

  2. 超越 Console.log() – 提升您的調試技能

  3. 使用 CanvasJS 跨儀表板中的多個圖表同步工具提示

  4. 您如何推廣您的應用程序或項目?

  5. 對抗冒名頂替綜合症的 6 個月

  6. javascript – 根據多個屬性在數組中查找唯一對象

  7. 如何從對像數組中創建一個新數組?

  1. 構建 Gutenberg 側邊欄插件第 1 部分:使用 (oop) php 註冊插件

  2. 使用 D3js 創建簡單圖表

  3. 我在幾天內學到了開發系統的知識。

  4. 在 JavaScript 中將多個圖像轉換為 WebP