コード例 #1
0
    static DSPNode CreateSpectrum(DSPCommandBlock block)
    {
        var scope = block.CreateDSPNode <SpectrumNode.Parameters, SpectrumNode.Providers, SpectrumNode>();

        block.AddInletPort(scope, 1, SoundFormat.Mono);
        return(scope);
    }
コード例 #2
0
    void Update()
    {
        if (_Initialized == false)
        {
            return;
        }

        if (_Waiting)
        {
            //    if(_Request.Done)
            //    {
            //        UpdateRequestFinished(_Request);
            //    }
        }
        else
        {
            using (DSPCommandBlock block = _Graph.CreateCommandBlock())
            {
                _Waiting = true;
                block.CreateUpdateRequest <ScopeUpdateKernel, ScopeNode.Parameters, ScopeNode.Providers, ScopeNode>(new ScopeUpdateKernel(_BufferX), _ScopeNode, req =>
                {
                    UpdateRequestFinished(req);
                    req.Dispose();
                });
            }
        }
    }
コード例 #3
0
 protected override void AddUpdateParametersToBlock(DSPCommandBlock block)
 {
     block.SetFloat <OscilatorNode.Parameters, OscilatorNode.Providers, OscilatorNode>(_DSPNode, OscilatorNode.Parameters.Frequency, Frequency);
     block.SetFloat <OscilatorNode.Parameters, OscilatorNode.Providers, OscilatorNode>(_DSPNode, OscilatorNode.Parameters.Mode, (float)Mode);
     block.SetFloat <OscilatorNode.Parameters, OscilatorNode.Providers, OscilatorNode>(_DSPNode, OscilatorNode.Parameters.FMMultiplier, FMMultiplier);
     block.SetFloat <OscilatorNode.Parameters, OscilatorNode.Providers, OscilatorNode>(_DSPNode, OscilatorNode.Parameters.Unidirectional, Unidirectional ? 1.0f : 0.0f);
 }
コード例 #4
0
        private AudioClipPlayerSystemState CreateState(DSPCommandBlock block)
        {
            DSPNode node;

            if (this._available.Count > 0)
            {
                node = this._available.Dequeue();
            }
            else
            {
                Debug.Log($"Creating additional OneShot PlayAudioSampleNode #{this._all.Length}");
                node = block.CreateDSPNode <Parameters, Providers, PlayAudioSampleReaderNode>();
                block.AddOutletPort(node, 2);
                this._all.Add(node);
            }

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

            return(new AudioClipPlayerSystemState(node, connection));
        }
コード例 #5
0
 protected override void AddUpdateParametersToBlock(DSPCommandBlock block)
 {
     block.SetFloat <ADSRNode.Parameters, ADSRNode.Providers, ADSRNode>(_DSPNode, ADSRNode.Parameters.Attack, Attack);
     block.SetFloat <ADSRNode.Parameters, ADSRNode.Providers, ADSRNode>(_DSPNode, ADSRNode.Parameters.Decay, Decay);
     block.SetFloat <ADSRNode.Parameters, ADSRNode.Providers, ADSRNode>(_DSPNode, ADSRNode.Parameters.Sustain, Sustain);
     block.SetFloat <ADSRNode.Parameters, ADSRNode.Providers, ADSRNode>(_DSPNode, ADSRNode.Parameters.Release, Release);
 }
コード例 #6
0
    static DSPNode CreateAttenuator(DSPCommandBlock block)
    {
        var attenuator = block.CreateDSPNode <AttenuatorNode.Parameters, AttenuatorNode.Providers, AttenuatorNode>();

        block.AddInletPort(attenuator, 1, SoundFormat.Mono);
        block.AddOutletPort(attenuator, 1, SoundFormat.Mono);
        return(attenuator);
    }
