void Update() { // receive ticks PClock.Update(); // sequence audio PSequencer.Sequencer(); PAudioPlayer.Update(); PParameterLinker.Update(); }
void Start() { PAudioPlayer.Start(); // setup fmod API InitialiseLayers(); // read looping audio entryList = PAutoFileLoader.ReadFiles(folderLocationLoops, amountOfLayers); // read oneshots entryListOS = PAutoFileLoader.ReadFiles(folderLocationOneShots, amountOfSoundEffects, true); PClock.Init(100); PParameterLinker.Start(); }
public static void CallCycle(PCycle cycle) { foreach (PParameter parameter in cycle.parametersToAdapt) { switch (parameter.dataToAdapt) { case PParameterLinker.AdaptableParametersCycle.chordsAndScale: previousScale = currentScale; // set scale (maj/min) currentScale = PTonal.setScale(Random.Range(0, 2)); // generate chords chords = PTonal.GenerateChords(); break; case PParameterLinker.AdaptableParametersCycle.layerdata: foreach (int layer in parameter.layersToAdapt) { // TODO: dynamically set which variables should adapt instead of adapting all // TODO: use game data to have more influence on how they adapt instead of just choosing between 2 options ProceduralAudio.layers[layer].beatsPerMeasure = (parameter.value > 0.5f) ? 8 : 6; ProceduralAudio.layers[layer].beatLength = (parameter.value > 0.5f) ? 1 : 2; ProceduralAudio.layers[layer].noteDensity = (parameter.value > 0.5f) ? 8 : 4; } break; case PParameterLinker.AdaptableParametersCycle.rythmAndMelody: // with a new rythm a new melody has to be created because the melody is created on top of a rythm foreach (int layer in parameter.layersToAdapt) { ProceduralAudio.layers[layer].rythm = PRythm.GenerateRythm(ProceduralAudio.layers[layer]); ProceduralAudio.layers[layer].melody = PTonal.GenerateTonalIntervals(ProceduralAudio.layers[layer]); ProceduralAudio.layers[layer].currentTick = 0; } break; case PParameterLinker.AdaptableParametersCycle.melody: foreach (int layer in parameter.layersToAdapt) { ProceduralAudio.layers[layer].melody = PTonal.GenerateTonalIntervals(ProceduralAudio.layers[layer]); } break; case PParameterLinker.AdaptableParametersCycle.bpm: float range = 0.2f; float bpm = (float)(PClock.currentBPM * ((parameter.value * range) + (1.0f - (range / 2)))); PClock.SetNewTime(bpm); break; case PParameterLinker.AdaptableParametersCycle.onOff: foreach (int layer in parameter.layersToAdapt) { ProceduralAudio.layers[layer].layerOn = !ProceduralAudio.layers[layer].layerOn; } break; case PParameterLinker.AdaptableParametersCycle.dynamicCycleLayerAmount: // set what layers to adapt var changingDynamicLayers = new List <int>(); float probability = 0.75f; // percentage minimum //for (float amount ) for (int layer = 0; layer < ProceduralAudio.amountOfLayers; layer++) { if (Random.Range(probability, 1.0f) > parameter.value) { changingDynamicLayers.Add(layer); } } // change dynamic cycle PParameterLinker.dynamicCycle = new PDynamicCycle(changingDynamicLayers, true); // TODO: for now only 1 dynamic cycle is used for (int i = 0; i < PParameterLinker.cycleTimers.Count; i++) { //PCycleTimer cycleTimer = ; if (PParameterLinker.cycleTimers[i].dynamicCycle != null) { PParameterLinker.cycleTimers[i] = new PCycleTimer(null, PParameterLinker.dynamicCycle); } } break; } } if (cycle.terminalOutput) { AudioDataTerminalOutput(); } }