Есть статья Чарльза Петцольда Простой электронный музыкальный секвенсор для Silverlight на основе записи в блоге Жиля Хузама Воспроизведение файлов Wave в Silverlight и Пита Брауна Создание звука с использованием MediaStreamSource в Silverlight 3 Beta . У Майка Ходника есть полезное сообщение в блоге с примером кода, основанным на статье Petzold под названием Синтез цифрового звука на Windows Phone 7 .
В XAML главного окна Майк вводит медиа-элемент
<MediaElement x:Name="media"/>
, а затем использует метод SetSource
, чтобы установить источник медиаэлементов для волны, которую он создает
this.media.SetSource(new TonesSource());
this.media.Play();
Майка ToneSource
подклассов его BaseSource
, который, в свою очередь, подклассов MediaStreamSource
и переопределяет некоторые из его методов: OpenMediaAsync
, GetSampleAsync
, SeekAsync
, CloseMedia
, GetDiagnosticAsync
и SwitchMediaStreamAsync
, Больше о них есть в документации MSDN ; Сам код Майка не длинный, но включает в себя сдвиг битов и запись в потоки памяти, и его стоит посмотреть в источнике, представленном в блоге Майка .
Класс Майка ToneSource
затем предоставляет стерео сэмплы
protected override StereoSample GetSample()
{
short left = 0;
short right = 0;
foreach (var oscillator in this.leftOscillators)
left += oscillator.GetNextSample();
foreach (var oscillator in this.rightOscillators)
right += oscillator.GetNextSample();
return new StereoSample() { Left = left, Right = right };
}
используя свой Oscillator
класс
public short GetNextSample()
{
ushort wholePhaseAngle = (ushort)(phaseAngle >> 16);
short amplitude = 0;
amplitude = (short)(short.MaxValue * Math.Sin(2 * Math.PI * wholePhaseAngle / ushort.MaxValue));
amplitude = (short)((amplitude * multiplier) >> 16);
phaseAngle += phaseAngleIncrement;
return amplitude;
}
NoiseSource
Майк также обеспечивает даже проще, чем его ToneSource
protected override StereoSample GetSample()
{
return new StereoSample()
{
Left = (short)random.Next(short.MinValue, short.MaxValue),
Right = (short)random.Next(short.MinValue, short.MaxValue)
};
}