コード例 #7
0
    static DSPNode CreateADSR(DSPCommandBlock block)
    {
        var adsr = block.CreateDSPNode <ADSRNode.Parameters, ADSRNode.Providers, ADSRNode>();

        block.AddInletPort(adsr, 16, SoundFormat.Mono); // gate
        block.AddOutletPort(adsr, 16, SoundFormat.Mono);
        return(adsr);
    }
コード例 #8
0
    static DSPNode CreateMonoToStereo(DSPCommandBlock block)
    {
        var mts = block.CreateDSPNode <MonoToStereoNode.Parameters, MonoToStereoNode.Providers, MonoToStereoNode>();

        block.AddInletPort(mts, 1, SoundFormat.Mono); // left
        block.AddInletPort(mts, 1, SoundFormat.Mono); // right
        block.AddOutletPort(mts, 2, SoundFormat.Stereo);
        return(mts);
    }
コード例 #9
0
    static DSPNode CreateMidi(DSPCommandBlock block)
    {
        var midi = block.CreateDSPNode <MidiNode.Parameters, MidiNode.Providers, MidiNode>();

        block.AddOutletPort(midi, 16, SoundFormat.Mono); // gate
        block.AddOutletPort(midi, 16, SoundFormat.Mono); // note
        block.AddOutletPort(midi, 16, SoundFormat.Mono); // retrigger
        return(midi);
    }
コード例 #10
0
    static DSPNode CreateMixer(DSPCommandBlock block)
    {
        var mixer = block.CreateDSPNode <MixerNode.Parameters, MixerNode.Providers, MixerNode>();

        block.AddInletPort(mixer, 16, SoundFormat.Mono); // input
        block.AddInletPort(mixer, 16, SoundFormat.Mono); // cv
        block.AddOutletPort(mixer, 1, SoundFormat.Mono);
        return(mixer);
    }
コード例 #11
0
    static DSPNode CreateVCA(DSPCommandBlock block)
    {
        var vca = block.CreateDSPNode <VCANode.Parameters, VCANode.Providers, VCANode>();

        block.AddInletPort(vca, 16, SoundFormat.Mono); // voltage
        block.AddInletPort(vca, 16, SoundFormat.Mono); // input
        block.AddOutletPort(vca, 16, SoundFormat.Mono);
        return(vca);
    }
コード例 #12
0
    static DSPNode CreateOscilator(DSPCommandBlock block)
    {
        var oscilator = block.CreateDSPNode <OscilatorNode.Parameters, OscilatorNode.Providers, OscilatorNode>();

        block.AddInletPort(oscilator, 16, SoundFormat.Mono); // fm
        block.AddInletPort(oscilator, 16, SoundFormat.Mono); // pitch
        block.AddInletPort(oscilator, 16, SoundFormat.Mono); // phase reset
        block.AddOutletPort(oscilator, 16, SoundFormat.Mono);
        return(oscilator);
    }
コード例 #13
0
 protected override void AddUpdateParametersToBlock(DSPCommandBlock block)
 {
     block.SetFloat <ScopeNode.Parameters, ScopeNode.Providers, ScopeNode>(_DSPNode, ScopeNode.Parameters.Time, Time);
     block.SetFloat <ScopeNode.Parameters, ScopeNode.Providers, ScopeNode>(_DSPNode, ScopeNode.Parameters.TriggerTreshold, TriggerTreshold);
     if (ScopeRenderer != null)
     {
         ScopeRenderer.Height = Height;
         ScopeRenderer.Offset = Offset;
     }
 }
コード例 #14
0
        public static DSPNode Create(DSPCommandBlock block, FilterType type)
        {
            var node = block.CreateDSPNode <AudioKernel.Parameters, AudioKernel.Providers, AudioKernel>();

            block.AddInletPort(node, 2);
            block.AddOutletPort(node, 2);
            block.SetFloat <AudioKernel.Parameters, AudioKernel.Providers, AudioKernel>(node,
                                                                                        AudioKernel.Parameters.FilterType, (float)type);

            return(node);
        }
