internal void harmonizate(Tonality tonality) { int[] scale = tonality.getScale(); for (int i = 0; i < this.musicItemList.Count; i++) { MusicItem mi = musicItemList[i]; if (mi.isChord()) { continue; } Note high = (Note)mi; Chord chord = new Chord(); chord.add(high); int found = 0; int pitch = high.getPitch() - 2; // Substracting 2 to avoid 2-intervals while (found < 2 && pitch > 0) { pitch--; if (tonality.isinTriad(pitch)) { chord.add(new Note(pitch, high.getDuration())); found++; } } musicItemList[i] = chord; } }
internal void modulate(Tonality newTonality) { Tonality oldTonality = this.tonality; this.tonality = newTonality; int[] oldScale = oldTonality.getScale(); int[] newScale = newTonality.getScale(); int[] oldTriad = oldTonality.getTriad(); int[] newTriad = newTonality.getTriad(); int[] permutatedTriad = Note.getClosestPermutation(oldTriad, newTriad); //Si una nota pertenecía a la tonalidad (por lo tanto estará en su escala oldScale[i]), la nota será reemplazada por targetScale[i] int[] targetScale = new int[newScale.Count()]; if (permutatedTriad[0] == newTriad[1]) { targetScale[0] = permutatedTriad[0]; targetScale[1] = newScale[3]; targetScale[2] = permutatedTriad[1]; targetScale[3] = newScale[5]; targetScale[4] = permutatedTriad[2]; targetScale[5] = newScale[1]; targetScale[6] = newScale[1]; if (Note.getNoteDistance(oldScale[3], newScale[6]) < Note.getNoteDistance(oldScale[3], newScale[5])) { targetScale[3] = newScale[6]; } } else if (permutatedTriad[0] == newTriad[2]) { targetScale[0] = permutatedTriad[0]; targetScale[1] = newScale[5]; targetScale[2] = permutatedTriad[1]; targetScale[3] = newScale[1]; targetScale[4] = permutatedTriad[2]; targetScale[5] = newScale[3]; targetScale[6] = newScale[3]; if (Note.getNoteDistance(oldScale[1], newScale[6]) < Note.getNoteDistance(oldScale[1], newScale[5])) { targetScale[1] = newScale[6]; } } else //Si la triada está sin permutar (permutatedTriad[0] == newTriad[0]) { targetScale = newScale; } //Aplicamos el transporte voz a voz foreach (Voice v in this.voiceList) { v.modulate(oldTonality, targetScale); } }
internal void RachmaninoffInvert(Tonality tonality) { int mean = this.pitchMean(); int thirdPitch = tonality.getScale()[2]; thirdPitch = Note.convertToClosestPitch(mean, thirdPitch); //Aplicar inversion foreach (MusicItem mi in this.musicItemList) { mi.RachmaninoffInvert(thirdPitch, tonality); } }
public override void modulate(Tonality oldTonality, int[] targetScale) { if (this.isSilence()) { return; } int[] oldScale = oldTonality.getScale(); //Modificamos la altura de la nota solo si pertenecía a la tonalidad. for (int i = 0; i < oldScale.Length; i++) { if (Note.isSameNote(this.pitch, oldScale[i])) { this.pitch = convertToClosestPitch(pitch, targetScale[i]); return; } } }