public ActionResult GetMelodicDrill(string doNoteName, int type) { L1C7MelodicDrillType drillType = (L1C7MelodicDrillType)type; MemoryStream wavStream = GetMelodicDrill(doNoteName, drillType); wavStream.WavToMp3File(out string fileName); return(Redirect($"~/Temp/{fileName}")); }
private MemoryStream GetMelodicDrill(string doNoteName, L1C7MelodicDrillType drillType) { double bpm = double.Parse(ConfigurationManager.AppSettings["BPM"]); double quarterNoteMillis = (60 / bpm) * 1000; TimeSpan eighthNoteDuration = TimeSpan.FromMilliseconds(quarterNoteMillis / 2); TimeSpan quarterNoteDuration = TimeSpan.FromMilliseconds(quarterNoteMillis); TimeSpan dottedQuarterNoteDuration = TimeSpan.FromMilliseconds(quarterNoteMillis).Add(eighthNoteDuration); TimeSpan halfNoteDuration = TimeSpan.FromMilliseconds(quarterNoteMillis * 2); TimeSpan halfNoteAndEighthNoteDuration = halfNoteDuration.Add(eighthNoteDuration); TimeSpan wholeNoteDuration = TimeSpan.FromMilliseconds(quarterNoteMillis * 4); string doFileName = NAudioHelper.GetFileNameFromNoteName(doNoteName); doFileName = Path.GetFileName(doFileName); int doNoteNumber = int.Parse(doFileName.Split('.')[0]); ISampleProvider note1, note2, note3, note4 = null; switch (drillType) { // Minor 2nd intervals. case L1C7MelodicDrillType.MiMiFaMiMin2nd: note1 = NAudioHelper.GetSampleProvider(doNoteNumber + Interval.UpMajor3rd, quarterNoteDuration); note2 = NAudioHelper.GetSampleProvider(doNoteNumber + Interval.UpMajor3rd, eighthNoteDuration); note3 = NAudioHelper.GetSampleProvider(doNoteNumber + Interval.UpPerfect4th, halfNoteAndEighthNoteDuration); note4 = NAudioHelper.GetSampleProvider(doNoteNumber + Interval.UpMajor3rd, wholeNoteDuration); break; case L1C7MelodicDrillType.TiDoDoMin2nd: note1 = NAudioHelper.GetSampleProvider(doNoteNumber + Interval.DownMinor2nd, dottedQuarterNoteDuration); note2 = NAudioHelper.GetSampleProvider(doNoteNumber, halfNoteAndEighthNoteDuration); note3 = NAudioHelper.GetSampleProvider(doNoteNumber, wholeNoteDuration); break; case L1C7MelodicDrillType.FaFaMiMiMin2nd: note1 = NAudioHelper.GetSampleProvider(doNoteNumber + Interval.UpPerfect4th, quarterNoteDuration); note2 = NAudioHelper.GetSampleProvider(doNoteNumber + Interval.UpPerfect4th, eighthNoteDuration); note3 = NAudioHelper.GetSampleProvider(doNoteNumber + Interval.UpMajor3rd, halfNoteAndEighthNoteDuration); note4 = NAudioHelper.GetSampleProvider(doNoteNumber + Interval.UpMajor3rd, wholeNoteDuration); break; case L1C7MelodicDrillType.DoTiDoMin2nd: note1 = NAudioHelper.GetSampleProvider(doNoteNumber, dottedQuarterNoteDuration); note2 = NAudioHelper.GetSampleProvider(doNoteNumber + Interval.DownMinor2nd, halfNoteAndEighthNoteDuration); note3 = NAudioHelper.GetSampleProvider(doNoteNumber, wholeNoteDuration); break; // Major 7th intervals. case L1C7MelodicDrillType.DoDoTiDoMaj7th: note1 = NAudioHelper.GetSampleProvider(doNoteNumber, quarterNoteDuration); note2 = NAudioHelper.GetSampleProvider(doNoteNumber, eighthNoteDuration); note3 = NAudioHelper.GetSampleProvider(doNoteNumber + Interval.UpMajor7th, halfNoteAndEighthNoteDuration); note4 = NAudioHelper.GetSampleProvider(doNoteNumber + Interval.UpPerfectOctave, wholeNoteDuration); break; case L1C7MelodicDrillType.FaMiMiMaj7th: note1 = NAudioHelper.GetSampleProvider(doNoteNumber + Interval.UpPerfect4th, dottedQuarterNoteDuration); note2 = NAudioHelper.GetSampleProvider(doNoteNumber + Interval.UpMajor10th, halfNoteAndEighthNoteDuration); note3 = NAudioHelper.GetSampleProvider(doNoteNumber + Interval.UpMajor10th, wholeNoteDuration); break; case L1C7MelodicDrillType.TiTiDoDoMaj7th: note1 = NAudioHelper.GetSampleProvider(doNoteNumber + Interval.UpMajor7th, quarterNoteDuration); note2 = NAudioHelper.GetSampleProvider(doNoteNumber + Interval.UpMajor7th, eighthNoteDuration); note3 = NAudioHelper.GetSampleProvider(doNoteNumber, halfNoteAndEighthNoteDuration); note4 = NAudioHelper.GetSampleProvider(doNoteNumber, wholeNoteDuration); break; case L1C7MelodicDrillType.MiFaMiMaj7th: note1 = NAudioHelper.GetSampleProvider(doNoteNumber + Interval.UpMajor10th, dottedQuarterNoteDuration); note2 = NAudioHelper.GetSampleProvider(doNoteNumber + Interval.UpPerfect4th, halfNoteAndEighthNoteDuration); note3 = NAudioHelper.GetSampleProvider(doNoteNumber + Interval.UpMajor3rd, wholeNoteDuration); break; default: throw new NotSupportedException($"L1C7MelodicDrillType '{drillType}' is not supported."); } var phrase = note1 .FollowedBy(note2) .FollowedBy(note3); if (note4 != null) { phrase = phrase.FollowedBy(note4); } var stwp = new SampleToWaveProvider(phrase); MemoryStream wavStream = new MemoryStream(); WaveFileWriter.WriteWavFileToStream(wavStream, stwp); wavStream.Position = 0; return(wavStream); }
private MemoryStream GetMelodicInterval(string doNoteName, L1C7MelodicDrillType drillType) { double bpm = double.Parse(ConfigurationManager.AppSettings["BPM"]); double quarterNoteMillis = (60 / bpm) * 1000; TimeSpan halfNoteDuration = TimeSpan.FromMilliseconds(quarterNoteMillis * 2); string doFileName = NAudioHelper.GetFileNameFromNoteName(doNoteName); doFileName = Path.GetFileName(doFileName); int doNoteNumber = int.Parse(doFileName.Split('.')[0]); ISampleProvider note1, note2; switch (drillType) { #region Minor 2nds / minor 7ths // Minor 2nd intervals. case L1C7MelodicDrillType.MiFa2Asc: note1 = NAudioHelper.GetSampleProvider(doNoteNumber + Interval.UpMajor3rd, halfNoteDuration); note2 = NAudioHelper.GetSampleProvider(doNoteNumber + Interval.UpPerfect4th, halfNoteDuration); break; case L1C7MelodicDrillType.TiDo2Asc: note1 = NAudioHelper.GetSampleProvider(doNoteNumber + Interval.UpMajor7th, halfNoteDuration); note2 = NAudioHelper.GetSampleProvider(doNoteNumber + Interval.UpPerfectOctave, halfNoteDuration); break; case L1C7MelodicDrillType.FaMi2Desc: note1 = NAudioHelper.GetSampleProvider(doNoteNumber + Interval.UpPerfect4th, halfNoteDuration); note2 = NAudioHelper.GetSampleProvider(doNoteNumber + Interval.UpMajor3rd, halfNoteDuration); break; case L1C7MelodicDrillType.DoTi2Desc: note1 = NAudioHelper.GetSampleProvider(doNoteNumber + Interval.UpPerfectOctave, halfNoteDuration); note2 = NAudioHelper.GetSampleProvider(doNoteNumber + Interval.UpMajor7th, halfNoteDuration); break; // Major 7th intervals. case L1C7MelodicDrillType.DoTi7Asc: note1 = NAudioHelper.GetSampleProvider(doNoteNumber, halfNoteDuration); note2 = NAudioHelper.GetSampleProvider(doNoteNumber + Interval.UpMajor7th, halfNoteDuration); break; case L1C7MelodicDrillType.FaMi7Asc: note1 = NAudioHelper.GetSampleProvider(doNoteNumber + Interval.UpPerfect4th, halfNoteDuration); note2 = NAudioHelper.GetSampleProvider(doNoteNumber + Interval.UpMajor10th, halfNoteDuration); break; case L1C7MelodicDrillType.TiDo7Desc: note1 = NAudioHelper.GetSampleProvider(doNoteNumber + Interval.UpMajor7th, halfNoteDuration); note2 = NAudioHelper.GetSampleProvider(doNoteNumber, halfNoteDuration); break; case L1C7MelodicDrillType.MiFa7Desc: note1 = NAudioHelper.GetSampleProvider(doNoteNumber + Interval.UpMajor10th, halfNoteDuration); note2 = NAudioHelper.GetSampleProvider(doNoteNumber + Interval.UpPerfect4th, halfNoteDuration); break; #endregion Major 2nds / min 7ths default: throw new NotSupportedException($"L1C6MelodicDrillType '{drillType}' is not supported."); } var phrase = note1 .FollowedBy(note2); var stwp = new SampleToWaveProvider(phrase); MemoryStream wavStream = new MemoryStream(); WaveFileWriter.WriteWavFileToStream(wavStream, stwp); wavStream.Position = 0; return(wavStream); }