Synthé en CSharp
Bonjour,
Premier article d'une série de 3 (si j'arrive à retrouver tous mes codes sources). C'était un petit challenge technique, faire un synthé sans utiliser aucune bibliothèque ni DLL ni rien, juste en envoyant les octets les uns après les autres en direction de la carte son ! Après moult recherches sur le web et autant d'échec, j'ai finalement réussi à pondre une sorte de code source minimaliste qui génère une sinusoïde à l'infini sans ruptures (sans craquements). Pour être précis, c'est un LA 440 Hz comme sur les diapasons. Mais trêve de bavardages, voici le code source, sans coloration syntaxique, désolé :
using System;
using System.Collections.Generic;
using System.Drawing;
using System.Windows.Forms;
namespace Muzykalotron
{
public partial class MainForm : Form
{
private long timeline;
private byte[] bufferout;
private WaveLib.WaveOutPlayer player;
public MainForm()
{
InitializeComponent();
}
void MainFormLoad(object sender, EventArgs e)
{
timeline = 0;
Start();
}
private void Stop()
{
if (player != null) try
{
player.Dispose();
}
finally
{
player = null;
}
}
private void Start()
{
Stop();
try
{
WaveLib.WaveFormat fmt = new WaveLib.WaveFormat(44100, 8, 1);
player = new WaveLib.WaveOutPlayer(-1, fmt, 16384, 3, new WaveLib.BufferFillEventHandler(Filler));
}
catch
{
Stop();
throw;
}
}
private void Filler(IntPtr data, int size)
{
if (bufferout == null || bufferout.Length < size)
bufferout = new byte[size];
for (int step = 0; step < size; step++)
{
timeline++;
bufferout[step] = (byte)(Math.Sin(440.0 * 2.0 * Math.PI * timeline / 44100.0) * 120.0 + 120.0);
}
System.Runtime.InteropServices.Marshal.Copy(bufferout, 0, data, size);
}
void MainFormFormClosed(object sender, FormClosedEventArgs e)
{
Stop();
}
}
}
A+
GhisMart
Commenter cet article