2012-10-05 26 views
12

Tôi đang cố gắng sử dụng API Âm thanh Web để tạo lại một cái gì đó như
bộ cân bằng 10 dải của Winamp.Tạo Bộ chỉnh âm 10 Băng tần Sử dụng API Âm thanh Web

Winamp's 10-band equalizer

Từ những gì tôi có thể thu thập, tôi phải tạo ra 10 Biquad Filters, thiết lập của họ type để 2 (for a Bandpass filter) và thiết lập của họ frequency-[60, 170, 310, 600, 1000, 3000, 6000, 12000, 14000, 16000] tương ứng. Một khi tôi đã làm điều đó (và đây là nơi tôi nhận được một chút nhầm lẫn) tôi sau đó sẽ tạo ra một Gain Node riêng biệt cho mỗi tần số "ban nhạc" và ràng buộc giá trị của nó vào một thanh trượt.

<input id="someFreqBand" type="range" min="-12" max="12" step="0.1" value="0" onchange="slide()"/> 

Giả sử tất cả điều đó là đúng, sau đó bước duy nhất còn lại là để kết nối tất cả 10 nút tăng đến âm thanh Context destination (mà tôi tưởng tượng sẽ mất tất cả 10 tần số "ban nhạc" và trộn/đồng bộ chúng lại với nhau). Đây có phải là cách thích hợp để tạo một bộ cân bằng âm thanh 10 băng tần trên Web Âm thanh không?

Điều quan trọng mà tôi nhầm lẫn là cách tôi kết nối "nguồn" với bộ lọc dải tần số 10 (+ nút tăng liên quan) vì tất cả các nút chỉ có đầu vào hoặc đầu ra đơn (bao gồm đích) .

Trả lời

7

Như Matt D đã nói, sẽ không có vấn đề gì khi kết nối bộ lọc với cùng một đích. Tuy nhiên, tôi sẽ nói rằng bạn có thể muốn sử dụng các bộ lọc với loại 5 (peaking), cho phép tất cả các tần số thông qua và chỉ khuếch đại/giảm ở tần số mà bạn đã đặt bộ lọc tương ứng.frequency.value. Điều đó cho phép bạn kết nối các bộ lọc theo chuỗi để bạn không cần 10 đường dẫn âm thanh riêng biệt. Bạn cũng có thể xem xét sử dụng bộ lọc có giá thấp làm bộ lọc đầu tiên và bộ lọc hi-shelf là thứ mười, bộ lọc khá phổ biến trong bộ cân bằng. Tôi không thể nhớ nếu đó là những gì winamp làm, mặc dù.

Cuối cùng, nếu bạn đi với các bộ lọc cao điểm trong chuỗi, bạn không cần một nút tăng riêng biệt cho mỗi tần số, bạn chỉ cần đặt filter.gain.value cho các bộ lọc cụ thể.

+0

Trừ khi tôi bị nhầm lẫn, tất cả các bộ cân bằng đồ họa đều sử dụng bộ lọc bandpass. Xem ở đây trên trang 4: https://rs6.eporia.com/company_38/techpaper106.pdf Có vẻ lạ khi bộ lọc thấp/giá cao/đạt đỉnh cho phép bạn điều chỉnh độ lợi trực tiếp trên nút bộ lọc , nhưng không phải là bộ lọc bandpass ... – idbehold

+0

Tôi không chắc liệu tất cả bộ cân bằng đồ họa có sử dụng các bộ lọc dải tần hay không, nhưng tôi chắc chắn rằng việc sử dụng bộ lọc peaking trong chuỗi sẽ là cách dễ dàng hơn để có được hành vi bạn đang theo dõi. –

+0

bộ lọc nên được kết nối theo chuỗi, như Jagi đã đề cập. –

2

Điều chính tôi nhầm lẫn là cách tôi kết nối "nguồn" với 10 bộ lọc dải tần số (+ nút tăng liên quan) vì tất cả các nút chỉ có đầu vào hoặc đầu ra đơn (bao gồm cả Nơi Đến).

Điều này đúng, nhưng đừng nghĩ về nó như đầu ra vật lý chỉ có thể kết nối với đầu vào vật lý khác. Một đầu ra duy nhất của nút Web Audio có thể được kết nối với nhiều nút và một nút cũng có thể nhận được nhiều đầu vào. Ví dụ, giả sử bạn muốn chuỗi một nút đầu vào thông qua 5 bộ lọc song song và sau đó nối chúng lại với nhau. Bạn có thể làm một cái gì đó như thế này:

source.connect(filter1); 
source.connect(filter2); 
source.connect(filter3); 
source.connect(filter4); 
source.connect(filter5); 

filter1.connect(context.destination); 
filter2.connect(context.destination); 
filter3.connect(context.destination); 
filter4.connect(context.destination); 
filter5.connect(context.destination); 

Sự thấu hiểu mấu chốt ở đây là kêu gọi .connect nhiều lần sẽ không chuyển đổi đầu ra vào một nút khác nhau, nhưng chỉ đơn giản là sẽ thêm các kết nối công suất tăng thêm. Nói cách khác, đó là hệ thống "fan out/fan in".

+0

Dường như tài liệu kém khi thông số nói: 'numberOfInputs: 1. numberOfOutputs: 1.' Khi bằng' 1', chúng có nghĩa là 'many'. – idbehold

+1

Tôi thừa nhận nó có thể rõ ràng hơn, nhưng tài liệu đó vẫn chính xác. Một đầu ra có thể kết nối với nhiều đầu vào. Hãy suy nghĩ về nó giống như số lượng đầu ra * cổng * hơn là kết quả đầu ra. –

10

Bằng cách kết nối mọi bộ lọc với đích bạn đang tạo 5 đường dẫn (tuyến đường) để bạn sẽ nghe thấy sự khuếch đại của âm thanh nguồn. Đó không phải là cách chính xác. Bạn phải kết nối từng bộ lọc trong một dòng.

source.connect(filter1); 
filter1.connect(filter2); 
filter2.connect(filter3); 
filter3.connect(filter4); 
filter4.connect(filter5); 
filter5.connect(context.destination);