예제 #1
0
        void Start()
        {
            var format   = ChannelEnumConverter.GetSoundFormatFromSpeakerMode(AudioSettings.speakerMode);
            var channels = ChannelEnumConverter.GetChannelCountFromSoundFormat(format);

            AudioSettings.GetDSPBufferSize(out var bufferLength, out var numBuffers);
            var sampleRate = AudioSettings.outputSampleRate;

            m_Graph = DSPGraph.Create(format, channels, bufferLength, sampleRate);

            var driver = new DefaultDSPGraphDriver {
                Graph = m_Graph
            };

            driver.AttachToDefaultOutput();

            using (var block = m_Graph.CreateCommandBlock())
            {
                m_NoiseFilter = block.CreateDSPNode <NoiseFilter.Parameters, NoiseFilter.Providers, NoiseFilter>();
                block.AddOutletPort(m_NoiseFilter, 2);

                m_LowPass = StateVariableFilter.Create(block, StateVariableFilter.FilterType.Lowpass);

                block.Connect(m_NoiseFilter, 0, m_LowPass, 0);
                block.Connect(m_LowPass, 0, m_Graph.RootDSP, 0);
            }
        }
    void Start()
    {
        var format = ChannelEnumConverter.GetSoundFormatFromSpeakerMode(AudioSettings.speakerMode);
        var channels = ChannelEnumConverter.GetChannelCountFromSoundFormat(format);
        AudioSettings.GetDSPBufferSize(out var bufferLength, out var numBuffers);
        var sampleRate = AudioSettings.outputSampleRate;

        m_Graph = DSPGraph.Create(format, channels, bufferLength, sampleRate);

        var driver = new DefaultDSPGraphDriver { Graph = m_Graph };
        driver.AttachToDefaultOutput();

        using (var block = m_Graph.CreateCommandBlock())
        {
            m_SineWave = block.CreateDSPNode<SinWaveNode.Parameters, SinWaveNode.Providers, SinWaveNode>();
            block.AddOutletPort(m_SineWave, 2, SoundFormat.Stereo);
            m_SawWave = block.CreateDSPNode<SawWaveNode.Parameters, SawWaveNode.Providers, SawWaveNode>();
            block.AddOutletPort(m_SawWave, 2, SoundFormat.Stereo);

            m_MixNode = block.CreateDSPNode<MixNode.Parameters, MixNode.Providers, MixNode>();
            block.AddInletPort(m_MixNode, 2, SoundFormat.Stereo);
            block.AddInletPort(m_MixNode, 2, SoundFormat.Stereo);
            block.AddOutletPort(m_MixNode, 2, SoundFormat.Stereo);

            block.Connect(m_SineWave, 0, m_MixNode, 0);
            block.Connect(m_SawWave, 0, m_MixNode, 1);
            block.Connect(m_MixNode, 0, m_Graph.RootDSP, 0);
        }
    }
