示例#1
0
        private List <VoiceDef> WriteLowerStaff(int staffNumber, List <VoiceDef> topStaffBars)
        {
            List <VoiceDef>    consecutiveBars  = new List <VoiceDef>();
            Krystal            krystal          = _krystals[staffNumber - 1];
            Palette            palette          = _palettes[staffNumber - 1];
            List <List <int> > strandValuesList = krystal.GetValues(krystal.Level);

            Debug.Assert(topStaffBars.Count == strandValuesList.Count);

            for (int barIndex = 0; barIndex < strandValuesList.Count; barIndex++)
            {
                VoiceDef topStaffVoice     = topStaffBars[barIndex];
                VoiceDef newVoice          = new TrkDef((byte)(staffNumber - 1), new List <IUniqueDef>());
                int      currentMsPosition = topStaffVoice.UniqueDefs[0].MsPosition;

                List <int> lowerStaffValueSequence = strandValuesList[barIndex];
                List <int> lowerStaffMsDurations   = LowerStaffMsDurations(topStaffVoice, lowerStaffValueSequence.Count);
                for (int valueIndex = 0; valueIndex < lowerStaffValueSequence.Count; valueIndex++)
                {
                    int        value   = lowerStaffValueSequence[valueIndex];
                    IUniqueDef noteDef = palette.UniqueDurationDef(value - 1);
                    noteDef.MsDuration = lowerStaffMsDurations[valueIndex];
                    noteDef.MsPosition = currentMsPosition;
                    currentMsPosition += noteDef.MsDuration;
                    newVoice.UniqueDefs.Add(noteDef);
                }

                consecutiveBars.Add(newVoice);
            }
            return(consecutiveBars);
        }
示例#2
0
        private void WriteDurationSymbolsForStrandInTopStaff(VoiceDef voice, int barIndex, List <int> originalStrandValues, ref int msPosition)
        {
            Palette palette = _palettes[0]; // top templateDefs

            for (int valueIndex = 0; valueIndex < originalStrandValues.Count; valueIndex++)
            {
                int        value   = originalStrandValues[valueIndex];
                IUniqueDef noteDef = palette.UniqueDurationDef(value - 1);
                noteDef.MsPosition = msPosition;
                msPosition        += noteDef.MsDuration;
                voice.UniqueDefs.Add(noteDef);
            }
        }
示例#3
0
        /// <summary>
        /// Writes the first rest (if any) and the VoiceDef to the voice.
        /// Returns the endMsPos of the VoiceDef.
        /// </summary>
        private int WriteVoiceMidiDurationDefsInBar2(VoiceDef voice, TrkDef trkDef, int msPosition, int bar2StartMsPos)
        {
            if (msPosition > bar2StartMsPos)
            {
                RestDef rest1Def = new RestDef(bar2StartMsPos, msPosition - bar2StartMsPos);
                voice.UniqueDefs.Add(rest1Def);
            }

            trkDef.StartMsPosition = msPosition;
            foreach (IUniqueDef iu in trkDef)
            {
                voice.UniqueDefs.Add(iu);
            }

            return(trkDef.EndMsPosition);
        }
示例#4
0
        private string BasicChecks(List <List <VoiceDef> > voiceDefsPerSystemPerBar)
        {
            string          errorString = null;
            List <VoiceDef> bar1        = voiceDefsPerSystemPerBar[0];

            if (NOutputVoices(bar1) != _algorithm.MidiChannelIndexPerOutputVoice.Count)
            {
                return("The algorithm does not declare the correct number of output voices.");
            }
            if (NInputVoices(bar1) != _algorithm.NumberOfInputVoices)
            {
                return("The algorithm does not declare the correct number of input voices.");
            }
            foreach (List <VoiceDef> bar in voiceDefsPerSystemPerBar)
            {
                if (bar.Count == 0)
                {
                    errorString = "One bar (at least) contains no voices.";
                    break;
                }
                if (!(bar[0] is TrkDef))
                {
                    errorString = "The top (first) voice in every bar must be an output voice.";
                    break;
                }
                for (int voiceIndex = 0; voiceIndex < bar.Count; ++voiceIndex)
                {
                    VoiceDef voiceDef = bar[voiceIndex];
                    if (voiceDef.UniqueDefs.Count == 0)
                    {
                        errorString = "A voiceDef (voiceIndex=" + voiceIndex.ToString() + ") has an empty UniqueDefs list.";
                        break;
                    }
                }
                if (!string.IsNullOrEmpty(errorString))
                {
                    break;
                }
            }
            return(errorString);
        }