コード例 #15
0
 public static void TriggerAudioSample(
     this DSPCommandBlock block,
     DSPNode node,
     AudioSampleDataReader reader,
     Categories category = Categories.OneShot)
 {
     // Kick off playback. This will be done in a better way in the future.
     block.UpdateAudioKernel <StartPlayingAudioSample, Parameters, Providers, PlayAudioSampleReaderNode>(
         new StartPlayingAudioSample(reader, category),
         node
         );
 }
コード例 #16
0
 public void Dispose()
 {
     if (CleanupNodes)
     {
         using (DSPCommandBlock block = Graph.CreateCommandBlock())
             foreach (DSPNode node in m_CreatedNodes)
             {
                 block.ReleaseDSPNode(node);
             }
     }
     Graph.Dispose();
 }
コード例 #17
0
        public static DSPNode Create(DSPCommandBlock block, FilterType type, float cutoff, float q, float gainInDbs, int channelsPerPort)
        {
            var node = block.CreateDSPNode <Parameters, Providers, StateVariableFilterNode>();

            block.AddInletPort(node, channelsPerPort);
            block.AddOutletPort(node, channelsPerPort);
            block.SetFloat <Parameters, Providers, StateVariableFilterNode>(node, Parameters.FilterType, (float)type);
            block.SetFloat <Parameters, Providers, StateVariableFilterNode>(node, Parameters.Cutoff, cutoff);
            block.SetFloat <Parameters, Providers, StateVariableFilterNode>(node, Parameters.Q, q);
            block.SetFloat <Parameters, Providers, StateVariableFilterNode>(node, Parameters.GainInDBs, gainInDbs);

            return(node);
        }
コード例 #18
0
        public static NodeData CreateGeneratorNode(DSPCommandBlock block, DSPNode consumer, int channelCount, SoundFormat soundFormat)
        {
            var node = block.CreateDSPNode <NoParameters, NoProviders, GenerateOne>();

            block.AddOutletPort(node, channelCount, soundFormat);
            var connection = block.Connect(node, 0, consumer, 0);

            return(new NodeData
            {
                Node = node,
                Connection = connection
            });
        }
コード例 #19
0
    void SendCommand(OscWave wave, float frequency, float amplitude, float cutoff, float q, float filterAmplitude, float pan)
    {
        DSPCommandBlock commandBlock = m_driver.m_graph.CreateCommandBlock();

        commandBlock.SetFloat <OscParameters, OscProviders, OscillatorNode>(m_oscNode, OscParameters.Wave, (float)wave);
        commandBlock.SetFloat <OscParameters, OscProviders, OscillatorNode>(m_oscNode, OscParameters.Frequency, frequency);
        commandBlock.SetFloat <SVFParameters, SVFProviders, SVFNode>(m_filterNode, SVFParameters.Cutoff, cutoff);
        commandBlock.SetFloat <SVFParameters, SVFProviders, SVFNode>(m_filterNode, SVFParameters.Q, q);
        commandBlock.SetFloat <SVFParameters, SVFProviders, SVFNode>(m_filterNode, SVFParameters.Amplitude, filterAmplitude);
        commandBlock.SetFloat <VCAParameters, VCAProviders, VCANode>(m_vcaNode, VCAParameters.Amplitude, amplitude);
        commandBlock.SetFloat <MonoToStereoParameters, MonoToStereoProviders, MonoToStereoNode>(m_stereoNode, MonoToStereoParameters.Pan, pan);
        commandBlock.Complete();
    }
コード例 #20
0
        private AudioClipPlayerSystemState CreateNode(DSPCommandBlock block)
        {
            var node = block.CreateDSPNode <Parameters, Providers, PlayAudioSampleReaderNode>();

            block.AddOutletPort(node, 2);
            var connection = block.Connect(
                node,
                0,
                this._graph.RootDSP,
                0
                );

            return(new AudioClipPlayerSystemState(node, connection));
        }
