Ejemplo n.º 1
0
        private void CreateMidi(string trackName, int[] notes, int tempo, int[] instruments, int[] durations, string fileName)
        {
            MIDISong song = new MIDISong();

            song.AddTrack(trackName);
            song.SetTimeSignature(0, 4, 4);
            song.SetTempo(0, m_nBeats[tempo]);

            for (int channel = 0; channel < instruments.Length; channel++)
            {
                song.SetChannelInstrument(0, channel, instruments[channel]);
                foreach (int duration in durations)
                {
                    for (int i = 0; i < notes.Length; i++)
                    {
                        int noteNumber = notes[i];
                        noteNumber += 12 * (6 + (channel % 2));
                        song.AddNote(0, channel, noteNumber, duration);
                    }
                }
            }


            try
            {
                MemoryStream ms = new MemoryStream();
                song.Save(ms);
                ms.Seek(0, SeekOrigin.Begin);
                byte[] src = ms.GetBuffer();
                byte[] dst = new byte[src.Length];
                for (int i = 0; i < src.Length; i++)
                {
                    dst[i] = src[i];
                }
                ms.Close();
                FileInfo FI = new FileInfo(fileName + ".mid");
                if (!FI.Directory.Exists)
                {
                    FI.Directory.Create();
                }
                FileStream objWriter = File.Create(FI.FullName);
                objWriter.Write(dst, 0, dst.Length);
                objWriter.Close();
                objWriter.Dispose();
                objWriter = null;
            }
            catch (Exception e)
            {
                throw e;
            }
        }
Ejemplo n.º 2
0
        //  Ecriture musique dans fichier temporaire
        private void WriteMusic(Individu individu, int numeroPiste)
        {
            // 1) Créer le fichier MIDI
            // a. Créer un fichier et une piste audio ainsi que les informations de tempo
            MIDISong song = new MIDISong();

            song.AddTrack("Piste1");
            song.SetTimeSignature(0, 4, 4);
            song.SetTempo(0, tempo);

            //  Récupération du tableau contenant les notes de musique
            int[] tabMusique = individu.GetNotesDeMusique();

            //  Récupération du type d'instrument dans l'individu présent dans la population
            int instrument = individu.GetTypeInstrument();

            song.SetChannelInstrument(0, 0, instrument);

            //  Ajout des notes une à une dans la piste son
            for (int i = 0; i < numberIndividu; i++)
            {
                song.AddNote(0, 0, tabMusique[i], lengthNote);
            }

            // d. Enregistrer le fichier .mid (lisible dans un lecteur externe par exemple)
            // on prépare le flux de sortie
            MemoryStream ms = new MemoryStream();

            song.Save(ms);
            ms.Seek(0, SeekOrigin.Begin);
            byte[] src = ms.GetBuffer();
            ms.Close();

            FileStream objWriter = File.Create(directory + "/piste" + numeroPiste + ".midi");

            objWriter.Write(src, 0, src.Length);
            objWriter.Close();
            objWriter.Dispose();
            objWriter = null;
        }
Ejemplo n.º 3
0
        public MIDISong ToMidi(Dictionary <string, int> instrumentMap, int songId = 0)
        {
            var inst = Instruments;
            var ovtb = Voices;
            var stbl = Songs[songId];
            var notb = Notes;
            var song = new MIDISong();

            for (int i = 0; i < 4; i++)
            {
                var track = song.AddTrack(null);
                song.SetTempo(track, 3000 / stbl.SongSpeed);
                song.SetTimeSignature(track, 4, 4);
            }
            for (int i = 0; i < inst.Length; i++)
            {
                var instr = inst[i];
                int minst;
                if (!instrumentMap.TryGetValue(instr.Name, out minst))
                {
                    Console.WriteLine("Unknown instrument " + instr.Name);
                }
                else
                {
                    Console.WriteLine(minst + " set for " + instr.Name);
                }
                if (i < 15 && i != 9)
                {
                    for (int j = 0; j < 4; j++)
                    {
                        if (minst != -1)
                        {
                            song.SetChannelInstrument(j, i, minst);
                        }
                    }
                }
            }

            int lastinstr = Int32.MinValue;

            for (int i = stbl.StartPos; i <= stbl.StopPos; i++)
            {
                for (int j = 0; j < 4; j++)
                {
                    var voice = ovtb[i * 4 + j];
                    for (int k = 0; k < stbl.PatternLength; k++)
                    {
                        var note = notb[voice.NoteAddress + k];
                        if (note.Command == 15)
                        {
                            for (int l = 0; l < 4; l++)
                            {
                                song.SetTempo(l, 3000 / note.CommandInfo);
                            }
                        }
                        int instr = note.Instrument - 1;
                        if (instr >= 0)
                        {
                            if (instr == 9 || instr >= 15)
                            {
                                if (lastinstr != instr)
                                {
                                    int minst;
                                    instrumentMap.TryGetValue(inst[instr].Name, out minst);
                                    song.SetChannelInstrument(j, 15, minst);
                                    lastinstr = instr;
                                }
                                song.AddNote(j, 15, note.Value - 1, 12);
                            }
                            else
                            {
                                song.AddNote(j, instr, note.Value - 1, 12);
                            }
                        }
                        else
                        {
                            song.AddNote(j, 0, -1, 12);
                        }
                    }
                }
            }
            return(song);
        }