Как изменить переменную темпа в моей javaScript, программе API webAudio?
Мой первый вопрос когда-либо о stackOverflow. Мой вопрос касается некоторого кода, над которым я работал в эти выходные. Этот код пытается воспроизвести музыкальную фразу, основанную на последовательности Фибоначчи, а затем демонстрирует воспроизведение случайных нот. Когда я пытаюсь изменить переменную темпа на что-то кроме 60 ударов в минуту, он просто ничего не играет. Я смущен, почему, и мне интересно, является ли это недостатком в моей перспективе, касающейся музыки в целом и как программировать. Пожалуйста, ознакомьтесь с моим кодом. Я запустил программу, и она работает, однако при входе в код и изменении переменной темпа она перестает работать. Может кто-нибудь, пожалуйста, помогите мне понять, что я не делаю правильно или как сделать эту работу. Спасибо
<!DOCTYPE>
<html>
<head>
<script>
context = new AudioContext||webkitAudioContext;
context.suspend(); //I had to use this because The playback was missing the first note. and context.resume later...
//a=time in seconds
//b=bpm
var arr=[]; //array
var rra=[]; //array in reverse
var newArray=[];
//create and array to hold the sequence in beats as length of seconds (has to be outside of the phrase function)
var a;
var b;
var c;
var d;
var e;
function play(x, y, z) {
oscillator = context.createOscillator();
oscillator.frequency.value = x;
oscillator.connect(context.destination);
oscillator.start(y);
oscillator.stop(z);
}
function phrase(aa, b) {
//60 seconds of music
//90 BPM beats per minute
c = 60/b; //60 seconds or 1 minute / 90 BPM --- length of each note in seconds
document.write(c+' second = the length of notes per second ');
d = aa/c; //how many notes in piece
document.write(d+' is the number of notes in a piece');
e=d;
arr.push(e); //first value is length of piece in beats as length of seconds
rra.push(0); //first value is length of piece in beats as length of seconds
i=true;
while (i) { //populate array with sequence all the way to one-third of a beat in seconds
e = e*.618;
e=e.toFixed(2);
arr.push(e);
if (e<=c/8) {
i=false;
}
}
for (i=arr.length-1; i>=0; i--) { //this array was put together in reverse order from arr
var a = arr[i]
rra.push(a);
}
for (i=0; i<arr.length; i++) { // total beats in the section subtracted from the arr array to find the reverse
var bb = d - arr[i];
bb=bb.toFixed(2);
newArray.push(bb);
}
newArray.push(d);
//arr.push(c/2); //this is the begining or the end of the sequence and the length of one beat in seconds
//arr.toString();
for (i=0; i<(rra.length); i++) { //arr array being printed
document.write(' ' + rra[i] + ' is the '+i+' rra value |||');
}
for (i=0; i<(newArray.length); i++) { //rra array being printed
document.write(' ' + newArray[i] + ' is the '+i+' newArray value |||' );
}
}
function wait(ms){
var start = new Date().getTime();
var end = start;
while(end < start + ms) {
end = new Date().getTime();
}
}
function input() {
var ee=document.getElementById("sec");
var length = ee.options[ee.selectedIndex].value;
//document.write(length);
var tempo=60; //cant change this for some reason...
//var length=10;
phrase(length, tempo);
document.write(' This is the value, in seconds, of one beat '+c);
for (i=0; i<(rra.length); i++) {
var y = Math.floor((Math.random() * 440) + 220);
play(y, rra[i], rra[i+c]);
}
//document.write(' '+rra.length);
for (i=0; i<(arr.length); i++) {
var x = Math.floor((Math.random() * 880) + 440);
play(x, newArray[i], newArray[i+c]);
}
// this loop creates a pulse of a note in seconds
var start = 0;
for (i=0; i<d; i++) {
//document.write(' '+c+d);
//var z = Math.floor((Math.random() * 880) + 440);
var end = (start+c)-.9;
play(440, start, end);
start = c + start;
}
context.resume(); //had to use because the input function was making the playback miss the first note.
}
</script>
</head>
<body>
<select id = "sec">
<option value="Rows" selected disabled>seconds</option>
<option value="3">3</option>
<option value="5">5</option>
<option value="8">8</option>
<option value="13">13</option>
<option value="21">21</option>
<option value="34">34</option>
<option value="55">55</option>
</select>
<button onclick="input();" type="button">Create Form</button>
</body>
</html>