コード例 #21
0
        public static NodeData CreatePassthroughNode(DSPCommandBlock block, DSPGraph graph, int channelCount, SoundFormat soundFormat)
        {
            var node = block.CreateDSPNode <NoParameters, NoProviders, PassThrough>();

            block.AddInletPort(node, channelCount, soundFormat);
            block.AddOutletPort(node, channelCount, soundFormat);
            var connection = block.Connect(node, 0, graph.RootDSP, 0);

            return(new NodeData
            {
                Node = node,
                Connection = connection
            });
        }
コード例 #22
0
    private void OnDestroy()
    {
        // Disconnect all the node input/outputs
        DSPCommandBlock commandBlock = m_driver.m_graph.CreateCommandBlock();

        commandBlock.ReleaseDSPNode(m_stereoNode);
        commandBlock.ReleaseDSPNode(m_vcaNode);
        commandBlock.ReleaseDSPNode(m_filterNode);
        commandBlock.ReleaseDSPNode(m_oscNode);
        commandBlock.Complete();

        // Deallocate
        m_driver.Dispose();
        m_buffer.Dispose();
    }
コード例 #23
0
    void Update()
    {
        if (_Initialized == false)
        {
            return;
        }

        if (!_Waiting)
        {
            using (DSPCommandBlock block = _Graph.CreateCommandBlock())
            {
                _Waiting = true;
                block.CreateUpdateRequest <SpectrumUpdateKernel, SpectrumNode.Parameters, SpectrumNode.Providers, SpectrumNode>(new SpectrumUpdateKernel(_Buffer), _ScopeNode, req =>
                {
                    UpdateRequestFinished(req);
                    req.Dispose();
                });
            }
        }
    }
コード例 #24
0
    void AddProviderToNode <TKernel>(DSPCommandBlock block, DSPNode node, int index = -1, float value = kSignalValueA, Providers item = Providers.VariableSizeArray, bool insert = true)
        where TKernel : struct, IAudioKernel <NoParameters, Providers>
    {
        var provider = AudioSampleProvider.Create(kChannelCount, kSampleRate);

        provider.enableSilencePadding = false;
        var inputBuff = new NativeArray <float>(2 * kChannelCount * kDspBufferSize, Allocator.Temp, NativeArrayOptions.UninitializedMemory);

        for (int i = 0; i < inputBuff.Length; ++i)
        {
            inputBuff[i] = value;
        }
        provider.QueueSampleFrames(inputBuff);
        inputBuff.Dispose();
        if (insert)
        {
            block.InsertSampleProvider <NoParameters, Providers, TKernel>(provider.id, node, item, index);
        }
        else
        {
            block.SetSampleProvider <NoParameters, Providers, TKernel>(provider.id, node, item, index);
        }
    }
コード例 #25
0
 protected override void AddUpdateParametersToBlock(DSPCommandBlock block)
 {
     block.SetFloat <SpectrumNode.Parameters, SpectrumNode.Providers, SpectrumNode>(_DSPNode, SpectrumNode.Parameters.Window, (float)Window);
 }
コード例 #26
0
 protected virtual void AddUpdateParametersToBlock(DSPCommandBlock block)
 {
 }
コード例 #27
0
 public static void TerminateAudioSampleNode(this DSPCommandBlock block, DSPNode node)
 {
     block.UpdateAudioKernel <TerminateAudioSampleNode, Parameters, Providers, PlayAudioSampleReaderNode>(
         new TerminateAudioSampleNode(),
         node);
 }
 protected override void AddUpdateParametersToBlock(DSPCommandBlock block)
 {
     block.SetFloat <AttenuatorNode.Parameters, AttenuatorNode.Providers, AttenuatorNode>(_DSPNode, AttenuatorNode.Parameters.Multiplier, Multiplier);
 }
