示例#1
0
        public void restoreMotif(Motif motif, Dictionary <int, Variation> childVariationList, List <Duration>[] motifInstances)
        {
            int motifId = motif.getId();

            //Add motif to list
            this.tune.addMotif(motif);

            //Restore motif instances
            for (int i = 0; i < tune.trackCount(); i++)
            {
                Track t = tune.getTrack(i);
                foreach (Duration d in motifInstances[i])
                {
                    t.insert(motifId, d);
                }
            }

            //Update childs
            foreach (KeyValuePair <int, Variation> child in childVariationList)
            {
                Motif m = this.getMotif(child.Key);
                m.setVariation(child.Value, motifId);
            }

            //Update tree
            this.treeview_restoreMotif(motif.getName(), motif.getParentId(), childVariationList);
        }
    public static void saveToFile(Tune tune, string fileName, int tempo, bool midi)
    {
        using (System.IO.StreamWriter streamWriter = new System.IO.StreamWriter(fileName, false))
        {
            Tonality      tonality   = new Tonality(); //default tonality;
            int           voiceCount = 0;
            List <string> voiceABC   = new List <string>();
            AbcNoteParser anp        = new AbcNoteParser(tonality);
            streamWriter.WriteLine("X:" + tune.getReferenceNumber());
            streamWriter.WriteLine("M:C");
            streamWriter.WriteLine("L:1/4");
            streamWriter.WriteLine("Q:1/4=" + tempo);
            streamWriter.WriteLine("K:" + tonality.ToString());
            for (int i1 = 0; i1 < tune.trackCount(); i1++)
            {
                Track track = tune.getTrack(i1);
                if (track.isEmpty())
                {
                    continue;
                }
                if (track.getVolume() == 0)
                {
                    continue;
                }
                anp.resetAccidentals();
                voiceABC.Clear();
                Duration motifStart       = 0;
                Duration previousMotifEnd = 0;
                for (int i = 0; i < track.motifCount(); i++)
                {
                    Motif    motif         = tune.getMotif(track.getMotifIdentificator(i));
                    Duration motifDuration = motif.getDuration();
                    motifStart = track.getStartTime(i);
                    for (int j = 0; j < motif.voiceCount(); j++)
                    {
                        Voice voice = motif.getVoice(j);
                        anp.resetAccidentals();
                        Duration voiceDuration = voice.getDuration();
                        if (j >= voiceABC.Count)
                        {
                            voiceABC.Add("");
                            if (motifStart > 0)
                            {
                                voiceABC[j] += "z" + motifStart + " ";
                            }
                        }
                        else
                        {
                            Duration relativeStart = motifStart - previousMotifEnd;
                            if (relativeStart > 0)
                            {
                                voiceABC[j] += "z" + relativeStart + " ";
                            }
                        }

                        for (int k = 0; k < voice.size(); k++)
                        {
                            voiceABC[j] += anp.toABC(voice.get(k)) + " ";
                        }
                    }
                    for (int j = motif.voiceCount(); j < voiceABC.Count; j++)
                    {
                        if (motifDuration > 0)
                        {
                            voiceABC[j] += "z" + motifStart + " ";
                        }
                    }
                    previousMotifEnd = motifStart + motifDuration;
                }
                for (int i = 0; i < voiceABC.Count; i++)
                {
                    streamWriter.WriteLine("V:" + (voiceCount + i));
                    if (midi)
                    {
                        streamWriter.WriteLine("%%MIDI program " + (int)track.getTimbre());
                        switch (track.getVolume())
                        {
                        case 1: streamWriter.WriteLine("!ppp!");
                            break;

                        case 2: streamWriter.WriteLine("!pp!");
                            break;

                        case 3: streamWriter.WriteLine("!p!");
                            break;

                        case 4: streamWriter.WriteLine("!mp!");
                            break;

                        case 5: streamWriter.WriteLine("!mf!");
                            break;

                        case 6: streamWriter.WriteLine("!f!");
                            break;

                        case 7: streamWriter.WriteLine("!ff!");
                            break;

                        default: streamWriter.WriteLine("!fff!");
                            break;
                        }
                        streamWriter.Write(voiceABC[i]);
                        streamWriter.WriteLine("z");
                    }
                    else
                    {
                        streamWriter.WriteLine(voiceABC[i]);
                    }
                }
                voiceCount += voiceABC.Count;
            }
        }
    }