// program to construct random "tune" from small "notes"// === Edit this section to define notes, tune ==============================================================// the note files:const notefiles =[// 1 second or less:"/uploads/mathias/perc.wav",// wooden beat // notes[0]"/uploads/mathias/snap.wav",// click // notes[1]"/uploads/mathias/snare.wav",// tight like beat // notes[2]"/uploads/mathias/kick.wav",// bounce drum // notes[3]"/uploads/mathias/hihat.wav",// tight click // notes[4]"/uploads/mathias/clap.wav",// clap // notes[5]"/uploads/oneilf27/beepmult.mp3",// Beep // notes[6]// 3 seconds:"/uploads/mathias/crash.wav",// cymbals crash // notes[7]// 5 minutes:// "/uploads/mathias/kalimba.mp3",];function playTune(){// background music const MUSICFILE ="uploads/midnightsky/Interstellar.mp3";
AB.backgroundMusic(MUSICFILE);// play a note n times with gap of this no. of milliseconds:// repeatNote ( randomNote(), 4, 500 );/*
// design a tune:
repeatNote ( notes[2], 100, 200 );
repeatNote ( notes[6], 100, 300 );
// this kicks in in n millisec time:
delayRepeatNote ( 7000, notes[2], 100, 300 );
delayRepeatNote ( 9000, notes[6], 100, 300 );
*/// entirely random tune: for(var i =1; i <=10; i++){
delayRepeatNote ( AB.randomIntAtoB(0,20000),
randomNote(),
AB.randomIntAtoB(50,200),
AB.randomIntAtoB(50,500));}}// ==== End of edit section =================================================================================================// === Can probably ignore below here ==============================================================var NUM = notefiles.length;// going to set up an array of Audio objects: var notes =[];function initNotes(){for(var i =0; i < NUM; i++){
notes[i]=newAudio( notefiles[i]);// notes[i].play(); // notes[i].pause(); }}function randomNote(){var i = AB.randomIntAtoB (0, NUM -1);return( notes[i]);}var p =[];// the notes that are playing // an array of arrays: // ( note, num, current num, millisec )function repeatNote ( note, n, millisec )// repeat this note n times, with delays of millisec in between {// add one to end:var i = p.length;
p[i]=[ note, n,1, millisec ];
p[i][0].onended =function(){if( p[i][2]< p[i][1]){
p[i][2]++;
setTimeout (function(){ p[i][0].play();}, p[i][3]);}else
console.log ("finished "+ p[i][0].src );};
console.log ("starting "+ p[i][0].src );
p[i][0].play();}function delayRepeatNote ( delay, note, n, millisec )// delayed start of repeatNote, in "delay" milliseconds time {
setTimeout (function(){ repeatNote ( note, n, millisec );},
delay );}// display splash screen
AB.newSplash ("Click to start audio");// touch on splash screen button will mark audio objects as good for JS to call without further user interaction
AB.splashClick (function(){
AB.removeSplash();
splashClicked =true;
AB.runReady =true;
initNotes();
setTimeout ( playTune,0);// play the tune, maybe delayed });// not sure if will use 3D world const skycolor ='LightBlue';// sky colorconst startRadius =1000;// distance from centre we start the camera atconst maxRadius = startRadius *10;// maximum distance from camera we render things
AB.world.newRun =function(){ABWorld.init3d ( startRadius, maxRadius, skycolor );};