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); }
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); } }
/// <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); }
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); }
/// <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); }
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); }
/// <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; }
/// <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; }
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); }
/// <summary> /// Forbidden /// </summary> public override void AddRange(VoiceDef voiceDef) { Debug.Assert(false, ForbiddenFunctionMsg); }
/// <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); }
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); }
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; }
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); } }
/// <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(); }