Reproduction of a sinusoid for leadership

All day I was looking for some kind of textbook or piece of code, “just”, to play a simple sinful wave for “infinity”. I know that sounds a little crazy.

But I want to be able to change the frequency of the tone over time, for example, to increase it. Imagine that I want to reproduce tone A and increase it to C in "+5" speed steps every 3 ms (this is really just an example), do not want to have free places, stop the tone.

Is it possible? Or can you help me?

+6
source share
2 answers

Use the NAudio library to output sound.

Make a note a wave provider:

class NotesWaveProvider : WaveProvider32 { public NotesWaveProvider(Queue<Note> notes) { this.Notes = notes; } public readonly Queue<Note> Notes; int sample = 0; Note NextNote() { for (; ; ) { if (Notes.Count == 0) return null; var note = Notes.Peek(); if (sample < note.Duration.TotalSeconds * WaveFormat.SampleRate) return note; Notes.Dequeue(); sample = 0; } } public override int Read(float[] buffer, int offset, int sampleCount) { int sampleRate = WaveFormat.SampleRate; for (int n = 0; n < sampleCount; n++) { var note = NextNote(); if (note == null) buffer[n + offset] = 0; else buffer[n + offset] = (float)(note.Amplitude * Math.Sin((2 * Math.PI * sample * note.Frequency) / sampleRate)); sample++; } return sampleCount; } } class Note { public float Frequency; public float Amplitude = 1.0f; public TimeSpan Duration = TimeSpan.FromMilliseconds(50); } 

start the game:

 WaveOut waveOut; this.Notes = new Queue<Note>(new[] { new Note { Frequency = 1000 }, new Note { Frequency = 1100 } }); var waveProvider = new NotesWaveProvider(Notes); waveProvider.SetWaveFormat(16000, 1); // 16kHz mono waveOut = new WaveOut(); waveOut.Init(waveProvider); waveOut.Play(); 

add new notes:

 void Timer_Tick(...) { if (Notes.Count < 10) Notes.Add(new Note{Frecuency = 900}); } 

ps this code is just an idea. for real use add mt-locking etc.

+5
source

use NAudio and SineWaveProvider32: http://mark-dot-net.blogspot.com/2009/10/playback-of-sine-wave-in-naudio.html

 private WaveOut waveOut; private void button1_Click(object sender, EventArgs e) { StartStopSineWave(); } private void StartStopSineWave() { if (waveOut == null) { var sineWaveProvider = new SineWaveProvider32(); sineWaveProvider.SetWaveFormat(16000, 1); // 16kHz mono sineWaveProvider.Frequency = 1000; sineWaveProvider.Amplitude = 0.25f; waveOut = new WaveOut(); waveOut.Init(sineWaveProvider); waveOut.Play(); } else { waveOut.Stop(); waveOut.Dispose(); waveOut = null; } } 
+1
source

Source: https://habr.com/ru/post/910130/


All Articles