示例#5
0
 /// <summary>
 /// Adds the argument to the end of this VoiceDef.
 /// Sets the MsPositions of the appended UniqueDefs re the first iUniqueDef in the list.
 /// </summary>
 public override void AddRange(VoiceDef inputVoiceDef)
 {
     Debug.Assert(inputVoiceDef is InputVoiceDef);
     _AddRange(inputVoiceDef);
 }
示例#6
0
 private void InsertVoiceDefInRest(int restIndex, VoiceDef iVoiceDef)
 {
     List<IUniqueDef> lmdds = _uniqueDefs;
     IUniqueDef rest = lmdds[restIndex];
     List<IUniqueDef> replacement = GetReplacementList(rest, iVoiceDef);
     int replacementStartMsPosReFirstIUD = replacement[0].MsPositionReFirstUD;
     int replacementEndMsPosReFirstIUD = replacement[replacement.Count - 1].MsPositionReFirstUD + replacement[replacement.Count - 1].MsDuration;
     int restStartMsPosReFirstIUD = rest.MsPositionReFirstUD;
     int restEndMsPosReFirstIUD = rest.MsPositionReFirstUD + rest.MsDuration;
     Debug.Assert(restStartMsPosReFirstIUD == replacementStartMsPosReFirstIUD && restEndMsPosReFirstIUD == replacementEndMsPosReFirstIUD);
     lmdds.RemoveAt(restIndex);
     lmdds.InsertRange(restIndex, replacement);
 }
示例#7
0
        /// <summary>
        /// Returns a list having the position and duration of the originalRest.
        /// The iLmdds have been put in(side) the original rest, either at the beginning, middle, or end. 
        /// </summary>
        private List<IUniqueDef> GetReplacementList(IUniqueDef originalRest, VoiceDef iVoiceDef)
        {
            Debug.Assert(originalRest is RestDef);
            Debug.Assert(iVoiceDef[0] is MidiChordDef || iVoiceDef[0] is InputChordDef);
            Debug.Assert(iVoiceDef[iVoiceDef.Count - 1] is MidiChordDef || iVoiceDef[iVoiceDef.Count - 1] is InputChordDef);

            List<IUniqueDef> rList = new List<IUniqueDef>();
            if(iVoiceDef[0].MsPositionReFirstUD > originalRest.MsPositionReFirstUD)
            {
                RestDef rest1 = new RestDef(originalRest.MsPositionReFirstUD, iVoiceDef[0].MsPositionReFirstUD - originalRest.MsPositionReFirstUD);
                rList.Add(rest1);
            }
            rList.AddRange(iVoiceDef.UniqueDefs);
            int iudEndMsPosReFirstIUD = iVoiceDef[iVoiceDef.Count - 1].MsPositionReFirstUD + iVoiceDef[iVoiceDef.Count - 1].MsDuration;
            int originalRestEndMsPosReFirstIUD = originalRest.MsPositionReFirstUD + originalRest.MsDuration;
            if(originalRestEndMsPosReFirstIUD > iudEndMsPosReFirstIUD)
            {
                RestDef rest2 = new RestDef(iudEndMsPosReFirstIUD, originalRestEndMsPosReFirstIUD - iudEndMsPosReFirstIUD);
                rList.Add(rest2);
            }

            return rList;
        }
示例#8
0
        /// <summary>
        /// Writes the first rest (if any) and the VoiceDef to the voice.
        /// Returns the endMsPos of the VoiceDef. 
        /// </summary>
        private int WriteVoiceMidiDurationDefsInBar2(VoiceDef voice, TrkDef trkDef, int msPosition, int bar2StartMsPos)
        {
            if(msPosition > bar2StartMsPos)
            {
                RestDef rest1Def = new RestDef(bar2StartMsPos, msPosition - bar2StartMsPos);
                voice.UniqueDefs.Add(rest1Def);
            }

            trkDef.StartMsPosition = msPosition;
            foreach(IUniqueDef iu in trkDef)
            {
                voice.UniqueDefs.Add(iu);
            }

            return trkDef.EndMsPosition;
        }
