示例#1
0
 public LoopbackRecorder()
 {
     _outputStream             = new IgnoreDisposeStream(new MemoryStream());
     _waveIn                   = new WasapiLoopbackCapture();
     _waveIn.DataAvailable    += OnDataAvailable;
     _waveIn.RecordingStopped += OnRecordingStopped;
     _writer                   = new WaveFileWriter(_outputStream, _waveIn.WaveFormat);
 }
示例#2
0
        public void StartRecording()
        {
            // If we are currently record then go ahead and exit out.
            if (_isRecording == true)
            {
                return;
            }

            _outputStream             = new IgnoreDisposeStream(new MemoryStream());
            _waveIn                   = new WasapiLoopbackCapture();
            _writer                   = new WaveFileWriter(_outputStream, _waveIn.WaveFormat);
            _waveIn.DataAvailable    += OnDataAvailable;
            _waveIn.RecordingStopped += OnRecordingStopped;
            _waveIn.StartRecording();
            _isRecording = true;
        }
        private static void EnsureLength(Pattern pattern, int msPerBeat, WaveMixerStream32 finalMixer, StreamTracker streamTracker)
        {
            int avgBytesPerMs = finalMixer.WaveFormat.AverageBytesPerSecond / 1000;
            int beatArrayLen  = avgBytesPerMs * msPerBeat;
            var silence       = new byte[beatArrayLen];
            var mem           = new IgnoreDisposeStream(new MemoryStream());

            streamTracker.AddStream(mem);

            using (var writer = new WaveFileWriter(mem, finalMixer.WaveFormat))
            {
                for (int i = 0; i < pattern.NumberOfBeats; ++i)
                {
                    writer.Write(silence, 0, silence.Length);
                    writer.Flush();
                }
            }

            mem.Position = 0;

            var rdr = new WaveFileReader(mem);

            finalMixer.AddInputStream(rdr);
        }
        private static void AddInstrumentStreamsToMixer(Pattern pattern, int bpm, WaveMixerStream32 finalMixer, StreamTracker streamTracker)
        {
            double minutesPerBeat = 1d / (double)bpm;
            int    msPerBeat      = (int)(minutesPerBeat * 60d * 1000d);

            foreach (var instrument in pattern.Instruments)
            {
                var audio = GetIeeeFloatWaveBytes(instrument, out int audioLen, out WaveFormat format);

                int avgBytesPerMs = format.AverageBytesPerSecond / 1000;
                int beatArrayLen  = avgBytesPerMs * msPerBeat;

                var instrumentMixer = new WaveMixerStream32();
                streamTracker.AddStream(instrumentMixer);

                int i = 0;

                var silence = new byte[beatArrayLen];

                foreach (var beat in instrument.Beats)
                {
                    if (beat.IsEnabled)
                    {
                        var mem = new IgnoreDisposeStream(new MemoryStream());
                        streamTracker.AddStream(mem);

                        using (var writer = new WaveFileWriter(mem, format))
                        {
                            // for each beat of the instrument after the first, pad the stream with silence before the beat position, eg:
                            // beat
                            // silence | beat
                            // silence | silence | beat
                            // etc., then mix all the streams together
                            for (int j = 0; j < i; ++j)
                            {
                                writer.Write(silence, 0, silence.Length);
                            }

                            writer.Write(audio, 0, audioLen);
                            writer.Flush();
                        }

                        mem.Position = 0;

                        instrumentMixer.AddInputStream(new WaveFileReader(mem));
                    }

                    ++i;
                }

                var instrumentStream = new IgnoreDisposeStream(new MemoryStream());
                streamTracker.AddStream(instrumentStream);

                WaveFileWriter.WriteWavFileToStream(instrumentStream, instrumentMixer);

                instrumentStream.Position = 0;

                var instrumentReader = new WaveFileReader(instrumentStream);

                finalMixer.AddInputStream(instrumentReader);
            }

            EnsureLength(pattern, msPerBeat, finalMixer, streamTracker);
        }