Проверка логических значений из нескольких массивов одновременно, без нескольких операторов if - PullRequest
0 голосов
/ 10 декабря 2018

Код работает хорошо , но я уверен, что есть более эффективный способ сделать это.На данный момент он работает нормально в Firefox, но разваливается в Chrome.Логические значения проверяются на каждом шаге, которые находятся на расстоянии 110 мсек, и результат, является ли элемент в массиве истинным или ложным, определяет, запущен звук или нет (уникально для этого массива).Что-то в коде складывается при скачках в Chrome, что вызывает все виды сбоев и утечек ... Я не могу найти способ объединить все это в одну проверку в каждом цикле, вместо того, чтобы выполнять все эти if заявления.Возможно ли это?

var loop = [{
    "sound": "one",
    "pattern": [true, false, false, false],
    "volume": 100
    },{
    "sound": "two",
    "pattern": [false, true, false, true],
    "volume": 100 
    },{
    "sound": "three",
    "pattern": [true, true, true, true],
    "volume": 100 
    }]

var s = 0;
function startLoop(){   
    if (playing === true){  
        setTimeout(function(){          
            if (typeof loop[0] !== "undefined") {
                if (loop[0].pattern[s] === true){
                    soundset.play(loop[0].sound);
                }
            }
            if (typeof loop[1] !== "undefined") {
                if (loop[1].pattern[s] === true){
                    soundset.play(loop[1].sound);               
                }
            }
            if (typeof loop[2] !== "undefined") {
                if (loop[2].pattern[s] === true){
                    soundset.play(loop[2].sound);               
                }
            }
            s++;
            if (s < loop[0].pattern.length){
                startLoop();
            } else {
                s = 0;
                startLoop();
            }

        }, 110)
    } else {return;}
};

typeof loop[x] !== "undefined" на месте, если петли выше x отсутствуют.План состоял в том, чтобы примерно 10 из них работали, но этот способ проверки каждого шага требует только трех.

Ответы [ 2 ]

0 голосов
/ 10 декабря 2018
  • Используйте forEach() вместо жесткого кодирования loop[0], loop[1], etc….Таким образом, вы можете иметь бесконечные инструменты на своем треке.
  • Сброс таймаута при остановке (или приостановке) воспроизведения.
  • Предварительно загрузите свои звуки (и поместите их в каждый соответствующий loop объект .audio).
  • Вместо true и false вы можете использовать 0 и 1 i, чтобы просто и чисто инструктировать логические значения.
  • Объем изменяется от 0.0 до 1.0
  • Вы можете использовать Опаратор по модулю %, чтобы вернуться к 0 вашему s индекс тикера.

var bpm = 60;             // Beats per minute
var div = 4;              // "4/4 division" (the pattern length)
var s = 0;
var tickTimeout = null;

var loop = [{
  name: "kick",           // it's a sound/file name
  pattern: [1, 0, 0, 0],  // can be expressed using 0 and 1
  volume: 1               // volume goes from 0.0 to 1.0, remember?
},{
  name: "snare",
  pattern: [0, 1, 0, 1],
  volume: 1 
},{
  name: "hihat",
  pattern: [1, 1, 1, 1],
  volume: 1 
}];

// Preload sounds
loop.map(function(obj){
  obj.audio = new Audio("../audio/drumset-rock/"+ obj.name +".mp3");
  obj.audio.volume = obj.volume;
});

// Play tick
function play(){ 
  var names = "";                     // Demo only
  loop.forEach(function(obj) {        
    if (obj.pattern[s]) {
      obj.audio.play();               // Play sound if in pattern
      names += " "+ obj.name          // Demo only
    }
  });
  console.log(s +': '+ names);        // Demo only

  s = ++s % div;                      // Increment and loopback
  tickTimeout = setTimeout(play, 1000 * 60 / bpm);  // Next tick at bpm
}

function stop() {
  clearTimeout(tickTimeout);
}

play();         // Start loop
// stop();      // Use to immediately stop drum machine
0 голосов
/ 10 декабря 2018

Попробуйте это:

var loop = [
    {
        "sound": "one",
        "pattern": [true, false, false, false],
        "volume": 100
    },{
        "sound": "two",
        "pattern": [false, true, false, true],
        "volume": 100 
    },{
        "sound": "three",
        "pattern": [true, true, true, true],
        "volume": 100 
    }
];

var s = 0;
function startLoop(){   
    if (playing !== true)
        return;
    setTimeout(function(){ 
        for(const i in loop){
            if(loop[i].pattern.hasOwnProperty(s)){
                if(loop[i].pattern[s]){
                    soundset.play(loop[i].sound);
                }
            }else{
                s = 0;
            }
        }
        s++;
        startLoop();
    }, 110);
};
...