private ISampleProvider[] CreateTriad(int newDoNoteNumber, int degree, TimeSpan noteDuration) { ISampleProvider[] samples; switch (degree) { case 1: case 4: case 5: samples = Inversion.CreateTriadInversionEx(InversionType.Root, noteDuration, newDoNoteNumber, newDoNoteNumber + Interval.UpMajor3rd, newDoNoteNumber + Interval.UpPerfect5th); break; case 2: case 3: case 6: samples = Inversion.CreateTriadInversionEx(InversionType.Root, noteDuration, newDoNoteNumber, newDoNoteNumber + Interval.UpMinor3rd, newDoNoteNumber + Interval.UpPerfect5th); break; case 7: samples = Inversion.CreateTriadInversionEx(InversionType.Root, noteDuration, newDoNoteNumber, newDoNoteNumber + Interval.UpMinor3rd, newDoNoteNumber + Interval.UpDiminished5th); break; default: throw new NotImplementedException($"degree '{degree}' is not supported."); } return(samples); }
private MixingSampleProvider CreateMajorTriad(string doNoteName, string chordAndInversion, string movement) { _log.Debug($"doNoteName: {doNoteName}, chordAndInversion: {chordAndInversion}, movement: {movement ?? "null"}"); double bpm = double.Parse(ConfigurationManager.AppSettings["BPM"]); double quarterNoteMillis = (60 / bpm) * 1000; double halfNoteMillis = quarterNoteMillis * 2; TimeSpan noteDuration = TimeSpan.FromMilliseconds(halfNoteMillis); string doNoteRegisterString = Regex.Replace(doNoteName, "[A-G#b]", ""); int doNoteRegister = int.Parse(doNoteRegisterString); string[] parts = chordAndInversion.Trim().Split(' '); string chord = parts[0].Trim(); string inversion = parts[1].Trim(); InversionType inversionType; switch (inversion) { case "(root)": inversionType = InversionType.Root; break; case "(1st)": inversionType = InversionType.LowFirst; break; case "(2nd)": inversionType = InversionType.LowSecond; break; default: inversionType = InversionType.Root; break; } string thisChordRootNote = GetClosestNote(doNoteName, chord); //thisChordRootNote = chord + doNoteRegister.ToString(); _log.Debug($"doNoteName: {doNoteName}, thisChordRootNote: {thisChordRootNote}"); string doFileName = NAudioHelper.GetFileNameFromNoteName(thisChordRootNote); doFileName = Path.GetFileName(doFileName); int doNoteNumber = int.Parse(doFileName.Split('.')[0]); ISampleProvider[] samples; samples = Inversion.CreateTriadInversionEx(inversionType, noteDuration, doNoteNumber, doNoteNumber + Interval.UpMajor3rd, doNoteNumber + Interval.UpPerfect5th, doNoteNumber.BassNoteNumber()); MixingSampleProvider msp = new MixingSampleProvider(samples[0].WaveFormat); msp.AddMixerInput(samples[0]); msp.AddMixerInput(samples[1]); msp.AddMixerInput(samples[2]); msp.AddMixerInput(samples[3]); return(msp); }
public ActionResult Get3ChordProgressionEx(string doNoteName, int progressiontype) { var progressionType = (ProgressionType)progressiontype; TimeSpan noteDuration = TimeSpan.FromSeconds(2); string doFileName = NAudioHelper.GetFileNameFromNoteName(doNoteName); doFileName = Path.GetFileName(doFileName); int doNoteNumber = int.Parse(doFileName.Split('.')[0]); ISampleProvider[] samples1; ISampleProvider[] samples2; ISampleProvider[] samples3; switch (progressionType) { case ProgressionType.Four2ndFive1stOneRoot: samples1 = Inversion.CreateTriadInversionEx(InversionType.LowSecond, noteDuration, doNoteNumber + Interval.UpPerfect4th, doNoteNumber + Interval.UpMajor6th, doNoteNumber + Interval.UpPerfectOctave, (doNoteNumber + Interval.UpPerfect4th).BassNoteNumber()); samples2 = Inversion.CreateTriadInversionEx(InversionType.LowFirst, noteDuration, doNoteNumber + Interval.UpPerfect5th, doNoteNumber + Interval.UpMajor7th, doNoteNumber + Interval.UpMajor9th, (doNoteNumber + Interval.UpPerfect5th).BassNoteNumber()); samples3 = Inversion.CreateTriadInversionEx(InversionType.Root, noteDuration.Add(noteDuration), doNoteNumber, doNoteNumber + Interval.UpMajor3rd, doNoteNumber + Interval.UpPerfect5th, doNoteNumber.BassNoteNumber()); break; case ProgressionType.OneRootFour2ndFive1st: samples1 = Inversion.CreateTriadInversionEx(InversionType.Root, noteDuration, doNoteNumber, doNoteNumber + Interval.UpMajor3rd, doNoteNumber + Interval.UpPerfect5th, doNoteNumber.BassNoteNumber()); samples2 = Inversion.CreateTriadInversionEx(InversionType.LowSecond, noteDuration, doNoteNumber + Interval.UpPerfect4th, doNoteNumber + Interval.UpMajor6th, doNoteNumber + Interval.UpPerfectOctave, (doNoteNumber + Interval.UpPerfect4th).BassNoteNumber()); samples3 = Inversion.CreateTriadInversionEx(InversionType.LowFirst, noteDuration.Add(noteDuration), doNoteNumber + Interval.UpPerfect5th, doNoteNumber + Interval.UpMajor7th, doNoteNumber + Interval.UpMajor9th, (doNoteNumber + Interval.UpPerfect5th).BassNoteNumber()); break; case ProgressionType.Four2ndOneRootFive1st: samples1 = Inversion.CreateTriadInversionEx(InversionType.LowSecond, noteDuration, doNoteNumber + Interval.UpPerfect4th, doNoteNumber + Interval.UpMajor6th, doNoteNumber + Interval.UpPerfectOctave, (doNoteNumber + Interval.UpPerfect4th).BassNoteNumber()); samples2 = Inversion.CreateTriadInversionEx(InversionType.Root, noteDuration, doNoteNumber, doNoteNumber + Interval.UpMajor3rd, doNoteNumber + Interval.UpPerfect5th, doNoteNumber.BassNoteNumber()); samples3 = Inversion.CreateTriadInversionEx(InversionType.LowFirst, noteDuration.Add(noteDuration), doNoteNumber + Interval.UpPerfect5th, doNoteNumber + Interval.UpMajor7th, doNoteNumber + Interval.UpMajor9th, (doNoteNumber + Interval.UpPerfect5th).BassNoteNumber()); break; case ProgressionType.OneRootFive1stSixMin1st: samples1 = Inversion.CreateTriadInversionEx(InversionType.Root, noteDuration, doNoteNumber, doNoteNumber + Interval.UpMajor3rd, doNoteNumber + Interval.UpPerfect5th, doNoteNumber.BassNoteNumber()); samples2 = Inversion.CreateTriadInversionEx(InversionType.LowFirst, noteDuration, doNoteNumber + Interval.UpPerfect5th, doNoteNumber + Interval.UpMajor7th, doNoteNumber + Interval.UpMajor9th, (doNoteNumber + Interval.UpPerfect5th).BassNoteNumber()); samples3 = Inversion.CreateTriadInversionEx(InversionType.LowFirst, noteDuration.Add(noteDuration), doNoteNumber + Interval.UpMajor6th, doNoteNumber + Interval.UpPerfectOctave, doNoteNumber + Interval.UpMajor10th, (doNoteNumber + Interval.UpMajor6th).BassNoteNumber()); break; case ProgressionType.SixMin2ndFourRootOne1st: samples1 = Inversion.CreateTriadInversionEx(InversionType.LowSecond, noteDuration, doNoteNumber + Interval.UpMajor6th, doNoteNumber + Interval.UpPerfectOctave, doNoteNumber + Interval.UpMajor10th, (doNoteNumber + Interval.UpMajor6th).BassNoteNumber()); samples2 = Inversion.CreateTriadInversionEx(InversionType.Root, noteDuration, doNoteNumber + Interval.UpPerfect4th, doNoteNumber + Interval.UpMajor6th, doNoteNumber + Interval.UpPerfectOctave, (doNoteNumber + Interval.UpPerfect4th).BassNoteNumber()); samples3 = Inversion.CreateTriadInversionEx(InversionType.HighFirst, noteDuration.Add(noteDuration), doNoteNumber, doNoteNumber + Interval.UpMajor3rd, doNoteNumber + Interval.UpPerfect5th, doNoteNumber.BassNoteNumber()); break; case ProgressionType.OneRootSixMin1stFive1st: samples1 = Inversion.CreateTriadInversionEx(InversionType.Root, noteDuration, doNoteNumber, doNoteNumber + Interval.UpMajor3rd, doNoteNumber + Interval.UpPerfect5th, doNoteNumber.BassNoteNumber()); samples2 = Inversion.CreateTriadInversionEx(InversionType.LowFirst, noteDuration, doNoteNumber + Interval.UpMajor6th, doNoteNumber + Interval.UpPerfectOctave, doNoteNumber + Interval.UpMajor10th, (doNoteNumber + Interval.UpMajor6th).BassNoteNumber()); samples3 = Inversion.CreateTriadInversionEx(InversionType.LowFirst, noteDuration.Add(noteDuration), doNoteNumber + Interval.UpPerfect5th, doNoteNumber + Interval.UpMajor7th, doNoteNumber + Interval.UpMajor9th, (doNoteNumber + Interval.UpPerfect5th).BassNoteNumber()); break; case ProgressionType.FiveRootFourRootSixMin2nd: samples1 = Inversion.CreateTriadInversionEx(InversionType.Root, noteDuration, doNoteNumber + Interval.UpPerfect5th, doNoteNumber + Interval.UpMajor7th, doNoteNumber + Interval.UpMajor9th, (doNoteNumber + Interval.UpPerfect5th).BassNoteNumber()); samples2 = Inversion.CreateTriadInversionEx(InversionType.Root, noteDuration, doNoteNumber + Interval.UpPerfect4th, doNoteNumber + Interval.UpMajor6th, doNoteNumber + Interval.UpPerfectOctave, (doNoteNumber + Interval.UpPerfect4th).BassNoteNumber()); samples3 = Inversion.CreateTriadInversionEx(InversionType.LowSecond, noteDuration.Add(noteDuration), doNoteNumber + Interval.UpMajor6th, doNoteNumber + Interval.UpPerfectOctave, doNoteNumber + Interval.UpMajor10th, (doNoteNumber + Interval.UpMajor6th).BassNoteNumber()); break; case ProgressionType.FourRootFiveRootSixMinRoot: samples1 = Inversion.CreateTriadInversionEx(InversionType.Root, noteDuration, doNoteNumber + Interval.UpPerfect4th, doNoteNumber + Interval.UpMajor6th, doNoteNumber + Interval.UpPerfectOctave, (doNoteNumber + Interval.UpPerfect4th).BassNoteNumber()); samples2 = Inversion.CreateTriadInversionEx(InversionType.Root, noteDuration, doNoteNumber + Interval.UpPerfect5th, doNoteNumber + Interval.UpMajor7th, doNoteNumber + Interval.UpMajor9th, (doNoteNumber + Interval.UpPerfect5th).BassNoteNumber()); samples3 = Inversion.CreateTriadInversionEx(InversionType.Root, noteDuration.Add(noteDuration), doNoteNumber + Interval.UpMajor6th, doNoteNumber + Interval.UpPerfectOctave, doNoteNumber + Interval.UpMajor10th, (doNoteNumber + Interval.UpMajor6th).BassNoteNumber()); break; case ProgressionType.SixMin1stOne2ndFour1st: samples1 = Inversion.CreateTriadInversionEx(InversionType.LowFirst, noteDuration, doNoteNumber + Interval.UpMajor6th, doNoteNumber + Interval.UpPerfectOctave, doNoteNumber + Interval.UpMajor10th, (doNoteNumber + Interval.UpMajor6th).BassNoteNumber()); samples2 = Inversion.CreateTriadInversionEx(InversionType.LowSecond, noteDuration, doNoteNumber, doNoteNumber + Interval.UpMajor3rd, doNoteNumber + Interval.UpPerfect5th, doNoteNumber.BassNoteNumber()); samples3 = Inversion.CreateTriadInversionEx(InversionType.LowFirst, noteDuration.Add(noteDuration), doNoteNumber + Interval.UpPerfect4th, doNoteNumber + Interval.UpMajor6th, doNoteNumber + Interval.UpPerfectOctave, (doNoteNumber + Interval.UpPerfect4th).BassNoteNumber()); break; case ProgressionType.Five2ndSixMin2ndOneRoot: samples1 = Inversion.CreateTriadInversionEx(InversionType.LowSecond, noteDuration, doNoteNumber + Interval.UpPerfect5th, doNoteNumber + Interval.UpMajor7th, doNoteNumber + Interval.UpMajor9th, (doNoteNumber + Interval.UpPerfect5th).BassNoteNumber()); samples2 = Inversion.CreateTriadInversionEx(InversionType.LowSecond, noteDuration, doNoteNumber + Interval.UpMajor6th, doNoteNumber + Interval.UpPerfectOctave, doNoteNumber + Interval.UpMajor10th, (doNoteNumber + Interval.UpMajor6th).BassNoteNumber()); samples3 = Inversion.CreateTriadInversionEx(InversionType.Root, noteDuration.Add(noteDuration), doNoteNumber, doNoteNumber + Interval.UpMajor3rd, doNoteNumber + Interval.UpPerfect5th, doNoteNumber.BassNoteNumber()); break; default: throw new NotSupportedException($"ProgressionType {progressionType} is not supported."); } // First chord. MixingSampleProvider msp1 = new MixingSampleProvider(samples1[0].WaveFormat); msp1.AddMixerInput(samples1[0]); msp1.AddMixerInput(samples1[1]); msp1.AddMixerInput(samples1[2]); if (samples1[3] != null) // Bass note. { msp1.AddMixerInput(samples1[3]); } // Second chord. MixingSampleProvider msp2 = new MixingSampleProvider(samples2[0].WaveFormat); msp2.AddMixerInput(samples2[0]); msp2.AddMixerInput(samples2[1]); msp2.AddMixerInput(samples2[2]); if (samples2[3] != null) // Bass note. { msp2.AddMixerInput(samples2[3]); } // Third chord. MixingSampleProvider msp3 = new MixingSampleProvider(samples3[0].WaveFormat); msp3.AddMixerInput(samples3[0]); msp3.AddMixerInput(samples3[1]); msp3.AddMixerInput(samples3[2]); if (samples3[3] != null) // Bass note. { msp3.AddMixerInput(samples3[3]); } var phrase = msp1 .FollowedBy(msp2) .FollowedBy(msp3); var stwp = new SampleToWaveProvider(phrase); MemoryStream wavStream = new MemoryStream(); WaveFileWriter.WriteWavFileToStream(wavStream, stwp); wavStream.Position = 0; wavStream.WavToMp3File(out string fileName); return(Redirect($"~/Temp/{fileName}")); }
public ActionResult Get3ChordProgressionEx(string doNoteName, int progressiontype) { var progressionType = (ProgressionType3)progressiontype; TimeSpan duration = TimeSpan.FromSeconds(2); string doFileName = NAudioHelper.GetFileNameFromNoteName(doNoteName); doFileName = Path.GetFileName(doFileName); int doNoteNumber = int.Parse(doFileName.Split('.')[0]); ISampleProvider[] samples1; ISampleProvider[] samples2; ISampleProvider[] samples3; switch (progressionType) { case ProgressionType3.One2ndTwoMin1stThreeMin1st: samples1 = Inversion.CreateTriadInversionEx(doNoteNumber, TriadType.OneMajor, InversionType.HighSecond, duration, true); samples2 = Inversion.CreateTriadInversionEx(doNoteNumber, TriadType.TwoMinor, InversionType.HighFirst, duration, true); samples3 = Inversion.CreateTriadInversionEx(doNoteNumber, TriadType.ThreeMinor, InversionType.HighFirst, duration, true); break; case ProgressionType3.One1stFive2ndSixMin2nd: samples1 = Inversion.CreateTriadInversionEx(doNoteNumber, TriadType.OneMajor, InversionType.HighFirst, duration, true); samples2 = Inversion.CreateTriadInversionEx(doNoteNumber, TriadType.FiveMajor, InversionType.LowSecond, duration, true); samples3 = Inversion.CreateTriadInversionEx(doNoteNumber, TriadType.SixMinor, InversionType.LowSecond, duration, true); break; case ProgressionType3.Four2ndFive1stSixMin1st: samples1 = Inversion.CreateTriadInversionEx(doNoteNumber, TriadType.FourMajor, InversionType.LowSecond, duration, true); samples2 = Inversion.CreateTriadInversionEx(doNoteNumber, TriadType.FiveMajor, InversionType.LowFirst, duration, true); samples3 = Inversion.CreateTriadInversionEx(doNoteNumber, TriadType.SixMinor, InversionType.LowFirst, duration, true); break; case ProgressionType3.ThreeMin1stOne2ndTwoMin1st: samples1 = Inversion.CreateTriadInversionEx(doNoteNumber, TriadType.ThreeMinor, InversionType.HighFirst, duration, true); samples2 = Inversion.CreateTriadInversionEx(doNoteNumber, TriadType.OneMajor, InversionType.HighSecond, duration, true); samples3 = Inversion.CreateTriadInversionEx(doNoteNumber, TriadType.TwoMinor, InversionType.HighFirst, duration, true); break; case ProgressionType3.FourRootFive2ndThreeMinRoot: samples1 = Inversion.CreateTriadInversionEx(doNoteNumber, TriadType.FourMajor, InversionType.Root, duration, true); samples2 = Inversion.CreateTriadInversionEx(doNoteNumber, TriadType.FiveMajor, InversionType.LowSecond, duration, true); samples3 = Inversion.CreateTriadInversionEx(doNoteNumber, TriadType.ThreeMinor, InversionType.Root, duration, true); break; case ProgressionType3.OneRootTwoMin2ndFour1st: samples1 = Inversion.CreateTriadInversionEx(doNoteNumber, TriadType.OneMajor, InversionType.Root, duration, true); samples2 = Inversion.CreateTriadInversionEx(doNoteNumber, TriadType.TwoMinor, InversionType.LowSecond, duration, true); samples3 = Inversion.CreateTriadInversionEx(doNoteNumber, TriadType.FourMajor, InversionType.LowFirst, duration, true); break; case ProgressionType3.One1stThreeMinRootTwoMinFirst: samples1 = Inversion.CreateTriadInversionEx(doNoteNumber, TriadType.OneMajor, InversionType.HighFirst, duration, true); samples2 = Inversion.CreateTriadInversionEx(doNoteNumber, TriadType.ThreeMinor, InversionType.Root, duration, true); samples3 = Inversion.CreateTriadInversionEx(doNoteNumber, TriadType.TwoMinor, InversionType.HighFirst, duration, true); break; case ProgressionType3.Four2ndOneRootFive1st: samples1 = Inversion.CreateTriadInversionEx(doNoteNumber, TriadType.FourMajor, InversionType.LowSecond, duration, true); samples2 = Inversion.CreateTriadInversionEx(doNoteNumber, TriadType.OneMajor, InversionType.Root, duration, true); samples3 = Inversion.CreateTriadInversionEx(doNoteNumber, TriadType.FiveMajor, InversionType.LowFirst, duration, true); break; case ProgressionType3.SixMinRootFour1stOne2nd: samples1 = Inversion.CreateTriadInversionEx(doNoteNumber, TriadType.SixMinor, InversionType.Root, duration, true); samples2 = Inversion.CreateTriadInversionEx(doNoteNumber, TriadType.FourMajor, InversionType.HighFirst, duration, true); samples3 = Inversion.CreateTriadInversionEx(doNoteNumber, TriadType.OneMajor, InversionType.HighSecond, duration, true); break; case ProgressionType3.Five2ndOneRootTwoRoot: samples1 = Inversion.CreateTriadInversionEx(doNoteNumber, TriadType.FiveMajor, InversionType.LowSecond, duration, true); samples2 = Inversion.CreateTriadInversionEx(doNoteNumber, TriadType.OneMajor, InversionType.Root, duration, true); samples3 = Inversion.CreateTriadInversionEx(doNoteNumber, TriadType.TwoMinor, InversionType.Root, duration, true); break; case ProgressionType3.One1stFive2ndFourRoot: samples1 = Inversion.CreateTriadInversionEx(doNoteNumber, TriadType.OneMajor, InversionType.HighFirst, duration, true); samples2 = Inversion.CreateTriadInversionEx(doNoteNumber, TriadType.FiveMajor, InversionType.LowSecond, duration, true); samples3 = Inversion.CreateTriadInversionEx(doNoteNumber, TriadType.FourMajor, InversionType.Root, duration, true); break; default: throw new NotSupportedException($"ProgressionType {progressionType} is not supported."); } MixingSampleProvider msp1 = new MixingSampleProvider(samples1[0].WaveFormat); msp1.AddMixerInput(samples1[0]); msp1.AddMixerInput(samples1[1]); msp1.AddMixerInput(samples1[2]); if (samples1[3] != null) // Bass note. { msp1.AddMixerInput(samples1[3]); } MixingSampleProvider msp2 = new MixingSampleProvider(samples2[0].WaveFormat); msp2.AddMixerInput(samples2[0]); msp2.AddMixerInput(samples2[1]); msp2.AddMixerInput(samples2[2]); if (samples2[3] != null) // Bass note. { msp2.AddMixerInput(samples2[3]); } MixingSampleProvider msp3 = new MixingSampleProvider(samples3[0].WaveFormat); msp3.AddMixerInput(samples3[0]); msp3.AddMixerInput(samples3[1]); msp3.AddMixerInput(samples3[2]); if (samples3[3] != null) // Bass note. { msp3.AddMixerInput(samples3[3]); } var phrase = msp1 .FollowedBy(msp2) .FollowedBy(msp3); var stwp = new SampleToWaveProvider(phrase); MemoryStream wavStream = new MemoryStream(); WaveFileWriter.WriteWavFileToStream(wavStream, stwp); wavStream.Position = 0; wavStream.WavToMp3File(out string fileName); return(Redirect($"~/Temp/{fileName}")); }
public ActionResult GetTriad(string doNoteName, int triadtype) { var triadType = (L2C5TriadType)triadtype; InversionType inversionType = GetRandomInversion(); TimeSpan noteDuration = TimeSpan.FromSeconds(3); string doFileName = NAudioHelper.GetFileNameFromNoteName(doNoteName); doFileName = Path.GetFileName(doFileName); int doNoteNumber = int.Parse(doFileName.Split('.')[0]); ISampleProvider[] samples; int newDoNoteNumber; // Used for other chords besides the I. switch (triadType) { case L2C5TriadType.OneMajor: samples = Inversion.CreateTriadInversionEx(inversionType, noteDuration, doNoteNumber, doNoteNumber + Interval.UpMajor3rd, doNoteNumber + Interval.UpPerfect5th); break; case L2C5TriadType.TwoMinor: newDoNoteNumber = doNoteNumber + Interval.UpMajor2nd; samples = Inversion.CreateTriadInversionEx(inversionType, noteDuration, newDoNoteNumber, newDoNoteNumber + Interval.UpMinor3rd, newDoNoteNumber + Interval.UpPerfect5th); break; case L2C5TriadType.ThreeMinor: newDoNoteNumber = doNoteNumber + Interval.UpMajor3rd; samples = Inversion.CreateTriadInversionEx(inversionType, noteDuration, newDoNoteNumber, newDoNoteNumber + Interval.UpMinor3rd, newDoNoteNumber + Interval.UpPerfect5th); break; case L2C5TriadType.FourMajor: newDoNoteNumber = doNoteNumber + Interval.UpPerfect4th; samples = Inversion.CreateTriadInversionEx(inversionType, noteDuration, newDoNoteNumber, newDoNoteNumber + Interval.UpMajor3rd, newDoNoteNumber + Interval.UpPerfect5th); break; case L2C5TriadType.FiveMajor: newDoNoteNumber = doNoteNumber + Interval.UpPerfect5th; samples = Inversion.CreateTriadInversionEx(inversionType, noteDuration, newDoNoteNumber, newDoNoteNumber + Interval.UpMajor3rd, newDoNoteNumber + Interval.UpPerfect5th); break; case L2C5TriadType.SixMinor: newDoNoteNumber = doNoteNumber + Interval.UpMajor6th; samples = Inversion.CreateTriadInversionEx(inversionType, noteDuration, newDoNoteNumber, newDoNoteNumber + Interval.UpMinor3rd, newDoNoteNumber + Interval.UpPerfect5th); break; case L2C5TriadType.SevenDiminished: newDoNoteNumber = doNoteNumber + Interval.UpMajor7th; samples = Inversion.CreateTriadInversionEx(inversionType, noteDuration, newDoNoteNumber, newDoNoteNumber + Interval.UpMinor3rd, newDoNoteNumber + Interval.UpDiminished5th); break; default: throw new NotSupportedException($"L2C5TriadType {triadType} is not supported."); } MixingSampleProvider msp = new MixingSampleProvider(samples[0].WaveFormat); msp.AddMixerInput(samples[0]); msp.AddMixerInput(samples[1]); msp.AddMixerInput(samples[2]); IWaveProvider wp = msp.ToWaveProvider(); MemoryStream wavStream = new MemoryStream(); WaveFileWriter.WriteWavFileToStream(wavStream, wp); wavStream.Position = 0; wavStream.WavToMp3File(out string fileName); return(Redirect($"~/Temp/{fileName}")); }
public ActionResult Get2ChordProgression(string doNoteName, int progressiontype) { var progressionType = (L2C4ProgressionType)progressiontype; TimeSpan noteDuration = TimeSpan.FromSeconds(2); string doFileName = NAudioHelper.GetFileNameFromNoteName(doNoteName); doFileName = Path.GetFileName(doFileName); int doNoteNumber = int.Parse(doFileName.Split('.')[0]); ISampleProvider[] samples1; ISampleProvider[] samples2; switch (progressionType) { case L2C4ProgressionType.Five2ndToOne1st: samples1 = Inversion.CreateTriadInversionEx(InversionType.LowSecond, noteDuration, doNoteNumber + Interval.UpPerfect5th, doNoteNumber + Interval.UpMajor7th, doNoteNumber + Interval.UpMajor9th); samples2 = Inversion.CreateTriadInversionEx(InversionType.HighFirst, noteDuration.Add(noteDuration), doNoteNumber, doNoteNumber + Interval.UpMajor3rd, doNoteNumber + Interval.UpPerfect5th); break; case L2C4ProgressionType.Five1stToOneRoot: samples1 = Inversion.CreateTriadInversionEx(InversionType.LowFirst, noteDuration, doNoteNumber + Interval.UpPerfect5th, doNoteNumber + Interval.UpMajor7th, doNoteNumber + Interval.UpMajor9th); samples2 = Inversion.CreateTriadInversionEx(InversionType.Root, noteDuration.Add(noteDuration), doNoteNumber, doNoteNumber + Interval.UpMajor3rd, doNoteNumber + Interval.UpPerfect5th); break; case L2C4ProgressionType.FiveRootToOne2nd: samples1 = Inversion.CreateTriadInversionEx(InversionType.Root, noteDuration, doNoteNumber + Interval.UpPerfect5th, doNoteNumber + Interval.UpMajor7th, doNoteNumber + Interval.UpMajor9th); samples2 = Inversion.CreateTriadInversionEx(InversionType.HighSecond, noteDuration.Add(noteDuration), doNoteNumber, doNoteNumber + Interval.UpMajor3rd, doNoteNumber + Interval.UpPerfect5th); break; case L2C4ProgressionType.Four1stToOne2nd: samples1 = Inversion.CreateTriadInversionEx(InversionType.LowFirst, noteDuration, doNoteNumber + Interval.UpPerfect4th, doNoteNumber + Interval.UpMajor6th, doNoteNumber + Interval.UpPerfectOctave); samples2 = Inversion.CreateTriadInversionEx(InversionType.LowSecond, noteDuration.Add(noteDuration), doNoteNumber, doNoteNumber + Interval.UpMajor3rd, doNoteNumber + Interval.UpPerfect5th); break; case L2C4ProgressionType.FourRootToOne1st: samples1 = Inversion.CreateTriadInversionEx(InversionType.Root, noteDuration, doNoteNumber + Interval.UpPerfect4th, doNoteNumber + Interval.UpMajor6th, doNoteNumber + Interval.UpPerfectOctave); samples2 = Inversion.CreateTriadInversionEx(InversionType.HighFirst, noteDuration.Add(noteDuration), doNoteNumber, doNoteNumber + Interval.UpMajor3rd, doNoteNumber + Interval.UpPerfect5th); break; case L2C4ProgressionType.Four2ndToOneRoot: samples1 = Inversion.CreateTriadInversionEx(InversionType.LowSecond, noteDuration, doNoteNumber + Interval.UpPerfect4th, doNoteNumber + Interval.UpMajor6th, doNoteNumber + Interval.UpPerfectOctave); samples2 = Inversion.CreateTriadInversionEx(InversionType.Root, noteDuration.Add(noteDuration), doNoteNumber, doNoteNumber + Interval.UpMajor3rd, doNoteNumber + Interval.UpPerfect5th); break; case L2C4ProgressionType.OneRootToFlatTwoRoot: samples1 = Inversion.CreateTriadInversionEx(InversionType.Root, noteDuration, doNoteNumber, doNoteNumber + Interval.UpMajor3rd, doNoteNumber + Interval.UpPerfect5th); samples2 = Inversion.CreateTriadInversionEx(InversionType.Root, noteDuration.Add(noteDuration), doNoteNumber + Interval.UpMinor2nd, doNoteNumber + Interval.UpPerfect4th, doNoteNumber + Interval.UpAugmented5th); break; case L2C4ProgressionType.OneRootToFlatTwo2nd: samples1 = Inversion.CreateTriadInversionEx(InversionType.Root, noteDuration, doNoteNumber, doNoteNumber + Interval.UpMajor3rd, doNoteNumber + Interval.UpPerfect5th); samples2 = Inversion.CreateTriadInversionEx(InversionType.LowSecond, noteDuration.Add(noteDuration), doNoteNumber + Interval.UpMinor2nd, doNoteNumber + Interval.UpPerfect4th, doNoteNumber + Interval.UpAugmented5th); break; case L2C4ProgressionType.OneRootToSevenRoot: samples1 = Inversion.CreateTriadInversionEx(InversionType.Root, noteDuration, doNoteNumber, doNoteNumber + Interval.UpMajor3rd, doNoteNumber + Interval.UpPerfect5th); samples2 = Inversion.CreateTriadInversionEx(InversionType.Root, noteDuration.Add(noteDuration), doNoteNumber + Interval.DownMinor2nd, doNoteNumber + Interval.UpMinor3rd, doNoteNumber + Interval.UpDiminished5th); break; case L2C4ProgressionType.OneRootToSeven1st: samples1 = Inversion.CreateTriadInversionEx(InversionType.Root, noteDuration, doNoteNumber, doNoteNumber + Interval.UpMajor3rd, doNoteNumber + Interval.UpPerfect5th); samples2 = Inversion.CreateTriadInversionEx(InversionType.HighFirst, noteDuration.Add(noteDuration), doNoteNumber + Interval.DownMinor2nd, doNoteNumber + Interval.UpMinor3rd, doNoteNumber + Interval.UpDiminished5th); break; default: throw new NotSupportedException($"ProgressionType {progressionType} is not supported."); } MixingSampleProvider msp1 = new MixingSampleProvider(samples1[0].WaveFormat); msp1.AddMixerInput(samples1[0]); msp1.AddMixerInput(samples1[1]); msp1.AddMixerInput(samples1[2]); MixingSampleProvider msp2 = new MixingSampleProvider(samples2[0].WaveFormat); msp2.AddMixerInput(samples2[0]); msp2.AddMixerInput(samples2[1]); msp2.AddMixerInput(samples2[2]); var phrase = msp1 .FollowedBy(msp2); var stwp = new SampleToWaveProvider(phrase); MemoryStream wavStream = new MemoryStream(); WaveFileWriter.WriteWavFileToStream(wavStream, stwp); wavStream.Position = 0; wavStream.WavToMp3File(out string fileName); return(Redirect($"~/Temp/{fileName}")); }