예제 #3
0
파일: Demo2.cs 프로젝트: tk-aria/DSP-Graph
    void Start()
    {
        var graph = DSPGraph.Create(SoundFormat.Stereo, 2, 1024, 48000);

        var driver = new DefaultDSPGraphDriver {
            Graph = graph
        };

        _outputHandle = driver.AttachToDefaultOutput();

        MidiMaster.noteOnDelegate += (MidiChannel channel, int noteNumber, float velocity) => {
            var block = graph.CreateCommandBlock();

            notesNode[noteNumber] = block.CreateDSPNode <SineOscillatorNodeJob.Params, NoProvs, SineOscillatorNodeJob>();
            block.AddOutletPort(notesNode[noteNumber], 2, SoundFormat.Stereo);
            block.SetFloat <SineOscillatorNodeJob.Params, NoProvs, SineOscillatorNodeJob>(
                notesNode[noteNumber],
                SineOscillatorNodeJob.Params.Frequency, math.pow(2, (noteNumber - 69) / 12.0f) * 440.0f
                );

            block.Connect(notesNode[noteNumber], 0, graph.RootDSP, 0);

            block.Complete();
        };

        MidiMaster.noteOffDelegate += (MidiChannel channel, int noteNumber) => {
            var block = graph.CreateCommandBlock();

            block.ReleaseDSPNode(notesNode[noteNumber]);

            block.Complete();
        };
    }
    void Start()
    {
        var format   = ChannelEnumConverter.GetSoundFormatFromSpeakerMode(AudioSettings.speakerMode);
        var channels = ChannelEnumConverter.GetChannelCountFromSoundFormat(format);

        AudioSettings.GetDSPBufferSize(out var bufferLength, out var numBuffers);

        var sampleRate = AudioSettings.outputSampleRate;

        m_Graph = DSPGraph.Create(format, channels, bufferLength, sampleRate);

        var driver = new DefaultDSPGraphDriver {
            Graph = m_Graph
        };

        m_Output = driver.AttachToDefaultOutput();

        // Add an event handler delegate to the graph for ClipStopped. So we are notified
        // of when a clip is stopped in the node and can handle the resources on the main thread.
        m_HandlerID = m_Graph.AddNodeEventHandler <ClipStopped>((node, evt) =>
        {
            Debug.Log("Received ClipStopped event on main thread, cleaning resources");
        });

        // All async interaction with the graph must be done through a DSPCommandBlock.
        // Create it here and complete it once all commands are added.
        var block = m_Graph.CreateCommandBlock();

        m_Node = block.CreateDSPNode <PlayClipNode.Parameters, PlayClipNode.SampleProviders, PlayClipNode>();

        // Currently input and output ports are dynamic and added via this API to a node.
        // This will change to a static definition of nodes in the future.
        block.AddOutletPort(m_Node, 2, SoundFormat.Stereo);

        // Connect the node to the root of the graph.
        m_Connection = block.Connect(m_Node, 0, m_Graph.RootDSP, 0);

        // We are done, fire off the command block atomically to the mixer thread.
        block.Complete();
    }
예제 #5
0
파일: Demo1.cs 프로젝트: tk-aria/DSP-Graph
    void Start()
    {
        var graph = DSPGraph.Create(SoundFormat.Stereo, 2, 1024, 48000);

        var driver = new DefaultDSPGraphDriver {
            Graph = graph
        };

        driver.Initialize(2, SoundFormat.Stereo, 48000, 1024);

        _outputHandle = driver.AttachToDefaultOutput();

        var block = graph.CreateCommandBlock();
        var node  = block.CreateDSPNode <SineOscillatorNodeJob.Params, NoProvs, SineOscillatorNodeJob>();

        block.AddOutletPort(node, 2, SoundFormat.Stereo);
        block.SetFloat <SineOscillatorNodeJob.Params, NoProvs, SineOscillatorNodeJob>(
            node, SineOscillatorNodeJob.Params.Frequency, 440.0f);

        var connection = block.Connect(node, 0, graph.RootDSP, 0);

        block.Complete();
    }
예제 #6
0
        protected override void OnCreate()
        {
            this._available = new NativeQueue <DSPNode>(Allocator.Persistent);
            this._all       = new NativeList <DSPNode>(Allocator.Persistent);

            var format   = ChannelEnumConverter.GetSoundFormatFromSpeakerMode(AudioSettings.speakerMode);
            var channels = ChannelEnumConverter.GetChannelCountFromSoundFormat(format);

            AudioSettings.GetDSPBufferSize(out var bufferLength, out _);

            var sampleRate = AudioSettings.outputSampleRate;

            Debug.Log($"Audio SampleRate will be {sampleRate}");

            this._graph = DSPGraph.Create(format, channels, bufferLength, sampleRate);

            var driver = new DefaultDSPGraphDriver {
                Graph = this._graph
            };

            this._output = driver.AttachToDefaultOutput();

            this._graph.AddNodeEventHandler <AudioSampleNodeCompleted>(this.ReleaseNode);
        }
