private void Form1_Load(object sender, EventArgs e) { // WaveOut を初期化する。 waveOut = new WaveOut(WaveOut.WaveMapper, 44100, 16, 2); // WaveOutの状態を気にしつつ、データを出力するためのタイマー timer1.Interval = 10; timer1.Tick += new EventHandler(delegate(object sender_, EventArgs e_) { Feed(); }); // 自動ループ機能を使ってOggVorbisデコーダを初期化する。引数の単位は頭からのサンプル数。 // Oggファイルをそのまま聴くとフェードアウトになってるんですが、ゲーム中は切れ目なくループ再生したいわけで。 // ループの先頭と末尾の位置は、Wave編集ソフトとかで開いて波形を見て決める。 // ループしたい場所のなるべく近くで、左右チャンネルとも音量がほぼ0になっているタイミングを見つけて指定。 // ループ位置を繋いだときに波形がジャンプしているとクリックノイズがのってしまう。 // 100サンプル程度前後しても、その程度の音飛び・リズム狂いに気づける人はほとんどいないはずなので、 // つなぎ目の音量優先で位置を決めましょう。 waveStream = new OggDecodeStream(File.OpenRead("SampleBGM.ogg"), 251000, 815518); }
public void SetBGM(string name) { try { bool flag = false; if (File.Exists("mod/music/" + name.ToString() + ".txt")) { StreamReader streamReader = new StreamReader("mod/music/" + name.ToString() + ".txt", Encoding.GetEncoding("Shift_JIS")); List <byte> byteList = new List <byte>(); string[] strArray = new string[0]; string str; while ((str = streamReader.ReadLine()) != null) { strArray = str.Split(','); } try { this.waveStream = new OggDecodeStream(File.OpenRead("mod/music/" + strArray[2]), int.Parse(strArray[0]), int.Parse(strArray[1])); flag = true; } catch { flag = false; } } if (!flag) { string path = "music/" + name.ToString() + ".ogg"; string str = name.ToString() + ".ogg"; this.waveStream = new OggDecodeStream(File.OpenRead(path), this.musiclength[0, this.musicNames.IndexOf(str)], this.musiclength[1, this.musicNames.IndexOf(str)]); } } catch { } GC.Collect(); }
/* * public void Deafen(double time) * { * if (DeafenTime == 0.0 && time < 2.0) * { * time = 2.0; * } * DeafenTime = time; * } * * public double DeafenTime = 0.0; * * public double TimeDeaf = 0.0; */ /// <summary> /// Loads a VOrbis sound. /// </summary> /// <param name="stream">The stream.</param> /// <param name="name">The name.</param> /// <returns>The sound effect.</returns> public SoundEffect LoadVorbisSound(System.IO.Stream stream, string name) { OggDecodeStream oggds = new OggDecodeStream(stream); return(LoadSound(new DataStream(oggds.decodedStream.ToArray()), name)); }
/// <summary> /// Test /// </summary> static void Test_PlayWithSATools() { string audioFileName = "./test.ogg"; string dspPluginDllName = "dsp_stereo_tool.dll"; // Load plugin var ProgramFilesPath = Environment.GetFolderPath(Environment.SpecialFolder.ProgramFiles); var pluginDllPath = Path.Combine(ProgramFilesPath, "Winamp/Plugins/" + dspPluginDllName); Console.WriteLine("Loading: " + pluginDllPath); DSPPlugin dsp = DSPPluginLoader.LoadDSPPlugin(pluginDllPath, IntPtr.Zero); if (dsp == null || dsp.Modules == null || dsp.Modules.Count == 0) { Console.WriteLine(" - Error on LoadDSPPlugin(...)"); return; } DSPModule mod = dsp.Modules[0]; Console.WriteLine(" + Plug-in: " + dsp.Description); Console.WriteLine(" + Header version: " + dsp.DspHeaderVersion); Console.WriteLine(" + Module: " + mod.Description); // Initialize Plugin int initResult = mod.Init(); if (initResult != 0) { Console.WriteLine(" - Error on mod.Init(...)"); return; } using (OggDecodeStream waveStream = new OggDecodeStream(File.OpenRead(audioFileName))) using (WaveOut waveOut = new WaveOut(-1, waveStream.SamplesPerSecond, waveStream.BitsPerSample, waveStream.Channels)) { var bytesPerSample = waveStream.BitsPerSample / 8 * waveStream.Channels; // Create waveform buffer (and get pinned pointer) byte[] buffer = new byte[bytesPerSample * 4096]; GCHandle bufferHandle = GCHandle.Alloc(buffer, GCHandleType.Pinned); IntPtr pBuffer = bufferHandle.AddrOfPinnedObject(); while (true) { // read (to half of buffer) int read = waveStream.Read(buffer, 0, buffer.Length / 2); if (read == 0) { break; } // modify by dsp int samplesWritten = mod.ModifySample(pBuffer, read / bytesPerSample, waveStream.BitsPerSample, waveStream.Channels, waveStream.SamplesPerSecond); // write waveOut.Write(buffer, 0, samplesWritten * bytesPerSample); while (waveOut.EnqueuedBufferSize >= buffer.Length * 4) { System.Windows.Forms.Application.DoEvents(); System.Threading.Thread.Sleep(1); } } // release buffer pBuffer = IntPtr.Zero; bufferHandle.Free(); } mod.Quit(); dsp.Release(); }