示例#9
0
        private List <int> LowerStaffMsDurations(VoiceDef topStaffVoice, int numberOfDurationSymbolsToConstruct)
        {
            #region get topStaffVoice durations and positions
            int voiceMsDuration      = 0;
            int numberOfTopDurations = 0;
            foreach (IUniqueDef iumdd in topStaffVoice.UniqueDefs)
            {
                voiceMsDuration += iumdd.MsDuration;
                numberOfTopDurations++;
            }
            Debug.Assert(numberOfTopDurations > 0);

            int        equal1MsDuration   = voiceMsDuration / numberOfTopDurations;
            List <int> equal1MsPositions  = new List <int>();
            int        equal1MsPosition   = 0;
            List <int> actual1MsPositions = new List <int>();
            List <int> actual1MsDurations = new List <int>();
            foreach (IUniqueDef iumdd in topStaffVoice.UniqueDefs)
            {
                equal1MsPositions.Add(equal1MsPosition);
                equal1MsPosition += equal1MsDuration;

                actual1MsPositions.Add(iumdd.MsPosition);
                actual1MsDurations.Add(iumdd.MsDuration);
            }
            for (int i = 0; i < equal1MsPositions.Count; i++)
            {
                equal1MsPositions[i] += actual1MsPositions[0];
            }
            int followingBarlinePosition = equal1MsPositions[0] + voiceMsDuration;
            #endregion

            #region get the (hypothetical) equal durations and positions in newVoice
            Debug.Assert(numberOfDurationSymbolsToConstruct > 0);

            int        equal2MsDuration  = voiceMsDuration / numberOfDurationSymbolsToConstruct;
            List <int> equal2MsPositions = new List <int>();
            int        equal2MsPosition  = 0;
            for (int i = 0; i < numberOfDurationSymbolsToConstruct; i++)
            {
                equal2MsPositions.Add(equal2MsPosition);
                equal2MsPosition += equal2MsDuration;
            }
            for (int i = 0; i < equal2MsPositions.Count; i++)
            {
                equal2MsPositions[i] += actual1MsPositions[0];
            }
            #endregion

            #region get newVoice MsPositions
            List <int> actualStaff2MsPositions = new List <int>();
            int        actualStaff2MsPosition  = 0;
            if (equal1MsPositions.Count == 1)
            {
                actualStaff2MsPositions = equal2MsPositions;
            }
            else
            {
                foreach (int e2MsPosition in equal2MsPositions)
                {
                    int upperLimit = 0;
                    for (int i = 0; i < equal1MsPositions.Count; i++)
                    {
                        if (i == (equal1MsPositions.Count - 1))
                        {
                            upperLimit = followingBarlinePosition;
                        }
                        else
                        {
                            upperLimit = equal1MsPositions[i + 1];
                        }
                        if (e2MsPosition < upperLimit && e2MsPosition >= equal1MsPositions[i])
                        {
                            actualStaff2MsPosition = actual1MsPositions[i] +
                                                     (((e2MsPosition - equal1MsPositions[i]) * actual1MsDurations[i]) / equal1MsDuration);
                            break;
                        }
                    }
                    actualStaff2MsPositions.Add(actualStaff2MsPosition);
                }
            }
            Debug.Assert(actualStaff2MsPositions.Count == numberOfDurationSymbolsToConstruct);
            #endregion

            #region set newVoice MsDurations
            List <int> lowerStaffMsDurations = new List <int>();
            for (int i = 1; i < numberOfDurationSymbolsToConstruct; i++)
            {
                lowerStaffMsDurations.Add(actualStaff2MsPositions[i] - actualStaff2MsPositions[i - 1]);
            }
            lowerStaffMsDurations.Add(followingBarlinePosition - actualStaff2MsPositions[numberOfDurationSymbolsToConstruct - 1]);
            #endregion
            return(lowerStaffMsDurations);
        }
示例#10
0
 /// <summary>
 /// Forbidden
 /// </summary>
 public override void AddRange(VoiceDef voiceDef)
 {
     Debug.Assert(false, ForbiddenFunctionMsg);
 }
示例#11
0
文件: Trk.cs 项目: notator/Moritz
 /// <summary>
 /// Adds the argument's UniqueDefs to the end of this Trk.
 /// Sets the MsPositions of the appended UniqueDefs.
 /// </summary>
 public override void AddRange(VoiceDef trk)
 {
     Debug.Assert(trk is Trk);
     _AddRange(trk);
 }
