Как изменить переменную темпа в моей 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>

0 ответов

Другие вопросы по тегам