Beispiel #1
0
    void Update()
    {
        // receive ticks
        PClock.Update();

        // sequence audio
        PSequencer.Sequencer();

        PAudioPlayer.Update();

        PParameterLinker.Update();
    }
Beispiel #2
0
    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();
    }
Beispiel #3
0
    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();
        }
    }