示例#12
0
        List <VoiceDef> CreateBar1()
        {
            List <VoiceDef> bar = new List <VoiceDef>();

            byte channel = 0;

            foreach (Palette palette in _palettes)
            {
                TrkDef trkDef = new TrkDef(channel, new List <IUniqueDef>());
                bar.Add(trkDef);
                WriteVoiceMidiDurationDefs1(trkDef, palette);
                ++channel;
            }

            InputVoiceDef inputVoiceDef     = new InputVoiceDef();
            VoiceDef      bottomOutputVoice = bar[0];

            foreach (IUniqueDef iud in bottomOutputVoice.UniqueDefs)
            {
                MidiChordDef mcd = iud as MidiChordDef;
                RestDef      rd  = iud as RestDef;
                if (mcd != null)
                {
                    List <IUniqueDef> iuds = new List <IUniqueDef>()
                    {
                        (IUniqueDef)mcd
                    };

                    // Note that the msPosition of the trkDef is trkDef.StartMsPosition (= iuds[0].msPosition),
                    // which may be greater than the InputChordDef's msPosition
                    TrkDef trkDef = new TrkDef(bottomOutputVoice.MidiChannel, iuds);

                    // If non-null, arg2 overrides the inputControls attached to the InputNote or InputChord.
                    TrkOn        trkRef  = new TrkOn(trkDef, null);
                    List <TrkOn> trkRefs = new List <TrkOn>()
                    {
                        trkRef
                    };
                    TrkOns trkOns = new TrkOns(trkRefs, null);

                    byte      displayPitch = (byte)(mcd.NotatedMidiPitches[0] + 36);
                    Pressure  pressure     = new Pressure(0, null);
                    Pressures pressures    = new Pressures(new List <Pressure>()
                    {
                        pressure
                    }, null);
                    TrkOff        trkOff         = new TrkOff(trkRef.TrkMidiChannel, mcd.MsPosition, null);
                    List <TrkOff> noteOffTrkOffs = new List <TrkOff>()
                    {
                        trkOff
                    };
                    TrkOffs trkOffs = new TrkOffs(noteOffTrkOffs, null);

                    InputNoteDef inputNoteDef = new InputNoteDef(displayPitch,
                                                                 trkOns, null,
                                                                 pressures,
                                                                 null, trkOffs,
                                                                 null);

                    List <InputNoteDef> inputNoteDefs = new List <InputNoteDef>()
                    {
                        inputNoteDef
                    };

                    // The InputChordDef's msPosition must be <= the msPosition of any of the contained trkRefs
                    InputChordDef icd = new InputChordDef(mcd.MsPosition, mcd.MsDuration, inputNoteDefs);

                    inputVoiceDef.UniqueDefs.Add(icd);
                }
                else if (rd != null)
                {
                    RestDef newRest = new RestDef(rd.MsPosition, rd.MsDuration);
                    inputVoiceDef.UniqueDefs.Add(newRest);
                }
            }

            #region set cascading inputControls on the first InputChordDef  (for testing)
            InputChordDef inputChordDef1 = inputVoiceDef.UniqueDefs[0] as InputChordDef;             // no need to check for null here.

            InputControls chordInputControls = new InputControls();

            chordInputControls.VelocityOption  = VelocityOption.overridden;
            chordInputControls.MinimumVelocity = 19;
            inputChordDef1.InputControls       = chordInputControls;

            InputControls noteInputControls = new InputControls();
            noteInputControls.VelocityOption              = VelocityOption.scaled;
            noteInputControls.MinimumVelocity             = 20;
            inputChordDef1.InputNoteDefs[0].InputControls = noteInputControls;

            #endregion

            bar.Add(inputVoiceDef);

            return(bar);
        }
