0

それぞれに 1 つ以上の小節があり、すべての小節が 1 つ以上のビートで構成される、いくつかの異なる楽器を作成しようとしています。

楽器には独自のテンポがあり、単位は BPM (ビート/分) です。したがって、楽器がその「曲」を再生する場合、ms 単位の長さ/デュレーションはnumberOfMeasuresInInstrument*beatsInSingleMeasure/instrumentTempo*60.0*1000.0 BeatsInSingleMeasure によって計算され、 として参照することもできます。これsignatureは、音楽が 4/4 などの単位で定義されるためです。

「曲」をループしようとしています。したがって、持続時間が異なる複数の楽器がある場合、それらをすべて同時に開始し、独自の「スコアシート」の終わりまで再生してから、すべての楽器が完了するまで (つまり、最長の楽器持続時間) 待ってから再起動するようにします。 (これは事実上、各「スコアシート」の長さを等しくし、適切な量とテンポの休符を追加して、最も長い長さの楽器に等しくします)。したがって、すべての楽器は同時に開始し、テンポの間隔でビートを再生する必要があります。これは、別の setInterval() で管理する必要があると想定しています。

これは、相互に関連する期間を説明するためのフィドルです最初の楽器が 2 秒間再生され、2 番目の楽器が 1.6 秒間再生され、3 番目の楽器が 1.5 秒間再生されると仮定しましょう。これにより、最初の楽器のビートは 0.66 秒ごとに再生され、2 番目の楽器のビートは 0.4 秒ごとに再生され、3 番目の楽器のビートは 0.25 秒ごとに再生されます。

どうすればこれを達成できますか? 概念的には、間隔をネストして、2 秒ごとに開始し、適切な間隔でビート数を再生することは理にかなっています (最初: .66 秒ごとに 3 ビート; 2 番目: .4 秒ごとに 4 ビート; 3 番目に .25 秒ごとに 6 ビート) ;))。これは、ビートの長さの LCD を把握してそのように演奏するよりも簡単に思えます。この場合、.25、.4、および .66 => .01666 秒の LCD です (これも 60Hz または 1/60 秒です)。

現在、私は以下を持っています:

//Which beat are we on?  first ones are in the negative to allow the 'song'to buffer once through the 'song', required by HTML5 Audio buffer
var beatCounter = 0-(signature*measuresCount-1);
// How many measures?
var measureCounter = 0;
// Are we waiting on another instrument to play, because we haven't reached the maximum play duration
var waitCounter = false;
function calculateWaiting(){
  if ( beatCounter*dur == currentInstrumentDuration && currentInstrumentDuration < maxDuration ){
    waitCounter = true;
  } else {
    waitCounter = false;
  }
};

//This is the instrument interval
this.animationIntervalID = setInterval((function(self) {
  return function() {
    //this is the beat interval                   
    this.beatAnimationIntervalID = setInterval((function(self) {
      return function() {
        //if we have not yet played all the beats and are waiting on the 
        if (waitCounter == false){            
          // As long as we are still have beats to play, keep playing                                                                
          if (beatCounter >= 0 && beatCounter < totalNumberOfBeats) {
            //Get all the beats
            var beats = $('#measure-rep-'+self.measureRepModel.cid).find('.audio-beat');
            // If the beat is selected, ie not a rest....
            var selected = self.parentMeasureModel.get('beats').models[beatCounter].get('selected');
            //animate it
            self.audioAnimate(beats.eq(beatCounter)[0], dur, selected);
          }
          //Increase the beatCounter until all of the beats have played, then reset the beatCounter
          if (beatCounter < (totalNumberOfBeats-1)) {
            beatCounter ++;
          } else {
            beatCounter = 0;
          }
          calculateWaiting();
        } else {
          // Waiting until the longest measure is complete
          console.log('waiting until the longer instrument is done playing');
        }
      };
    })(this), dur); //dur is the cycle at which every beat should be animating/lasting
  };
})(this), maxDuration); //maxDuration is the cycle at which every instrument should be waiting for to repeat

したがって、ここに短いバージョンがあります:

//This is the instrument interval
this.animationIntervalID = setInterval((function(self) {
  return function() {
    //this is the beat interval                   
    this.beatAnimationIntervalID = setInterval((function(self) {
      return function() { ... };
    })(this), dur); //dur is the cycle at which every beat should be animating/lasting
  };
})(this), maxDuration); //maxDuration is the cycle at which every instrument should be waiting for to repeat

そして、私が達成しようとしていることの線形ビジュアル:

//Scroll this window to see it linearly with time
// Let's assume that the first instrument plays for a duration of 2 seconds, the second
// plays for 1.6 s, and the third plays for 1.5 s. That would make the first instruments 
// beats play at an interval of every .66s, the second instrument's beats play every
// .4 s, and the third instrument's beats play every .25s.
// 
// The LCD of all instrument's beats is .01666s (60 Hz or 1/60th of a second), so it
// should look something like this: P meaning Play the beat, p, meaning the beat still 
// being sustained, I meaning the LCD interval, and W meaning waiting 
//
//    0s                            .5s                           1s                            1.5s                          2s
//    ^                             ^                             ^                             ^                             ^
//    IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII
// 1: PpppppppppppppppppppppppppppppppppppppppPpppppppppppppppppppppppppppppppppppppppPppppppppppppppppppppppppppppppppppppppp
// 2: PpppppppppppppppppppppppPpppppppppppppppppppppppPpppppppppppppppppppppppPpppppppppppppppppppppppWWWWWWWWWWWWWWWWWWWWWWWW
// 3: PppppppppppppppPppppppppppppppPppppppppppppppPppppppppppppppPppppppppppppppPppppppppppppppWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW
4

0 に答える 0