static void ANNFFNAccomp() { Databank db = new Databank("lib"); var cat = db.Load("Classical"); Composition inputComp = cat.Compositions[6]; MelodySequence inputSeq = inputComp.Tracks[0].GetMainSequence() as MelodySequence; AccompanimentGeneratorANNFF gen = new AccompanimentGeneratorANNFF(cat, PatchNames.Acoustic_Grand); //gen.Initialize(); gen.SetSequence(inputSeq); gen.Train(); var outMel = gen.Generate(); MusicPlayer player = new MusicPlayer(); Composition comp = new Composition(); Track t = new Track(PatchNames.Orchestral_Strings, 6); t.AddSequence(outMel); comp.Add(t); comp.Add(inputComp.Tracks[0]); player.Play(comp); comp.WriteToMidi("ann_ff_accomp.mid"); }
static void TrainANNFFAccomp() { Console.WriteLine("This application trains accompaniment neural networks"); var cats = Databank.GetCategories(); Databank db = new Databank("lib"); var popularInstruments = new PatchNames[]{PatchNames.Acoustic_Grand,PatchNames.String_Ensemble_1, PatchNames.Acoustic_Bass,PatchNames.Trumpet,PatchNames.Vibraphone,PatchNames.Electric_Grand, PatchNames.French_Horn,PatchNames.Flute,PatchNames.Trombone,PatchNames.Music_Box}; foreach (var catName in cats) { Console.WriteLine("Category {0}", catName); var cat = db.Load(catName); if (cat.Compositions.Length > 3000) Console.WriteLine("Skipping category {0} due to length", cat.CategoryName); foreach (var instr in popularInstruments) { Console.WriteLine("Training ANN for {0} - {1}, {2} epochs", cat.ToString(), instr.ToString(), 6000); try { AccompanimentGeneratorANNFF ann = new AccompanimentGeneratorANNFF(cat, instr); ann.Epochs = 5000; ann.Train(); } catch (Exception e) { Console.WriteLine(e.Message); } } } Console.ReadLine(); }
static void MetricTimingTest() { Databank db = new Databank("lib"); var cat = db.Load("Classical"); var fmets = new IMetric[]{new ChromaticTone(), new ChromaticToneDistance(), new ChromaticToneDuration(), new MelodicBigram(), new MelodicInterval() , new Pitch(), new Rhythm(), new RhythmicBigram(), new RhythmicInterval()}; MusicPlayer player = new MusicPlayer(); foreach (var m in fmets) { Stopwatch watch = new Stopwatch(); watch.Start(); var metric = MetricSimilarity.GenerateMetricSimilarityMulti(cat.Compositions, new IMetric[] { m }); GeneticGenerator gen = new GeneticGenerator(metric); gen.PrintProgress = false; gen.MaxGenerations = 1000; var mel = gen.Generate(); mel.Trim(20); watch.Stop(); var className = ((object)m).GetType().Name; Console.WriteLine("{0} - MF: {1}, AF {2}, T {3}", className, gen.MaxFitness, gen.AvgFitness, watch.ElapsedMilliseconds); Console.ReadLine(); player.Play(mel); } Console.ReadLine(); }
static void MarkovAccompTest() { Databank db = new Databank("lib"); var cat = db.Load("Classical"); Composition inputComp = cat.Compositions[6]; MelodySequence inputSeq = inputComp.Tracks[0].GetMainSequence() as MelodySequence; AccompanyGeneratorMarkov gen = new AccompanyGeneratorMarkov(cat, PatchNames.Orchestral_Strings); var outMel = gen.Generate(inputSeq, 10); MusicPlayer player = new MusicPlayer(); Composition comp = new Composition(); Track t = new Track(gen.Instrument, 6); t.AddSequence(outMel); comp.Add(t); comp.Add(inputComp.Tracks[0]); player.Play(comp); comp.WriteToMidi("markov_model_accomp.mid"); }
static void Main(string[] args) { /*Feed forward neural network Group notes into 3 Classify all groups in existing songs as 1, all other combinations as 0. Use as fitness function Use HMM decode as fitness function GA*/ /* Databank db = new Databank("lib"); List<MelodySequence> drumSeqs = new List<MelodySequence>(); var comps = new Composition[][] { db.Load("Classic Rock").Compositions, db.Load("Jazz").Compositions, Utils.LoadCompositionsParallel(@"D:\Sync\4th year\Midi\Library2\Drums") }; foreach(Composition[] catt in comps) { foreach(var c in catt) { foreach(var t in c.Tracks) { if(t.Channel == 10) { drumSeqs.Add(t.GetMainSequence() as MelodySequence); } } } } List<Composition> drums = new List<Composition>(); foreach(var m in drumSeqs) { Composition c = new Composition(); Track t = new Track(PatchNames.Acoustic_Grand, 10); t.AddSequence(m); c.Add(t); drums.Add(c); } var catdrum = new CompositionCategory("Drums", "lib/Drums", drums.ToArray()); catdrum.Save("lib/Drums"); Console.ReadLine(); */ /*Composition comp = Composition.LoadFromMIDI(@"C:\Users\1gn1t0r\Documents\git\GeneticMIDI\GeneticMIDI\bin\Debug\test\other\twinkle.mid"); float time = Note.ToRealDuration(comp.GetLongestTrack().Duration); Console.WriteLine("Total time: {0}", time); MusicPlayer player = new MusicPlayer(); player.Play(comp); Console.ReadLine();*/ var twink = Composition.LoadFromMIDI(@"C:\Users\1gn1t0r\Documents\git\GeneticMIDI\GeneticMIDI\bin\Debug\test\other\twinkle.mid"); Databank db = new Databank("lib"); var cat = db.Load("Jazz"); Codebook<Note> book = new Codebook<Note>(); List<int[]> sequences = new List<int[]>(); foreach(var comp in cat.Compositions) { foreach(var track in comp.Tracks) { if(track.Instrument == PatchNames.Trumpet) { var mel = track.GetMelodySequence(); mel.Trim(80); mel.StandardizeDuration(); book.Add(mel.Notes); sequences.Add(book.ToCodes(mel.Notes)); } } if (sequences.Count > 10) break; } DotNetLearn.Markov.HiddenMarkovModel hmm = new DotNetLearn.Markov.HiddenMarkovModel(60, book.TotalUniqueSymbols); hmm.UniformRandomPriors(); hmm.MaxIterations = 50; hmm.Train(sequences.ToArray()); var o = hmm.PredictObservationSequence(80); var newmel = new MelodySequence(book.Translate(o)); Track t = new Track(PatchNames.Trumpet, 2); t.AddSequence(newmel); Console.ReadLine(); MusicPlayer player = new MusicPlayer(); player.Play(t); player.Stop(); Console.ReadLine(); /* var gen = new SamplingWithReplacement(cat, PatchNames.Acoustic_Grand); var mel = gen.Generate(); Console.WriteLine(mel.ToString()); MusicPlayer player = new MusicPlayer(); player.Play(mel); Console.WriteLine("Press enter to save"); Console.ReadLine(); WriteMelodyToFile(gen.OriginalSequence, "sampling_in.mid"); WriteMelodyToFile(mel, "sampling_out.mid"); */ /* MusicPlayer player = new MusicPlayer(); //db.LoadAll(); AccompanyGeneratorMarkov genMark = new AccompanyGeneratorMarkov(cat); var targetSeq = cat.Compositions[2].GetLongestTrack().GetMainSequence() as MelodySequence; var seqTest = genMark.Generate(targetSeq,5); Track trackTest = new Track(PatchNames.Orchestral_Strings, 2); trackTest.AddSequence(seqTest); Track targetTrack = new Track(PatchNames.Acoustic_Grand, 3); targetTrack.AddSequence(targetSeq); Composition comp = new Composition(); comp.Add(trackTest); comp.Add(targetTrack); player.Play(comp); return;*/ /* Databank db = new Databank("lib"); var cat = db.Load("Classical"); //AccompanimentGenerator2 Test AccompanimentGenerator2 gen = new AccompanimentGenerator2(cat, PatchNames.Orchestral_Strings); gen.Train(); // Composition comp = Composition.LoadFromMIDI(@"D:\Sync\4th year\Midi\Library2\Classical\Mixed\dvorak.mid"); //var comp = Composition.LoadFromMIDI(@"C:\Users\1gn1t0r\Documents\git\GeneticMIDI\GeneticMIDI\bin\Debug\test\ff7tifa.mid"); gen.SetSequence(comp.Tracks[0].GetMainSequence() as MelodySequence); MusicPlayer player = new MusicPlayer(); Console.WriteLine("Press enter to listen"); Console.ReadLine(); var mel = gen.Generate(); Composition newComp = new Composition(); Track newTrack = new Track(PatchNames.Orchestral_Strings , 2); newTrack.AddSequence(mel); newComp.Add(newTrack); /*comp.Tracks[0].Instrument = PatchNames.Acoustic_Grand; (comp.Tracks[0].GetMainSequence() as MelodySequence).ScaleVelocity(0.8f); /* newComp.Tracks.Add(comp.Tracks[0]); player.Play(newComp);*/ Console.ReadLine(); }
static void InstrumentalTest() { Databank db = new Databank("lib"); var cat = db.Load("Classical"); InstrumentalGenerator gen = new InstrumentalGenerator(cat); gen.Initialize(); var outMel = gen.GenerateInstrument(PatchNames.Acoustic_Grand, 40); MusicPlayer player = new MusicPlayer(); player.Play(outMel); Composition comp = new Composition(); Track t = new Track(PatchNames.Acoustic_Grand, 3); t.AddSequence(outMel); comp.Add(t); comp.WriteToMidi("instrumental_acousticgrand.mid"); }
static void GetPopularInstruments() { Databank db = new Databank("lib"); var cat = db.Load("Classical"); var cat2 = db.Load("Jazz"); Dictionary<PatchNames, int> instrumentsCount = new Dictionary<PatchNames, int>(); foreach (var c in cat.Compositions) { foreach (var t in c.Tracks) { if (instrumentsCount.ContainsKey(t.Instrument)) instrumentsCount[t.Instrument]++; else instrumentsCount[t.Instrument] = 1; } } foreach (var c in cat2.Compositions) { foreach (var t in c.Tracks) { if (instrumentsCount.ContainsKey(t.Instrument)) instrumentsCount[t.Instrument]++; else instrumentsCount[t.Instrument] = 1; } } int n = 10; var myList = instrumentsCount.ToList(); myList.Sort((firstPair, nextPair) => { return firstPair.Value.CompareTo(nextPair.Value); } ); List<PatchNames> instrs = new List<PatchNames>(); for (int i = 0; i < n; i++) { instrs.Add(myList[myList.Count - i - 1].Key); } instrs.ToArray(); Console.Write("var pop = new PatchNames[]{"); foreach (var i in instrs) Console.Write("PatchNames." + i.ToString() + ","); Console.Write("};"); Console.ReadLine(); }
static void GeneticTest() { Databank db = new Databank("lib"); var cat = db.Load("Classical"); MetricSimilarity cosine = MetricSimilarity.GenerateMetricSimilarityMulti(cat.Compositions, new IMetric[] { new ChromaticToneDistance(), new MelodicInterval(), new ChromaticToneDuration(), new RhythmicBigram() }); GeneticGenerator gen = new GeneticGenerator(cosine, PatchNames.Orchestral_Strings, cat); gen.OnPercentage += (sender, percentage, fitness) => { Console.WriteLine("{0}: {1}", percentage, fitness); }; gen.MaxGenerations = 1000; var outMel = gen.Generate(); MusicPlayer player = new MusicPlayer(); player.Play(outMel); Composition comp = new Composition(); Track t = new Track(gen.Instrument, 3); t.AddSequence(outMel); comp.Add(t); comp.WriteToMidi("genetic_cosine_all.mid"); }
public void Train(Databank bank) { var cat = bank.Load("Drums"); int count = 0; int percus = 0; foreach (var c in cat.Compositions) { foreach (var t in c.Tracks) { if (t.Channel == 10) { var mel = t.GetMainSequence() as MelodySequence; this.chain.Add(mel.ToArray()); percus++; } count++; } } Save(); }