오랫동안 복잡한주기 사운드를 생성하려고합니다. 주파수를 정확하게 정의하고 싶습니다. 따라서 sampleRate*0.5/tableLen
단계를 사용하고 있습니다. 하지만 큰 웨이브 테이블에는 몇 가지 문제가 있습니다. 소리가 왜곡되어 고주파를 잃습니다.긴주기 웨이브를 사용하여 사용자 정의 오실레이터를 생성하십시오.
여기에는 ~ 440Hz 사인파가있는 최소 예가 나와 있습니다. 나는 길이 8192과 함께 테이블을 사용하면 결과 사인파는 매우 인식 할 수 있습니다 :
https://jsfiddle.net/zxqzntf0/
var gAudioCtx = new AudioContext();
var osc = gAudioCtx.createOscillator();
var tableSize = 8192;
var real = new Float32Array(tableSize);
var imag = new Float32Array(tableSize);
var freq = 440;
var step = gAudioCtx.sampleRate*0.5/tableSize;
real[Math.floor(freq/step)] = 1;
var wave = gAudioCtx.createPeriodicWave(real, imag, {disableNormalization: true});
osc.frequency.value = step;
osc.setPeriodicWave(wave);
osc.connect(gAudioCtx.destination);
osc.start();
을하지만 내 테이블 크기를 늘릴 때, 나는 이상한 뭔가를 얻고있다. 결과는 전혀 사인파가 아닙니다!
https://jsfiddle.net/0cc75nnm/
이 문제는 모든 브라우저 (크롬, 파이어 폭스, 가장자리)에서 재현, 그래서 브라우저 버그 될 것 같지 않습니다. 그러나 나는 이것에 관해서 문서에서 아무것도 발견하지 못했다.
추가
나는 오실레이터 주파수는 정수> = 2 Hz의 경우, 나는 테이블 크기 16384와 사운드를 결과에는 어떤 유물이없는 것을 발견 나는 지금 내 요구에 매우 허용 생각 . 하지만 언젠가는 더 오랜 기간을 만들고 싶을 수도 있습니다. 누군가가 스텝이 2Hz보다 작을 때 왜 유물을 얻는 지 설명하면, 나는 그의 대답을 받아 들일 것입니다. https://jsfiddle.net/h9rfzrnL/1/
범위 400-480 Hz에서 20 개의 사인, 범위 800-960 Hz에서 40 개의 사인 등을 원합니다. 나는 440 Hz 스텝을 가지고 있다면 그것을 할 수 없다. 단일 사인파는 내 문제의 최소한의 예입니다. – gammaker
작성하려는 웨이브의 구체적인 예가 문제를 더 잘 설명하는 데 도움이 될 수 있습니다. 그래도 기본 아이디어는 샘플 속도가 1Hz 인 것처럼 웨이브를 디자인하는 것입니다. 그런 다음 오실레이터의 주파수를 원하는 신호의 기본 주파수로 설정하십시오. –
일부 주파수 범위에서 배전되는 고조파가 필요합니다. 그렇다면 어떻게 주파수 400, 401, ..., 480, 800, 801, ..., 960, 1200, 1201, ..., 1920, ... ... ..., 12800, 12801, ..., 15360? 나는 그것을 할 수 없다. 만약 내가 440 단계를 가지고 있다면, 나는 1Hz의 스텝과 매우 큰 테이블을 필요로한다. 적은 단계가 더 좋습니다. – gammaker