예제 #7
0
파일: Demo5.cs 프로젝트: tk-aria/DSP-Graph
    void Start()
    {
        var graph = DSPGraph.Create(SoundFormat.Stereo, 2, 1024, 48000);

        var driver = new DefaultDSPGraphDriver {
            Graph = graph
        };

        driver.Initialize(2, SoundFormat.Stereo, 48000, 1024);

        _outputHandle = driver.AttachToDefaultOutput();

        var block = graph.CreateCommandBlock();

        var midiCvNode = block.CreateDSPNode <MIDICVNode.Params, MIDICVNode.Providers, MIDICVNode>();

        block.AddOutletPort(midiCvNode, 1, SoundFormat.Mono);
        block.AddOutletPort(midiCvNode, 1, SoundFormat.Mono);
        block.SetFloat <MIDICVNode.Params, MIDICVNode.Providers, MIDICVNode>(midiCvNode, MIDICVNode.Params.Note, -1.0f);

        var vcoNode = block.CreateDSPNode <VCONode.Params, VCONode.Providers, VCONode>();

        block.AddInletPort(vcoNode, 1, SoundFormat.Mono);
        block.AddOutletPort(vcoNode, 1, SoundFormat.Mono);

        var adsrNode = block.CreateDSPNode <ADSRNode.Params, ADSRNode.Providers, ADSRNode>();

        block.AddInletPort(adsrNode, 1, SoundFormat.Mono);
        block.AddOutletPort(adsrNode, 1, SoundFormat.Mono);
        block.SetFloat <ADSRNode.Params, ADSRNode.Providers, ADSRNode>(adsrNode, ADSRNode.Params.Attack, 0.2f);
        block.SetFloat <ADSRNode.Params, ADSRNode.Providers, ADSRNode>(adsrNode, ADSRNode.Params.Decay, 2.0f);
        block.SetFloat <ADSRNode.Params, ADSRNode.Providers, ADSRNode>(adsrNode, ADSRNode.Params.Sustain, 3.0f);
        block.SetFloat <ADSRNode.Params, ADSRNode.Providers, ADSRNode>(adsrNode, ADSRNode.Params.Release, 0.5f);

        var vcaNode = block.CreateDSPNode <VCANode.Params, VCANode.Providers, VCANode>();

        block.AddInletPort(vcaNode, 1, SoundFormat.Mono);
        block.AddInletPort(vcaNode, 1, SoundFormat.Mono);
        block.AddOutletPort(vcaNode, 1, SoundFormat.Mono);

        var monoToStereoNode = block.CreateDSPNode <MonoToStereoNode.Params, MonoToStereoNode.Providers, MonoToStereoNode>();

        block.AddInletPort(monoToStereoNode, 1, SoundFormat.Mono);
        block.AddOutletPort(monoToStereoNode, 2, SoundFormat.Stereo);

        block.Connect(midiCvNode, 0, vcoNode, 0);
        block.Connect(midiCvNode, 1, adsrNode, 0);
        block.Connect(vcoNode, 0, vcaNode, 0);
        block.Connect(adsrNode, 0, vcaNode, 1);
        block.Connect(vcaNode, 0, monoToStereoNode, 0);
        block.Connect(monoToStereoNode, 0, graph.RootDSP, 0);

        block.Complete();

        MidiMaster.noteOnDelegate += (MidiChannel channel, int noteNumber, float velocity) => {
            var noteOnBlock = graph.CreateCommandBlock();

            noteOnBlock.SetFloat <MIDICVNode.Params, MIDICVNode.Providers, MIDICVNode>(midiCvNode, MIDICVNode.Params.Note, (float)noteNumber);

            noteOnBlock.Complete();
        };

        MidiMaster.noteOffDelegate += (MidiChannel channel, int noteNumber) => {
            var noteOffBlock = graph.CreateCommandBlock();

            noteOffBlock.SetFloat <MIDICVNode.Params, MIDICVNode.Providers, MIDICVNode>(midiCvNode, MIDICVNode.Params.Note, -1.0f);

            noteOffBlock.Complete();
        };
    }
