Ton erzeugen

The_MACman

Mitglied
hallo,
ich möchte mit C# töne verschiedne tonarten erzeugen und ausgeben.

könnt ihr mir nen einfachen ansatz geben ?
einer funktion eine frequenz übergeben und da is der ton ? :D

wenn ihr jetzt meint machs mit DirectX dann könnt ihr mir gleich erklären warum bei mir der namespace directX nicht geht.
hab das mit dem directX schon gesehn und wollte ein bsp testen und
"using Microsoft.DirectX.DirectSound; "
geht nicht. nach Microsoft taucht kein DirectX auf.
Hab dann auch gefunden das ich das DirectX SDK brauch ... habe da jetzt massen Versionen runtergeladen ... auch von microsoft Juni208... und es gibt immernoch kein DirectX bei mir.

Also ich hoffe ihr könnt mir helfen.
Wie gesagt nich kompliziertes nur einen einfachen ton.

Danke Markus !
 
Zu DirectX: Da fehlt bei dir wohl ein Verweis!

Zum Beep: Verwende die Funktion Beep in der kernel32.dll

Code:
class WinAPIAccess
{
    [DllImport("kernel32.dll")]
    private static extern long Beep(short srtFrequency, short srtDuration);
}
 
Wenn ich nich irre ist beep doch die Funktion die den Speaker anspricht.
Das is leider schon zu einfach :)
Diesen Ton kann man einfach niemanden anbieten :)

Was für Verweis kann mir denn wo fehlen ?
 
Jap das mit den verweisen hab ich jetzt endlich hinbekommen!
ich werd mich jetzt hier durch das Beispiel kämpfen.

falls jmd einen tollen ansatz hat kann er trotzdem posten :)
 
Also ich hab jetzt hier ein Beispiel.

Code:
using System;
using System.Threading;
using System.Windows.Forms;
using Microsoft.DirectX.DirectSound;

namespace MyProject
{
    class Program
    {
        public delegate void PullAudio(short[] buffer, int length);

        public class SoundPlayer : IDisposable
        {
            private Device soundDevice;
            private SecondaryBuffer soundBuffer;
            private int samplesPerUpdate;
            private AutoResetEvent[] fillEvent = new AutoResetEvent[2];
            private Thread thread;
            private PullAudio pullAudio;
            private short channels;
            private bool halted;
            private bool running;

            public SoundPlayer(Control owner, PullAudio pullAudio, short channels)
            {
                this.channels = channels;
                this.pullAudio = pullAudio;

                this.soundDevice = new Device();
                this.soundDevice.SetCooperativeLevel(owner, CooperativeLevel.Priority);

                // Set up our wave format to 44,100Hz, with 16 bit resolution
                WaveFormat wf = new WaveFormat();
                wf.FormatTag = WaveFormatTag.Pcm;
                wf.SamplesPerSecond = 44100;
                wf.BitsPerSample = 16;
                wf.Channels = channels;
                wf.BlockAlign = (short)(wf.Channels * wf.BitsPerSample / 8);
                wf.AverageBytesPerSecond = wf.SamplesPerSecond * wf.BlockAlign;

                this.samplesPerUpdate = 512;

                // Create a buffer with 2 seconds of sample data
                BufferDescription bufferDesc = new BufferDescription(wf);
                bufferDesc.BufferBytes = this.samplesPerUpdate * wf.BlockAlign * 2;
                bufferDesc.ControlPositionNotify = true;
                bufferDesc.GlobalFocus = true;

                this.soundBuffer = new SecondaryBuffer(bufferDesc, this.soundDevice);

                Notify notify = new Notify(this.soundBuffer);

                fillEvent[0] = new AutoResetEvent(false);
                fillEvent[1] = new AutoResetEvent(false);

                // Set up two notification events, one at halfway, and one at the end of the buffer
                BufferPositionNotify[] posNotify = new BufferPositionNotify[2];
                posNotify[0] = new BufferPositionNotify();
                posNotify[0].Offset = bufferDesc.BufferBytes / 2 - 1;
                posNotify[0].EventNotifyHandle = fillEvent[0].SafeWaitHandle;
                posNotify[1] = new BufferPositionNotify();
                posNotify[1].Offset = bufferDesc.BufferBytes - 1;
                posNotify[1].EventNotifyHandle = fillEvent[1].SafeWaitHandle;

                notify.SetNotificationPositions(posNotify);

                this.thread = new Thread(new ThreadStart(SoundPlayback));
                this.thread.Priority = ThreadPriority.Highest;

                this.Pause();
                this.running = true;

                this.thread.Start();
            }

            public void Pause()
            {
                if (this.halted)
                    return;

                this.halted = true;

                Monitor.Enter(this.thread);
            }

            public void Resume()
            {
                if (!this.halted)
                    return;

                this.halted = false;

                Monitor.Pulse(this.thread);
                Monitor.Exit(this.thread);
            }

            private void SoundPlayback()
            {
                lock (this.thread) {
                    if (!this.running)
                        return;

                    // Set up the initial sound buffer to be the full length
                    int bufferLength = this.samplesPerUpdate * 2 * this.channels;
                    short[] soundData = new short[bufferLength];

                    // Prime it with the first x seconds of data
                    this.pullAudio(soundData, soundData.Length);
                    this.soundBuffer.Write(0, soundData, LockFlag.None);

                    // Start it playing
                    this.soundBuffer.Play(0, BufferPlayFlags.Looping);

                    int lastWritten = 0;
                    while (this.running) {
                        if (this.halted) {
                            Monitor.Pulse(this.thread);
                            Monitor.Wait(this.thread);
                        }

                        // Wait on one of the notification events
                        WaitHandle.WaitAny(this.fillEvent, 3, true);

                        // Get the current play position (divide by two because we are using 16 bit samples)
                        int tmp = this.soundBuffer.PlayPosition / 2;

                        // Generate new sounds from lastWritten to tmp in the sound buffer
                        if (tmp == lastWritten) {
                            continue;
                        } else {
                            soundData = new short[(tmp - lastWritten + bufferLength) % bufferLength];
                        }

                        this.pullAudio(soundData, soundData.Length);

                        // Write in the generated data
                        soundBuffer.Write(lastWritten * 2, soundData, LockFlag.None);

                        // Save the position we were at
                        lastWritten = tmp;
                    }
                }
            }

            public void Dispose()
            {
                this.running = false;
                this.Resume();

                if (this.soundBuffer != null) {
                    this.soundBuffer.Dispose();
                }
                if (this.soundDevice != null) {
                    this.soundDevice.Dispose();
                }
            }
        }
    }
}

die Klasse hab ich bei mir im Projeject eingebunden und ich hab 1. einen fehler, wo er die Notification Events setzt. Bei
Code:
posNotify[0].EventNotifyHandle = fillEvent[0].SafeWaitHandle;
sollen das unterschiedliche typen sein.
Naja das hab ich erstmal auskommentiert.

Die eigentliche Frage ist wie ruf ich die Klasse denn auf das der mal nen ton von sich gibt :D
 

Neue Beiträge

Zurück