コード例 #29
0
    // Script load constructor
    private void Awake()
    {
        AudioConfiguration audioConfig = AudioSettings.GetConfiguration();

        m_sampleRate = audioConfig.sampleRate;
        m_bufferSize = audioConfig.dspBufferSize;

        switch (audioConfig.speakerMode)
        {
        case AudioSpeakerMode.Mono:
        {
            m_channels = 1;
            break;
        }

        case AudioSpeakerMode.Stereo:
        {
            m_channels = 2;
            break;
        }

        default:
        {
            m_channels = 2;
            break;
        }
        }

        // Create output
        m_driver = new DSPGraphDriver();
        m_driver.Initialize(m_channels, SoundFormat.Stereo, m_sampleRate, m_bufferSize);
        int bufferAllocationSize = (m_channels * m_bufferSize);

        m_buffer = new NativeArray <float>(bufferAllocationSize, Allocator.Persistent, NativeArrayOptions.ClearMemory);

        // Connect internal node to the output
        DSPCommandBlock commandBlock = m_driver.m_graph.CreateCommandBlock();

        m_oscNode = commandBlock.CreateDSPNode <OscParameters, OscProviders, OscillatorNode>();
        commandBlock.AddOutletPort(m_oscNode, 1, SoundFormat.Mono);
        commandBlock.SetFloat <OscParameters, OscProviders, OscillatorNode>(m_oscNode, OscParameters.Wave, (float)OscWave.Sine);
        commandBlock.SetFloat <OscParameters, OscProviders, OscillatorNode>(m_oscNode, OscParameters.Frequency, 440.0f);

        // SVF (2nd order low pass) node
        m_filterNode = commandBlock.CreateDSPNode <SVFParameters, SVFProviders, SVFNode>();
        commandBlock.AddInletPort(m_filterNode, 1, SoundFormat.Mono);
        commandBlock.AddOutletPort(m_filterNode, 1, SoundFormat.Mono);
        commandBlock.SetFloat <SVFParameters, SVFProviders, SVFNode>(m_filterNode, SVFParameters.Cutoff, 100.0f);
        commandBlock.SetFloat <SVFParameters, SVFProviders, SVFNode>(m_filterNode, SVFParameters.Q, 0.707f);
        commandBlock.SetFloat <SVFParameters, SVFProviders, SVFNode>(m_filterNode, SVFParameters.Amplitude, 0.8f);

        // VCA (amplitude control) node
        m_vcaNode = commandBlock.CreateDSPNode <VCAParameters, VCAProviders, VCANode>();
        commandBlock.AddInletPort(m_vcaNode, 1, SoundFormat.Mono);
        commandBlock.AddOutletPort(m_vcaNode, 1, SoundFormat.Mono);
        commandBlock.SetFloat <VCAParameters, VCAProviders, VCANode>(m_vcaNode, VCAParameters.Amplitude, 0.0f);

        // Mono to stereo node setup
        m_stereoNode = commandBlock.CreateDSPNode <MonoToStereoParameters, MonoToStereoProviders, MonoToStereoNode>();
        commandBlock.AddInletPort(m_stereoNode, 1, SoundFormat.Mono);
        commandBlock.AddOutletPort(m_stereoNode, m_channels, SoundFormat.Stereo);
        commandBlock.SetFloat <MonoToStereoParameters, MonoToStereoProviders, MonoToStereoNode>(m_stereoNode, MonoToStereoParameters.Pan, 0.0f);

        // Connect the nodes together
        // VCO -> SVF -> VCA -> Pan -> Output
        commandBlock.Connect(m_oscNode, 0, m_filterNode, 0);
        commandBlock.Connect(m_filterNode, 0, m_vcaNode, 0);
        commandBlock.Connect(m_vcaNode, 0, m_stereoNode, 0);
        commandBlock.Connect(m_stereoNode, 0, m_driver.m_graph.RootDSP, 0);

        // Send the command the atomic/asynchronous handler
        commandBlock.Complete();
    }