public float[][] GetWaveData() { int numchannels = 0; int dummy = 0; FMOD.SOUND_FORMAT dummyformat = FMOD.SOUND_FORMAT.NONE; FMOD.DSP_RESAMPLER dummyresampler = FMOD.DSP_RESAMPLER.LINEAR; int count = 0; const int WAVEDATASIZE = 512; system.getSoftwareFormat(ref dummy, ref dummyformat, ref numchannels, ref dummy, ref dummyresampler, ref dummy); float[][] wavedata = new float[numchannels][]; /* * DRAW WAVEDATA */ for (count = 0; count < numchannels; count++) { wavedata[count] = new float[WAVEDATASIZE]; if (currentChannel != null) { currentChannel.getWaveData(wavedata[count], WAVEDATASIZE, count); } } return(wavedata); }
private void drawOscilliscope(Graphics g) { int numchannels = 0; int dummy = 0; FMOD.SOUND_FORMAT dummyformat = FMOD.SOUND_FORMAT.NONE; FMOD.DSP_RESAMPLER dummyresampler = FMOD.DSP_RESAMPLER.LINEAR; int count = 0; int count2 = 0; system.getSoftwareFormat(ref dummy, ref dummyformat, ref numchannels, ref dummy, ref dummyresampler, ref dummy); /* * DRAW WAVEDATA */ for (count = 0; count < numchannels; count++) { system.getWaveData(wavedata, WAVEDATASIZE, count); for (count2 = 0; count2 < WAVEDATASIZE - 1; count2++) { float y; y = (wavedata[count2] + 1) / 2.0f * GRAPHICWINDOW_HEIGHT; g.FillRectangle(mBrushWhite, count2 + GRAPHICWINDOW_WIDTH - WAVEDATASIZE - 10.0f, y, 1.0f, 1.0f); } } }
private void drawSpectrum(Graphics g) { int numchannels = 0; int dummy = 0; FMOD.SOUND_FORMAT dummyformat = FMOD.SOUND_FORMAT.NONE; FMOD.DSP_RESAMPLER dummyresampler = FMOD.DSP_RESAMPLER.LINEAR; int count = 0; int count2 = 0; system.getSoftwareFormat(ref dummy, ref dummyformat, ref numchannels, ref dummy, ref dummyresampler, ref dummy); /* * DRAW SPECTRUM */ for (count = 0; count < numchannels; count++) { float max = 0; system.getSpectrum(spectrum, SPECTRUMSIZE, count, FMOD.DSP_FFT_WINDOW.TRIANGLE); for (count2 = 0; count2 < 255; count2++) { if (max < spectrum[count2]) { max = spectrum[count2]; } } /* * The upper band of frequencies at 44khz is pretty boring (ie 11-22khz), so we are only * going to display the first 256 frequencies, or (0-11khz) */ for (count2 = 0; count2 < 255; count2++) { float height; height = spectrum[count2] / max * GRAPHICWINDOW_HEIGHT; if (height >= GRAPHICWINDOW_HEIGHT) { height = GRAPHICWINDOW_HEIGHT - 1; } if (height < 0) { height = 0; } height = GRAPHICWINDOW_HEIGHT - height; g.FillRectangle(mBrushGreen, count2, height, 1.0f, GRAPHICWINDOW_HEIGHT - height); } } }
private void JingleInit(string filename) { FMOD.Sound tempSound = null; thisLock = new Object(); // Retrieve information about sound FMOD.RESULT result = system.createSound(filename, (FMOD.MODE._2D | FMOD.MODE.SOFTWARE), ref tempSound); ErrorCheck(result); FMOD.SOUND_TYPE soundType = (FMOD.SOUND_TYPE) 0; FMOD.SOUND_FORMAT soundFormat = (FMOD.SOUND_FORMAT) 0; int tempBits = 0, tempChannels = 0, tempPriority = 0; uint tempPcm = 0; float tempFrequency = 0.0f, tempPan = 0.0f, tempVolume = 0.0f; result = tempSound.getFormat(ref soundType, ref soundFormat, ref tempChannels, ref tempBits); ErrorCheck(result); result = tempSound.getDefaults(ref tempFrequency, ref tempVolume, ref tempPan, ref tempPriority); ErrorCheck(result); result = tempSound.getLength(ref tempPcm, FMOD.TIMEUNIT.PCM); ErrorCheck(result); // Fill sound parameters ChannelCount = tempChannels; Frequency = (int)tempFrequency; pcm = tempPcm; bits = tempBits; // Obtain Raw PCM data from sound GetRawData(tempSound, tempChannels, tempBits, tempPcm); // Release temp sound instance tempSound.release(); tempSound = null; FMOD.CREATESOUNDEXINFO exInfo = new FMOD.CREATESOUNDEXINFO(); exInfo.cbsize = Marshal.SizeOf(exInfo); exInfo.length = (uint)(pcm * sizeof(short)); exInfo.numchannels = ChannelCount; exInfo.format = FMOD.SOUND_FORMAT.PCM16; exInfo.defaultfrequency = (int)Frequency; // Create a stream from obtained data result = system.createStream(SoundDataBuffer.Buffer, (FMOD.MODE.OPENMEMORY | FMOD.MODE.OPENRAW), ref exInfo, ref sounds); ErrorCheck(result); } // loading jingle
private void comboBoxRecord_SelectedIndexChanged(object sender, System.EventArgs e) { FMOD.CREATESOUNDEXINFO exinfo = new FMOD.CREATESOUNDEXINFO(); FMOD.RESULT result; FMOD.DSP_RESAMPLER resampler = FMOD.DSP_RESAMPLER.MAX; int selected = comboBoxRecord.SelectedIndex; int temp = 0; FMOD.SOUND_FORMAT format = FMOD.SOUND_FORMAT.NONE; result = system.setSoftwareFormat(OUTPUTRATE, FMOD.SOUND_FORMAT.PCM16, 1, 0, 0); ERRCHECK(result); result = system.init(32, FMOD.INITFLAGS.NORMAL, (IntPtr)null); ERRCHECK(result); result = system.getSoftwareFormat(ref outputfreq, ref format, ref temp, ref temp, ref resampler, ref temp); ERRCHECK(result); /* * Create a sound to record to. */ exinfo.cbsize = Marshal.SizeOf(exinfo); exinfo.numchannels = 1; exinfo.format = FMOD.SOUND_FORMAT.PCM16; exinfo.defaultfrequency = OUTPUTRATE; exinfo.length = (uint)(exinfo.defaultfrequency * 2 * exinfo.numchannels * 5); result = system.createSound((string)null, (FMOD.MODE._2D | FMOD.MODE.SOFTWARE | FMOD.MODE.LOOP_NORMAL | FMOD.MODE.OPENUSER), ref exinfo, ref sound); ERRCHECK(result); comboBoxOutput.Enabled = false; comboBoxPlayback.Enabled = false; comboBoxRecord.Enabled = false; /* * Start recording */ result = system.recordStart(selected, sound, true); ERRCHECK(result); Thread.Sleep(200); /* Give it some time to record something */ result = system.playSound(FMOD.CHANNELINDEX.REUSE, sound, false, ref channel); ERRCHECK(result); /* Dont hear what is being recorded otherwise it will feedback. Spectrum analysis is done before volume scaling in the DSP chain */ result = channel.setVolume(0); ERRCHECK(result); }
/// <summary> /// Run through each of the frequency bands and record the data /// for the current pont in time in the audio track /// </summary> private void GetSpectrumData(uint period) { // int num = 0; // int num2 = 0; int sampleRate = 0; int numOutputChannels = 0; int maxInputChannels = 0; int numBits = 0; FMOD.SOUND_FORMAT sOUND_FORMAT = FMOD.SOUND_FORMAT.NONE; FMOD.DSP_RESAMPLER dSP_RESAMPLER = FMOD.DSP_RESAMPLER.LINEAR; m_FMOD_system.getSoftwareFormat(ref sampleRate /* num2 */, ref sOUND_FORMAT, ref numOutputChannels /* num */, ref maxInputChannels /* num2 */, ref dSP_RESAMPLER, ref numBits /* num2 */); // for each of the output channels for (int currentChannel = 0; currentChannel < numOutputChannels; currentChannel++) { // get the spectrum data for this channel m_FMOD_system.getSpectrum(m_FMOD_spectrum, 512, currentChannel, FMOD.DSP_FFT_WINDOW.TRIANGLE); // update each frequency band for this period foreach (var currentFrequencyBand in m_mapOfFrequencyBands) { // this is a magic number that I have not yet tracked down. float currentLevel = 0f; for (int j = currentFrequencyBand.Value.FmodLowFrequency; j < currentFrequencyBand.Value.FmodHighFrequency; j++) { // find the highest value available to this band currentLevel = Math.Max(currentLevel, m_FMOD_spectrum[j]); } currentFrequencyBand.Value.add(period, currentLevel); } // end process each frequency band } // end process each channel } // GetSpectrumData
private void timer_Tick(object sender, System.EventArgs e) { FMOD.RESULT result; FMOD.OPENSTATE openstate = 0; if (soundcreated) { uint percentbuffered = 0; bool starving = false; bool busy = false; result = sound.getOpenState(ref openstate, ref percentbuffered, ref starving, ref busy); ERRCHECK(result); if (openstate == FMOD.OPENSTATE.READY && channel == null) { result = system.playSound(FMOD.CHANNELINDEX.FREE, sound, false, ref channel); ERRCHECK(result); } } if (channel != null) { uint ms = 0; bool playing = false; bool paused = false; int tagsupdated = 0; int numtags = 0; result = sound.getNumTags(ref numtags, ref tagsupdated); ERRCHECK(result); if (tagsupdated != 0) { for (;;) { FMOD.TAG tag = new FMOD.TAG(); if (sound.getTag(null, -1, ref tag) != FMOD.RESULT.OK) { break; } if (tag.datatype == FMOD.TAGDATATYPE.STRING) { FMOD.SOUND_FORMAT format = FMOD.SOUND_FORMAT.NONE; int channels = 0; int bits = 0; sound.getFormat(ref gSoundType, ref format, ref channels, ref bits); if (tag.name == "ARTIST") { if (Marshal.PtrToStringAnsi(tag.data) != gCurrentTrackArtist) { gCurrentTrackArtist = Marshal.PtrToStringAnsi(tag.data); gUpdateFileName = true; } } if (tag.name == "TITLE") { if (Marshal.PtrToStringAnsi(tag.data) != gCurrentTrackTitle) { gCurrentTrackTitle = Marshal.PtrToStringAnsi(tag.data); gUpdateFileName = true; } } break; } else { break; } } } result = channel.isPlaying(ref playing); if (result != FMOD.RESULT.OK || !playing) { sound.release(); sound = null; channel = null; } else { result = channel.getPaused(ref paused); ERRCHECK(result); result = channel.getPosition(ref ms, FMOD.TIMEUNIT.MS); ERRCHECK(result); statusBar.Text = "Time " + (ms / 1000 / 60) + ":" + (ms / 1000 % 60) + ":" + (ms / 10 % 100) + (paused ? " Paused " : playing ? " Playing" : " Stopped"); } } if (sound != null) { uint percentbuffered = 0; bool starving = false; bool busy = false; sound.getOpenState(ref openstate, ref percentbuffered, ref starving, ref busy); if (openstate == FMOD.OPENSTATE.ERROR) { sound.release(); sound = null; channel = null; } } if (openstate == FMOD.OPENSTATE.ERROR) { statusBar.Text = "Error occurred or stream ended. Restarting stream.."; result = system.createSound(url, (FMOD.MODE.HARDWARE | FMOD.MODE._2D | FMOD.MODE.CREATESTREAM | FMOD.MODE.NONBLOCKING), ref exinfo, ref sound); ERRCHECK(result); } if (system != null) { system.update(); } }
public bool Create(SoundSystemConfig config) { uint version = 0; int samplerate = 44100; FMOD.SOUND_FORMAT format = FMOD.SOUND_FORMAT.PCM16; FMOD.RESULT result = FMOD.Factory.System_Create(ref m_system); if (ERRCHECK(result, "Create") == false) { return(false); } result = m_system.getVersion(ref version); if (!ERRCHECK(result)) { return(false); } if (version < FMOD.VERSION.number) { Console.WriteLine("INCORRECT DLL VERSION!!", "FMOD ERROR"); return(false); } result = m_system.setDriver(config.SoundCard); ERRCHECK(result); switch (config.Output) { case RASOUNDAUSGABE.WINMM: m_system.setOutput(FMOD.OUTPUTTYPE.WINMM); break; case RASOUNDAUSGABE.WASAPI: m_system.setOutput(FMOD.OUTPUTTYPE.WASAPI); break; case RASOUNDAUSGABE.DSOUND: m_system.setOutput(FMOD.OUTPUTTYPE.DSOUND); break; case RASOUNDAUSGABE.ASIO: m_system.setOutput(FMOD.OUTPUTTYPE.ASIO); break; } ; switch (config.Format) { case RASOUNDFORMAT.PCM16_44100: samplerate = 44100; format = FMOD.SOUND_FORMAT.PCM16; break; case RASOUNDFORMAT.PCM16_48000: samplerate = 48000; format = FMOD.SOUND_FORMAT.PCM16; break; case RASOUNDFORMAT.PCM16_96000: samplerate = 96000; format = FMOD.SOUND_FORMAT.PCM16; break; case RASOUNDFORMAT.PCM24_44100: samplerate = 44100; format = FMOD.SOUND_FORMAT.PCM24; break; case RASOUNDFORMAT.PCM24_48000: samplerate = 48000; format = FMOD.SOUND_FORMAT.PCM24; break; case RASOUNDFORMAT.PCM24_96000: samplerate = 96000; format = FMOD.SOUND_FORMAT.PCM24; break; case RASOUNDFORMAT.PCM24_192000: samplerate = 192000; format = FMOD.SOUND_FORMAT.PCM24; break; case RASOUNDFORMAT.PCMFLOAT_44100: samplerate = 44100; format = FMOD.SOUND_FORMAT.PCMFLOAT; break; case RASOUNDFORMAT.PCMFLOAT_48000: samplerate = 48000; format = FMOD.SOUND_FORMAT.PCMFLOAT; break; case RASOUNDFORMAT.PCMFLOAT_96000: samplerate = 96000; format = FMOD.SOUND_FORMAT.PCMFLOAT; break; case RASOUNDFORMAT.PCMFLOAT_192000: samplerate = 192000; format = FMOD.SOUND_FORMAT.PCMFLOAT; break; case RASOUNDFORMAT.PCM32_44100: samplerate = 44100; format = FMOD.SOUND_FORMAT.PCM32; break; case RASOUNDFORMAT.PCM32_48000: samplerate = 48000; format = FMOD.SOUND_FORMAT.PCM32; break; case RASOUNDFORMAT.PCM32_96000: samplerate = 96000; format = FMOD.SOUND_FORMAT.PCM32; break; case RASOUNDFORMAT.PCM32_192000: samplerate = 192000; format = FMOD.SOUND_FORMAT.PCM32; break; } m_system.setSoftwareFormat(samplerate, format, 0, 0, FMOD.DSP_RESAMPLER.LINEAR); switch (config.Channel) { case RACHANNELMODE.Mono: result = m_system.setSpeakerMode(FMOD.SPEAKERMODE.MONO); break; case RACHANNELMODE.Stereo: result = m_system.setSpeakerMode(FMOD.SPEAKERMODE.STEREO); break; case RACHANNELMODE.Quad: result = m_system.setSpeakerMode(FMOD.SPEAKERMODE.QUAD); break; case RACHANNELMODE.FiveDotOne: result = m_system.setSpeakerMode(FMOD.SPEAKERMODE._5POINT1); break; case RACHANNELMODE.SevenDotOne: result = m_system.setSpeakerMode(FMOD.SPEAKERMODE._7POINT1); break; case RACHANNELMODE.Surround: result = m_system.setSpeakerMode(FMOD.SPEAKERMODE.SURROUND); break; } ; result = m_system.init(32, FMOD.INITFLAGS._3D_RIGHTHANDED | FMOD.INITFLAGS.DTS_NEURALSURROUND, IntPtr.Zero); if (!ERRCHECK(result)) { return(false); } m_system.set3DSettings(1.0f, 1.0f, 1.0f); Console.WriteLine("[FMOD] SoundSystem created"); m_system.get3DListenerAttributes(0, ref pos, ref vel, ref forward, ref up); return(true); }
public static void WriteWavHeader(FileStream stream, FMOD.Sound sound, int length, Object usingFmod) { FMOD.SOUND_TYPE type = FMOD.SOUND_TYPE.UNKNOWN; FMOD.SOUND_FORMAT format = FMOD.SOUND_FORMAT.NONE; int channels = 0, bits = 0, temp1 = 0; float rate = 0.0f; float temp = 0.0f; if (sound == null) { return; } lock (usingFmod) { sound.getFormat(ref type, ref format, ref channels, ref bits); sound.getDefaults(ref rate, ref temp, ref temp, ref temp1); } log.Info("WaveWriter.WriteWavHeader: sound format: dataLength " + length + ", type " + type + ", format " + format + ", channels " + channels + ", bits " + bits + ", rate " + rate); stream.Seek(0, SeekOrigin.Begin); FmtChunk fmtChunk = new FmtChunk(); DataChunk dataChunk = new DataChunk(); WavHeader wavHeader = new WavHeader(); RiffChunk riffChunk = new RiffChunk(); fmtChunk.chunk = new RiffChunk(); fmtChunk.chunk.id = new char[4]; fmtChunk.chunk.id[0] = 'f'; fmtChunk.chunk.id[1] = 'm'; fmtChunk.chunk.id[2] = 't'; fmtChunk.chunk.id[3] = ' '; fmtChunk.chunk.size = Marshal.SizeOf(fmtChunk) - Marshal.SizeOf(riffChunk); fmtChunk.wFormatTag = 1; fmtChunk.nChannels = (ushort)channels; fmtChunk.nSamplesPerSec = (uint)rate; fmtChunk.nAvgBytesPerSec = (uint)(rate * channels * bits / 8); fmtChunk.nBlockAlign = (ushort)(1 * channels * bits / 8); fmtChunk.wBitsPerSample = (ushort)bits; dataChunk.chunk = new RiffChunk(); dataChunk.chunk.id = new char[4]; dataChunk.chunk.id[0] = 'd'; dataChunk.chunk.id[1] = 'a'; dataChunk.chunk.id[2] = 't'; dataChunk.chunk.id[3] = 'a'; dataChunk.chunk.size = (int)length; wavHeader.chunk = new RiffChunk(); wavHeader.chunk.id = new char[4]; wavHeader.chunk.id[0] = 'R'; wavHeader.chunk.id[1] = 'I'; wavHeader.chunk.id[2] = 'F'; wavHeader.chunk.id[3] = 'F'; wavHeader.chunk.size = (int)(Marshal.SizeOf(fmtChunk) + Marshal.SizeOf(riffChunk) + length); wavHeader.rifftype = new char[4]; wavHeader.rifftype[0] = 'W'; wavHeader.rifftype[1] = 'A'; wavHeader.rifftype[2] = 'V'; wavHeader.rifftype[3] = 'E'; /* * Write out the WAV header. */ IntPtr wavHeaderPtr = Marshal.AllocHGlobal(Marshal.SizeOf(wavHeader)); IntPtr fmtChunkPtr = Marshal.AllocHGlobal(Marshal.SizeOf(fmtChunk)); IntPtr dataChunkPtr = Marshal.AllocHGlobal(Marshal.SizeOf(dataChunk)); byte [] wavHeaderBytes = new byte[Marshal.SizeOf(wavHeader)]; byte [] fmtChunkBytes = new byte[Marshal.SizeOf(fmtChunk)]; byte [] dataChunkBytes = new byte[Marshal.SizeOf(dataChunk)]; Marshal.StructureToPtr(wavHeader, wavHeaderPtr, false); Marshal.Copy(wavHeaderPtr, wavHeaderBytes, 0, Marshal.SizeOf(wavHeader)); Marshal.StructureToPtr(fmtChunk, fmtChunkPtr, false); Marshal.Copy(fmtChunkPtr, fmtChunkBytes, 0, Marshal.SizeOf(fmtChunk)); Marshal.StructureToPtr(dataChunk, dataChunkPtr, false); Marshal.Copy(dataChunkPtr, dataChunkBytes, 0, Marshal.SizeOf(dataChunk)); stream.Write(wavHeaderBytes, 0, Marshal.SizeOf(wavHeader)); stream.Write(fmtChunkBytes, 0, Marshal.SizeOf(fmtChunk)); stream.Write(dataChunkBytes, 0, Marshal.SizeOf(dataChunk)); }
private void SaveToWav() { FileStream fs = null; int channels = 0, bits = 0; float rate = 0; IntPtr ptr1 = new IntPtr(), ptr2 = new IntPtr(); uint lenbytes = 0, len1 = 0, len2 = 0; FMOD.SOUND_TYPE type = FMOD.SOUND_TYPE.WAV; FMOD.SOUND_FORMAT format = FMOD.SOUND_FORMAT.NONE; int temp1 = 0; float temp3 = 0; if (sound == null) { return; } sound.getFormat(ref type, ref format, ref channels, ref bits); sound.getDefaults(ref rate, ref temp3, ref temp3, ref temp1); sound.getLength(ref lenbytes, FMOD.TIMEUNIT.PCMBYTES); FmtChunk fmtChunk = new FmtChunk(); DataChunk dataChunk = new DataChunk(); WavHeader wavHeader = new WavHeader(); RiffChunk riffChunk = new RiffChunk(); fmtChunk.chunk = new RiffChunk(); fmtChunk.chunk.id = new char[4]; fmtChunk.chunk.id[0] = 'f'; fmtChunk.chunk.id[1] = 'm'; fmtChunk.chunk.id[2] = 't'; fmtChunk.chunk.id[3] = ' '; fmtChunk.chunk.size = Marshal.SizeOf(fmtChunk) - Marshal.SizeOf(riffChunk); fmtChunk.wFormatTag = 1; fmtChunk.nChannels = (ushort)channels; fmtChunk.nSamplesPerSec = (uint)rate; fmtChunk.nAvgBytesPerSec = (uint)(rate * channels * bits / 8); fmtChunk.nBlockAlign = (ushort)(1 * channels * bits / 8); fmtChunk.wBitsPerSample = (ushort)bits; dataChunk.chunk = new RiffChunk(); dataChunk.chunk.id = new char[4]; dataChunk.chunk.id[0] = 'd'; dataChunk.chunk.id[1] = 'a'; dataChunk.chunk.id[2] = 't'; dataChunk.chunk.id[3] = 'a'; dataChunk.chunk.size = (int)lenbytes; wavHeader.chunk = new RiffChunk(); wavHeader.chunk.id = new char[4]; wavHeader.chunk.id[0] = 'R'; wavHeader.chunk.id[1] = 'I'; wavHeader.chunk.id[2] = 'F'; wavHeader.chunk.id[3] = 'F'; wavHeader.chunk.size = (int)(Marshal.SizeOf(fmtChunk) + Marshal.SizeOf(riffChunk) + lenbytes); wavHeader.rifftype = new char[4]; wavHeader.rifftype[0] = 'W'; wavHeader.rifftype[1] = 'A'; wavHeader.rifftype[2] = 'V'; wavHeader.rifftype[3] = 'E'; fs = new FileStream("record.wav", FileMode.Create, FileAccess.Write); /* * Write out the WAV header. */ IntPtr wavHeaderPtr = Marshal.AllocHGlobal(Marshal.SizeOf(wavHeader)); IntPtr fmtChunkPtr = Marshal.AllocHGlobal(Marshal.SizeOf(fmtChunk)); IntPtr dataChunkPtr = Marshal.AllocHGlobal(Marshal.SizeOf(dataChunk)); byte [] wavHeaderBytes = new byte[Marshal.SizeOf(wavHeader)]; byte [] fmtChunkBytes = new byte[Marshal.SizeOf(fmtChunk)]; byte [] dataChunkBytes = new byte[Marshal.SizeOf(dataChunk)]; Marshal.StructureToPtr(wavHeader, wavHeaderPtr, false); Marshal.Copy(wavHeaderPtr, wavHeaderBytes, 0, Marshal.SizeOf(wavHeader)); Marshal.StructureToPtr(fmtChunk, fmtChunkPtr, false); Marshal.Copy(fmtChunkPtr, fmtChunkBytes, 0, Marshal.SizeOf(fmtChunk)); Marshal.StructureToPtr(dataChunk, dataChunkPtr, false); Marshal.Copy(dataChunkPtr, dataChunkBytes, 0, Marshal.SizeOf(dataChunk)); fs.Write(wavHeaderBytes, 0, Marshal.SizeOf(wavHeader)); fs.Write(fmtChunkBytes, 0, Marshal.SizeOf(fmtChunk)); fs.Write(dataChunkBytes, 0, Marshal.SizeOf(dataChunk)); /* * Lock the sound to get access to the raw data. */ sound.@lock(0, lenbytes, ref ptr1, ref ptr2, ref len1, ref len2); /* * Write it to disk. */ byte [] rawdata = new byte[len1]; Marshal.Copy(ptr1, rawdata, 0, (int)len1); fs.Write(rawdata, 0, (int)len1); /* * Unlock the sound to allow FMOD to use it again. */ sound.unlock(ptr1, ptr2, len1, len2); fs.Close(); MessageBox.Show("Written to record.wav"); }
public float[][] GetSpectrum() { system.update(); int numchannels = 0; int dummy = 0; FMOD.SOUND_FORMAT dummyformat = FMOD.SOUND_FORMAT.NONE; FMOD.DSP_RESAMPLER dummyresampler = FMOD.DSP_RESAMPLER.LINEAR; int count = 0; int count2 = 0; system.getSoftwareFormat(ref dummy, ref dummyformat, ref numchannels, ref dummy, ref dummyresampler, ref dummy); float[][] spectrum = new float[numchannels][]; /* * DRAW SPECTRUM */ for (count = 0; count < numchannels; count++) { float max = 0; spectrum[count] = new float[SPECTRUMSIZE]; if (currentChannel != null) { currentChannel.getSpectrum(spectrum[count], SPECTRUMSIZE, count, FMOD.DSP_FFT_WINDOW.HAMMING); /*for (count2 = 0; count2 < SPECTRUMSIZE; count2++) * { * if (max < spectrum[count][count2]) * { * max = spectrum[count][count2]; * } * }*/ // Sonst sieht man nicht viel... max = 0.2F; for (count2 = 0; count2 < SPECTRUMSIZE; count2++) { float height; height = spectrum[count][count2] / max; if (height >= 1) { height = 1; } if (height < 0) { height = 0; } spectrum[count][count2] = height; } } } return(spectrum); }