예제 #8
0
파일: Demo4.cs 프로젝트: tk-aria/DSP-Graph
    void Start()
    {
        var graph = DSPGraph.Create(SoundFormat.Stereo, 2, 1024, 48000);

        var driver = new DefaultDSPGraphDriver {
            Graph = graph
        };

        _outputHandle = driver.AttachToDefaultOutput();

        MidiMaster.noteOnDelegate += (MidiChannel channel, int noteNumber, float velocity) => {
            var block = graph.CreateCommandBlock();

            modulatorNode[noteNumber] = block.CreateDSPNode <SineOscillatorNodeJob.Params, NoProvs, SineOscillatorNodeJob>();
            block.AddOutletPort(modulatorNode[noteNumber], 2, SoundFormat.Stereo);
            block.SetFloat <SineOscillatorNodeJob.Params, NoProvs, SineOscillatorNodeJob>(
                modulatorNode[noteNumber],
                SineOscillatorNodeJob.Params.Frequency, 1.34f * math.pow(2, (noteNumber - 69) / 12.0f) * 440.0f
                );

            modulatorADSNode[noteNumber] = block.CreateDSPNode <AttackDecaySustainNodeJob.Params, NoProvs, AttackDecaySustainNodeJob>();
            block.AddInletPort(modulatorADSNode[noteNumber], 2, SoundFormat.Stereo);
            block.AddOutletPort(modulatorADSNode[noteNumber], 2, SoundFormat.Stereo);
            block.SetFloat <AttackDecaySustainNodeJob.Params, NoProvs, AttackDecaySustainNodeJob>(
                modulatorADSNode[noteNumber],
                AttackDecaySustainNodeJob.Params.Attack, 0.3f
                );

            block.SetFloat <AttackDecaySustainNodeJob.Params, NoProvs, AttackDecaySustainNodeJob>(
                modulatorADSNode[noteNumber],
                AttackDecaySustainNodeJob.Params.Decay, 0.1f
                );

            block.SetFloat <AttackDecaySustainNodeJob.Params, NoProvs, AttackDecaySustainNodeJob>(
                modulatorADSNode[noteNumber],
                AttackDecaySustainNodeJob.Params.Sustain, 1.2f
                );

            carrierNode[noteNumber] = block.CreateDSPNode <ModulatableSineOscillatorNodeJob.Params, NoProvs, ModulatableSineOscillatorNodeJob>();
            block.AddInletPort(carrierNode[noteNumber], 2, SoundFormat.Stereo);
            block.AddOutletPort(carrierNode[noteNumber], 2, SoundFormat.Stereo);
            block.SetFloat <ModulatableSineOscillatorNodeJob.Params, NoProvs, ModulatableSineOscillatorNodeJob>(
                carrierNode[noteNumber],
                ModulatableSineOscillatorNodeJob.Params.Frequency, math.pow(2, (noteNumber - 69) / 12.0f) * 440.0f
                );

            carrierADSNode[noteNumber] = block.CreateDSPNode <AttackDecaySustainNodeJob.Params, NoProvs, AttackDecaySustainNodeJob>();
            block.AddInletPort(carrierADSNode[noteNumber], 2, SoundFormat.Stereo);
            block.AddOutletPort(carrierADSNode[noteNumber], 2, SoundFormat.Stereo);
            block.SetFloat <AttackDecaySustainNodeJob.Params, NoProvs, AttackDecaySustainNodeJob>(
                carrierADSNode[noteNumber],
                AttackDecaySustainNodeJob.Params.Attack, 0.1f
                );

            block.SetFloat <AttackDecaySustainNodeJob.Params, NoProvs, AttackDecaySustainNodeJob>(
                carrierADSNode[noteNumber],
                AttackDecaySustainNodeJob.Params.Decay, 1.0f
                );

            block.SetFloat <AttackDecaySustainNodeJob.Params, NoProvs, AttackDecaySustainNodeJob>(
                carrierADSNode[noteNumber],
                AttackDecaySustainNodeJob.Params.Sustain, 0.0f
                );

            block.Connect(modulatorNode[noteNumber], 0, modulatorADSNode[noteNumber], 0);
            block.Connect(modulatorADSNode[noteNumber], 0, carrierNode[noteNumber], 0);
            block.Connect(carrierNode[noteNumber], 0, carrierADSNode[noteNumber], 0);
            block.Connect(carrierADSNode[noteNumber], 0, graph.RootDSP, 0);

            block.Complete();
        };

        MidiMaster.noteOffDelegate += (MidiChannel channel, int noteNumber) => {
            var block = graph.CreateCommandBlock();

            block.ReleaseDSPNode(modulatorNode[noteNumber]);
            block.ReleaseDSPNode(carrierNode[noteNumber]);

            block.Complete();
        };
    }