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); } }
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(); }
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(); }
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); }
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(); }; }
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(); }; }