2009-07-05 6 views
7

मैं अपने .NET प्रोग्राम उपयोगकर्ता इनपुट और गणितीय कार्यों से उत्पन्न होने वाले तरंग डेटा के आधार पर ध्वनि कैसे चला सकता हूं?जेनरेट किए गए तरंग डेटा का उपयोग कर .NET में ध्वनि चलाएं

"तरंग डेटा" से मेरा मतलब एक निश्चित अंतराल समय श्रृंखला (शायद 44.1 केएचजेड) में एसपीएल (ध्वनि दबाव स्तर) मान है। मुझे लगता है कि इसे किसी प्रकार की स्ट्रीमिंग बफर व्यवस्था की आवश्यकता है।

नोट, कि यह लाइव/रीयल-टाइम होना चाहिए, इसलिए बस एक .wav फ़ाइल बनाना और फिर खेलना पर्याप्त नहीं होगा। वीबी.नेट को प्राथमिकता दी जाती है, लेकिन सी # भी स्वीकार्य है।

बस स्पष्ट करने के लिए: मैं जो खोज रहा हूं वह एक साधारण कामकाजी कोड उदाहरण है।

+0

मैं अंततः NAudio समाधान की कोशिश करने के लिए मिल गया है, और यह उत्कृष्ट है! मुझे डरने से बहुत बेहतर और आसान, मुझे वास्तव में बहुत पहले कोशिश करनी चाहिए थी। – RBarryYoung

+1

इस प्रश्न का एक अधिक परिचालन उत्तर स्टैक ओवरफ़्लो प्रश्न * में है [[NAudio x # मिलीसेकंड के लिए साइन मिलते हुए सी #] (http://stackoverflow.com/questions/5485577) *। –

उत्तर

4

आप NAudio का उपयोग कर ऐसा कर सकते हैं। आप वेवस्ट्रीम से प्राप्त एक स्ट्रीम बनाते हैं और इसके ओवरडिन में विधि पढ़ें, आप अपने नमूनों को वापस लौटते हैं जिन्हें आप फ्लाई पर उत्पन्न कर सकते हैं। आपके पास ध्वनि कार्ड द्वारा उपयोग किए गए बफर के आकार पर नियंत्रण है जो आपको विलंबता पर नियंत्रण प्रदान करता है।

+0

मुझे अंत में नूडियो का प्रयास करने का मौका मिला और यह उत्कृष्ट है। सूचक के लिए धन्यवाद। – RBarryYoung

0

मुझे लगता है कि इसके लिए आपको DirectSound (DirectX API) का उपयोग करने की आवश्यकता होगी। यह उन बफर को काम करता है जिन्हें आप अपने जेनरेट किए गए डेटा से भर सकते हैं।

शायद this (here तरह से वापस मशीन) की तरह कुछ बाहर में मदद मिलेगी

1

चेक लोड होने की मनमाने ढंग से डेटा के साथ एक DirectSound बफर और यह खेलने पर this thread

प्रति टिप्पणी: हाँ, मुझे पता है। आपको C++ को C# या VB.NET में अनुवाद करने की आवश्यकता होगी। लेकिन, अवधारणा यह महत्वपूर्ण है। आप द्वितीयक डायरेक्टसाउंड बफर बनाते हैं और उसके बाद इसे अपने प्राथमिक बफर और प्ले पर स्ट्रीम करने के लिए उपयोग करते हैं।

+0

ठीक है कि * नहीं * वीबीनेट या सी # है। वास्तव में यह बिल्कुल नहीं दिखता है। बिल्कुल भी। – RBarryYoung

3

How to play from an array of doubles

PlayerEx pl = new PlayerEx(); 

    private static void PlayArray(PlayerEx pl) 
    { 
     double fs = 8000; // sample freq 
     double freq = 1000; // desired tone 
     short[] mySound = new short[4000]; 
     for (int i = 0; i < 4000; i++) 
     { 
      double t = (double)i/fs; // current time 
      mySound[i] = (short)(Math.Cos(t * freq) * (short.MaxValue)); 
     } 
     IntPtr format = AudioCompressionManager.GetPcmFormat(1, 16, (int)fs); 
     pl.OpenPlayer(format); 
     byte[] mySoundByte = new byte[mySound.Length * 2]; 
     Buffer.BlockCopy(mySound, 0, mySoundByte, 0, mySoundByte.Length); 
     pl.AddData(mySoundByte); 
     pl.StartPlay(); 
    } 
0

मैं इस कोड है, लेकिन आपको याद में अपने wav फ़ाइल उत्पन्न करने के लिए कोड है करना होगा।

Option Strict Off 
Option Explicit On 
Imports Microsoft.DirectX.DirectSound 
Imports Microsoft.DirectX 
Imports System.Threading 

Public Class Form1 
Const SRATE As Integer = 44100 
Const FREQ As Integer = 440 
Const DUR As Integer = 1 

Private dsDesc As BufferDescription 
Private wvFormat As WaveFormat 
Private DS As Device 

Dim SecondaryBuffer As Microsoft.DirectX.DirectSound.SecondaryBuffer 
Dim BufferDescription As Microsoft.DirectX.DirectSound.BufferDescription 
Dim DXFormat As Microsoft.DirectX.DirectSound.WaveFormat 
Dim sbuf(DUR * SRATE) As Short 


Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load 
    Show() 
    DS = New Microsoft.DirectX.DirectSound.Device 
    DS.SetCooperativeLevel(Me, CooperativeLevel.Normal) 
    wvFormat.FormatTag = WaveFormatTag.Pcm 
    wvFormat.Channels = 1 
    wvFormat.SamplesPerSecond = SRATE 
    wvFormat.BitsPerSample = 16 
    wvFormat.AverageBytesPerSecond = 2 * SRATE 
    wvFormat.BlockAlign = 2 
    dsDesc = New BufferDescription(wvFormat) 
    dsDesc.BufferBytes = 2 * DUR * SRATE 
    dsDesc.Flags = 0 
    Dim buff1 = PlayWave(400) 
    Dim buff2 = PlayWave(600) 
    buff1 = PlayWave(400) 
    buff1.Play(0, Microsoft.DirectX.DirectSound.BufferPlayFlags.Default) 
    Thread.Sleep(1000) 
    buff1 = PlayWave(600) 
    buff1.Play(0, Microsoft.DirectX.DirectSound.BufferPlayFlags.Default) 
    ' End 
End Sub 
Function PlayWave(FREQ As Integer) As SecondaryBuffer 
    ' create a buffer 
    Dim dsBuffer As SecondaryBuffer 
    dsBuffer = New SecondaryBuffer(dsDesc, DS) 
    Dim sbuf(DUR * SRATE) As Short 
    ' create tone     
    For i As Integer = 0 To DUR * SRATE 
     sbuf(i) = CShort(10000 * Math.Sin(2 * Math.PI * FREQ * i/SRATE)) 
    Next 
    ' copy to buffer 
    dsBuffer.Write(0, sbuf, LockFlag.EntireBuffer) 
    Return dsBuffer 
End Function 
संबंधित मुद्दे