Project maintained by ArthurBarthur Hosted on GitHub Pages — Theme by mattgraham

Hei på deg!

Jon Arthur Marrable



Some things I do:

Technical implementation (interactive media)


Samples of real-time interactive experiments:

Description Video Links
Arthur’s Audio Blueprints Youtube
SpringKeys Virtual Instrument Youtube
Future train-ride meditation Youtube
Desktop 3d synthesizer with infinite random presets Youtube
Acoustic Spa Experience Youtube
Physical environment audio propagation demo Youtube
Music Visualizer “Candy” Youtube
Music Visualizer “Rocket” Youtube
Soft-Loop exploring Youtube
Rube Goldberg-esque interactive melody machine Youtube
Synthwave synthesizer car Youtube
VR music composer sandbox Youtube
Conway’s Game Of Life as a musical 3d printer Youtube
AR interactive music player Youtube
Behind the scenes, interactive VR piano Youtube
Granular synthesis based simulation of hinge friction Youtube
UE4 DAW-expander Alpha Youtube

Code Example:

Wave oscillators are the base noise-generators in a synthesizer. Below is a C# snippet where I generate different wavetypes inside Unitys audio-thread, writing directly to the audiobuffer:

    void OnAudioFilterRead(float[] data, int channels)
       //find audio tick delta inside audio thread
        currentDSPtime = AudioSettings.dspTime;
        deltaDSPtime = currentDSPtime - lastDSPtime;
        lastDSPtime = currentDSPtime;
        // update increment in case frequency has changed
        increment = actualFrequency * 2.0 * System.Math.PI / sampling_frequency;
        //triangle helper
        double trianglehelp = actualFrequency * 2.0 / sampling_frequency;
            for (var i = 0; i < data.Length; i = i + channels)
                phase = phase + increment;
            //select wave type
            switch (_wavetypeenmumfromchord)
                    case ChordSpawner.WaveTypesSelector.Sine:
                    //generate sine wave
                    data[i] = (float)(System.Math.Sin(phase));
                    case ChordSpawner.WaveTypesSelector.Triangle:
                    //generate triangle wave
                    double div = i * trianglehelp;
                        data[i] = (float)(((((int)div) % 2 == 0) ? -finalOscGain : finalOscGain) * (1.0 - 2.0 * (div - (int)div)));
                    case ChordSpawner.WaveTypesSelector.Square:
                    //generate square wave
                    data[i] = Mathf.Sign(Mathf.Sin((float)phase * 2f * Mathf.PI));
                    case ChordSpawner.WaveTypesSelector.Noise:
                    //generate noise wave
                    data[i] = offset - 1.0f + (float)randomNumber.NextDouble() * 2.0f;
                //make sure channel-summing doesn't blow stuff up
                if (channels == 2) data[i + 1] = data[i];
                //reset out-of-bounds wave-phase
                if (phase > 2 * System.Math.PI) phase = 0;
        //handle async frequency changes
        frequency = Mathf.MoveTowards(frequency, newFrequency, ((frequency + newFrequency) * (1 / noteLerpSpeedInSec)) * (float)deltaDSPtime);
        actualFrequency = frequency;

Listen to the code in action


browse the rest of the code