示例#13
0
        private List<int> LowerStaffMsDurations(VoiceDef topStaffVoice, int numberOfDurationSymbolsToConstruct)
        {
            #region get topStaffVoice durations and positions
            int voiceMsDuration = 0;
            int numberOfTopDurations = 0;
            foreach(IUniqueDef iumdd in topStaffVoice.UniqueDefs)
            {
                voiceMsDuration += iumdd.MsDuration;
                numberOfTopDurations++;
            }
            Debug.Assert(numberOfTopDurations > 0);

            int equal1MsDuration = voiceMsDuration / numberOfTopDurations;
            List<int> equal1MsPositions = new List<int>();
            int equal1MsPosition = 0;
            List<int> actual1MsPositionsReFirstIUD = new List<int>();
            List<int> actual1MsDurations = new List<int>();
            foreach(IUniqueDef iumdd in topStaffVoice.UniqueDefs)
            {
                equal1MsPositions.Add(equal1MsPosition);
                equal1MsPosition += equal1MsDuration;

                actual1MsPositionsReFirstIUD.Add(iumdd.MsPositionReFirstUD);
                actual1MsDurations.Add(iumdd.MsDuration);
            }
            for(int i = 0; i < equal1MsPositions.Count; i++)
            {
                equal1MsPositions[i] += actual1MsPositionsReFirstIUD[0];
            }
            int followingBarlinePosition = equal1MsPositions[0] + voiceMsDuration;
            #endregion

            #region get the (hypothetical) equal durations and positions in newVoice
            Debug.Assert(numberOfDurationSymbolsToConstruct > 0);

            int equal2MsDuration = voiceMsDuration / numberOfDurationSymbolsToConstruct;
            List<int> equal2MsPositions = new List<int>();
            int equal2MsPosition = 0;
            for(int i = 0; i < numberOfDurationSymbolsToConstruct; i++)
            {
                equal2MsPositions.Add(equal2MsPosition);
                equal2MsPosition += equal2MsDuration;
            }
            for(int i = 0; i < equal2MsPositions.Count; i++)
            {
                equal2MsPositions[i] += actual1MsPositionsReFirstIUD[0];
            }
            #endregion

            #region get newVoice MsPositions
            List<int> actualStaff2MsPositions = new List<int>();
            int actualStaff2MsPosition = 0;
            if(equal1MsPositions.Count == 1)
            {
                actualStaff2MsPositions = equal2MsPositions;
            }
            else
            {
                foreach(int e2MsPosition in equal2MsPositions)
                {
                    int upperLimit = 0;
                    for(int i = 0; i < equal1MsPositions.Count; i++)
                    {
                        if(i == (equal1MsPositions.Count - 1))
                            upperLimit = followingBarlinePosition;
                        else upperLimit = equal1MsPositions[i + 1];
                        if(e2MsPosition < upperLimit && e2MsPosition >= equal1MsPositions[i])
                        {
                            actualStaff2MsPosition = actual1MsPositionsReFirstIUD[i] +
                                (((e2MsPosition - equal1MsPositions[i]) * actual1MsDurations[i]) / equal1MsDuration);
                            break;
                        }
                    }
                    actualStaff2MsPositions.Add(actualStaff2MsPosition);
                }
            }
            Debug.Assert(actualStaff2MsPositions.Count == numberOfDurationSymbolsToConstruct);
            #endregion

            #region set newVoice MsDurations
            List<int> lowerStaffMsDurations = new List<int>();
            for(int i = 1; i < numberOfDurationSymbolsToConstruct; i++)
            {
                lowerStaffMsDurations.Add(actualStaff2MsPositions[i] - actualStaff2MsPositions[i - 1]);
            }
            lowerStaffMsDurations.Add(followingBarlinePosition - actualStaff2MsPositions[numberOfDurationSymbolsToConstruct - 1]);
            #endregion
            return lowerStaffMsDurations;
        }
示例#14
0
 private void WriteDurationSymbolsForStrandInTopStaff(VoiceDef voice, int barIndex, List<int> originalStrandValues, ref int msPositionReFirstIUD)
 {
     Palette palette = _palettes[0]; // top templateDefs
     for(int valueIndex = 0; valueIndex < originalStrandValues.Count; valueIndex++)
     {
         int value = originalStrandValues[valueIndex];
         IUniqueDef noteDef = palette.UniqueDurationDef(value - 1);
         noteDef.MsPositionReFirstUD = msPositionReFirstIUD;
         msPositionReFirstIUD += noteDef.MsDuration;
         voice.UniqueDefs.Add(noteDef);
     }
 }
示例#15
0
文件: Grp.cs 项目: notator/Moritz
 /// <summary>
 /// Adds the argument's UniqueDefs to the end of this Trk.
 /// Sets the MsPositions of the appended UniqueDefs.
 /// </summary>
 public override void AddRange(VoiceDef voiceDef)
 {
     Debug.Assert(_gamut != null);
     foreach(IUniqueDef iud in voiceDef.UniqueDefs)
     {
         AssertPitches(iud);
     }
     base.AddRange(voiceDef);
     SetBeamEnd();
 }