Option Strict Off Option Explicit On Imports System.Runtime.InteropServices Public Class Form1 Inherits System.Windows.Forms.Form #Region " Windows Form Designer generated code " ' Direct Sound access Dim DX As DxVBLibA.DirectX8 Dim DS As DxVBLibA.DirectSound8 Dim dsToneBuffer As DxVBLibA.DirectSoundSecondaryBuffer8 Dim desc As DxVBLibA.DSBUFFERDESC ' ' Global variables Const PI As Double = 3.14159265358979 Const SRATE As Integer = 44100 ' Sampling Rate Dim Tone(25) As Double Dim Major(15) As Integer Dim Minor(15) As Integer Dim Harmonics(7) As Integer ' Private Sub frmMain_Load(ByVal eventSender As System.Object, _ ByVal eventArgs As System.EventArgs) Handles MyBase.Load ' ' initialise DirectSound DX = New DxVBLibA.DirectX8 DS = DX.DirectSoundCreate("") DS.SetCooperativeLevel(Me.Handle.ToInt32, _ DxVBLibA.CONST_DSSCLFLAGS.DSSCL_NORMAL) ' ' create a buffer desc.fxFormat.nFormatTag = DxVBLibA.CONST_DSOUND.WAVE_FORMAT_PCM desc.fxFormat.nSize = 0 desc.fxFormat.lExtra = 0 desc.fxFormat.nChannels = 1 desc.fxFormat.lSamplesPerSec = SRATE desc.fxFormat.nBitsPerSample = 16 desc.fxFormat.nBlockAlign = 2 desc.fxFormat.lAvgBytesPerSec = 2 * SRATE desc.lFlags = 0 desc.lBufferBytes = 2 * 1 * SRATE dsToneBuffer = DS.CreateSoundBuffer(desc) ' Setup tones and scale Dim M As Double = Math.Exp(Math.Log(2) / 12) Tone(0) = 220 Dim i As Integer For i = 1 To 24 Tone(i) = Tone(i - 1) * M Next Major(0) = 0 Major(1) = 2 Major(2) = 4 Major(3) = 5 Major(4) = 7 Major(5) = 9 Major(6) = 11 Major(7) = 12 Major(8) = 14 Major(9) = 16 Major(10) = 17 Major(11) = 19 Major(12) = 21 Major(13) = 23 Major(14) = 24 Minor(0) = 0 Minor(1) = 2 Minor(2) = 3 Minor(3) = 5 Minor(4) = 7 Minor(5) = 9 Minor(6) = 10 Minor(7) = 12 Minor(8) = 14 Minor(9) = 15 Minor(10) = 17 Minor(11) = 19 Minor(12) = 21 Minor(13) = 22 Minor(14) = 24 Harmonics(0) = 0 Harmonics(1) = 4 Harmonics(2) = 7 Harmonics(3) = 12 Harmonics(4) = 16 Harmonics(5) = 19 Harmonics(6) = 24 End Sub Private Sub playTone(ByVal DUR As Double, ByVal FREQ As Double) Dim i As Integer, f As Integer, cnt As Integer Dim sbuf(DUR * SRATE) As Short Dim hmem As GCHandle = GCHandle.Alloc(sbuf, GCHandleType.Pinned) ' build the tone For i = 0 To DUR * SRATE sbuf(i) = 10000 * System.Math.Sin(2 * PI * FREQ * i / SRATE) Next i ' copy tone to buffer desc.lBufferBytes = 2 * DUR * SRATE dsToneBuffer = DS.CreateSoundBuffer(desc) dsToneBuffer.WriteBuffer(0, 2 * DUR * SRATE, hmem.AddrOfPinnedObject(), _ DxVBLibA.CONST_DSBLOCKFLAGS.DSBLOCK_DEFAULT) 'hmem.Free() ' play the tone dsToneBuffer.Play(DxVBLibA.CONST_DSBPLAYFLAGS.DSBPLAY_DEFAULT) While (dsToneBuffer.GetStatus <> 0) End While End Sub Private Sub Play_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Play.Click Dim i As Integer Dim r As Integer For i = 0 To 10 r = Rnd() * 15 playTone(0.1, Tone(Minor(r))) Next i End Sub Private Sub butExit_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles butExit.Click End End Sub Private Sub btnHarmony_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnHarmony.Click Dim i As Integer Dim r As Integer, d As Integer For i = 0 To 10 r = Rnd() * 7 d = Rnd() * 3 + 1 playTone(d * 0.1, Tone(Harmonics(r))) Next i End Sub End Class