2015-04-23 16 views
7

Tôi không thể có được sự thay đổi về khối lượng thông qua exponentialRampToValueAtTime của GainNode.Công việc audioParam.exponentialRampToValueAtTime hoạt động như thế nào?

Dưới đây là một ví dụ:

var context = new AudioContext(), 
    osc = context.createOscillator(), 
    gain = context.createGain(); 

osc.frequency.value = 440; // A note 
osc.start(0); 
osc.connect(gain); 

gain.gain.value = 0; 
gain.connect(context.destination); 

gain.gain.cancelScheduledValues(0); 
gain.gain.setValueAtTime(0, context.currentTime); 
gain.gain.exponentialRampToValueAtTime(1, context.currentTime + 2); 

Trong hiểu biết của tôi này nên tăng dần khối lượng, cho đến khi đạt 1 (100%) và toàn bộ quá trình này nên mất 2 giây. Giả định này có đúng không?

Nếu có, tại sao ở trên 0 trong 2 giây và đột nhiên chuyển sang âm lượng đầy đủ?

Cảm ơn trước vì đã dành thời gian và công sức của bạn.

+0

Bạn đã thử 'linearRampToValueAtTime' chưa? –

+0

Tôi có, và nó hoạt động, nhưng tôi đọc rằng tuyến tính không âm thanh tốt như đoạn đường nối mũ, vì vậy tôi muốn thử điều này. Tôi đang viết một máy tạo phong bì và tôi muốn thử nghiệm một số tùy chọn. –

+0

Tôi đoán đây là cách nó được cho là hoạt động. Ramp lên nhanh. –

Trả lời

8

Dường như chức năng này không thích giá trị 0. FF ném "SyntaxError: Một chuỗi không hợp lệ hoặc bất hợp pháp đã được chỉ định". Mã dưới đây sẽ được định vị chính xác. Xem trên Plnkr.

var context = new AudioContext(), 
    osc = context.createOscillator(), 
    gain = context.createGain(); 

osc.frequency.value = 440.0; // A note 
osc.start(0); 
osc.connect(gain); 

gain.connect(context.destination); 

gain.gain.setValueAtTime(0.0001, context.currentTime); // <-- line of interest 

gain.gain.exponentialRampToValueAtTime(1, context.currentTime + 10); 

UPDATE: "Một ngoại lệ NotSupportedError phải được ném nếu giá trị này là nhỏ hơn hoặc bằng 0, hoặc nếu giá trị tại thời điểm sự kiện trước đó là nhỏ hơn hoặc bằng 0" theo Web Audio specification . Như đã tìm ra bởi @cwilso (xem bình luận).

+0

Bạn hoàn toàn đúng. Cảm ơn! Nhưng đây không phải là lỗi à? Tôi tưởng tượng, có lẽ có một số phép nhân bắt đầu với giá trị ban đầu và đó là lý do tại sao nó là 0 cho đến bước cuối cùng. Và kể từ khi chức năng làm chậm theo cấp số nhân, họ có thể chỉ cần đặt giá trị được cung cấp (theo đó trượt sẽ đi) khi nó gần hơn (không thể nhận thấy). –

+0

Giá trị mẫu <1/Math.pow (2, bitdepth) là 0. –

+2

Tôi nghĩ rằng đây là vấn đề: https://github.com/WebKit/webkit/blob/master/Source/WebCore/Modules/webaudio/AudioParamTimeline .cpp # L232 và điều này: https://github.com/WebKit/webkit/blob/master/Source/WebCore/Modules/webaudio/AudioParamTimeline.cpp#L237 Đây là trong Webkit, nhưng nó giống nhau trong Blink. –

0

The docs at Mozilla cho biết giá trị phải là số dương.

+0

Cảm ơn, nhưng không có điểm nào là câu trả lời riêng biệt này. Và điều này đúng với việc thực hiện FF, không phải webkit và Blink. Ngoài ra "lỗi chuỗi bất hợp pháp" ... điều này trông giống như một "lỗi tài liệu" với cách giải quyết được cung cấp. :) –

+0

Trong khi liên kết này có thể trả lời câu hỏi, tốt hơn nên bao gồm các phần thiết yếu của câu trả lời ở đây và cung cấp liên kết để tham khảo. Câu trả lời chỉ liên kết có thể trở thành không hợp lệ nếu trang được liên kết thay đổi. – MZaragoza

+1

@MZaragoza: Nhưng chúng đã bao gồm phần thiết yếu ở đây. – BoltClock

Các vấn đề liên quan