public static DiatonicTone Key( this KeySignature signature, SemiTone tone, out PitchTransform transform ) => new DiatonicTone( signature.KeyOfPitchClass(tone.PitchClass, out transform), tone.Octave );
public Note( NoteID id, Duration duration, SemiTone tone ) { this.id = id; this.duration = duration; this.tone = tone; }
public NoteID AddNote(SemiTone tone, Duration duration) { var noteID = new NoteID(next_noteID++); next_noteID_obj.WriteAllString(next_noteID.ToString()); var newnote_obj = notes_obj.Graph[notes_obj.Graph.Create()]; newnote_obj.WriteAllString($"{CodeTools.WriteDuration(duration)}\n{tone.Semitones}"); notes_obj.Add(noteID.ToString(), newnote_obj.ID); return(noteID); }
public SemiTone Left(SemiTone wholetone) { PitchTransform transform; var diatone = this.Key(wholetone, out transform); //if (transform.Steps != 0) // return this[diatone.KeyClass] * new SemiTone(diatone.KeyClass.GetPitchClass(), wholetone.Octave); var wholestep = -wholesteps[((int)diatone.KeyClass - 1 + 7) % 7]; return (wholestep * SemiToneOfKey(diatone, transform)); }
SemiTone Effect_ToneChanged_affect(SemiTone tone, Time time, int delta, CaretMode mode, MusicTrack track) { if (mode.HasFlag(CaretMode.Absolute)) { return(new SemiTone(delta)); } else if (!mode.HasFlag(CaretMode.Delta)) { throw new InvalidOperationException(); } if (mode.HasFlag(CaretMode.SemiTones)) { tone += delta; } else if (mode.HasFlag(CaretMode.WholeTones)) { var keysig = track .Adornment .KeySignatures .Intersecting(time) .First() .Value; if (delta > 0) { while (delta-- > 0) { tone = keysig.Right(tone); } } else if (delta < 0) { while (delta++ < 0) { tone = keysig.Left(tone); } } } else { throw new InvalidOperationException(); } return(tone); }
public MelodyTrack( StorageObjectID storageobjectID, EditorFile file ) : base( storageobjectID, file, null //TODO ) { obj = this.Object(); notes_field.GeneralDuration.AfterChange += GeneralDuration_AfterChange; next_noteID_obj = obj.GetOrMake("next_noteID"); listener_nextnodeID_contentsset = next_noteID_obj.CreateListen(IOEvent.ObjectContentsSet, () => { if (!int.TryParse(next_noteID_obj.ReadAllString(), out next_noteID)) { next_noteID_obj.WriteAllString("0"); } }); notes_obj = obj.GetOrMake("notes"); listener_notes_added = notes_obj.CreateListen(IOEvent.ChildAdded, (key, new_note_objID) => { var noteID = new NoteID(int.Parse(key)); var new_note_obj = notes_obj.Graph[new_note_objID]; var contents = new_note_obj.ReadAllString().Split('\n'); var duration = CodeTools.ReadDuration(contents[0]); var tone = new SemiTone(int.Parse(contents[1])); var note = new Note( noteID, duration, tone ); notes_field.Add(noteID, duration); notes_lookup.Add(noteID, note); FieldChanged?.Invoke(duration); }); listener_notes_changed = notes_obj.CreateListen(IOEvent.ChildContentsSet, (key, changed_note_objID) => { var noteID = new NoteID(int.Parse(key)); var new_note_obj = notes_obj.Graph[changed_note_objID]; var contents = new_note_obj.ReadAllString().Split('\n'); var duration = CodeTools.ReadDuration(contents[0]); var tone = new SemiTone(int.Parse(contents[1])); Note oldnote; if (notes_lookup.TryGetValue(noteID, out oldnote)) { if (oldnote.Duration != duration || oldnote.Tone != tone) { var newnote = new Note( noteID, duration, tone ); var oldnoteduration = oldnote.Duration; notes_lookup[noteID] = newnote; notes_field.Move(noteID, oldnoteduration, duration); FieldChanged?.Invoke(oldnoteduration.Union(duration)); } } }); listener_notes_removed = notes_obj.CreateListen(IOEvent.ChildRemoved, (key, old_note_objID) => { var noteID = new NoteID(int.Parse(key)); var oldnote = notes_lookup[noteID]; notes_field.Remove(noteID, oldnote.Duration); notes_lookup.Remove(noteID); FieldChanged?.Invoke(oldnote.Duration); }); }
public void UpdateNote(NoteID noteID, Duration newduration, SemiTone newtone) { var note_obj = notes_obj.Get(noteID.ToString()); note_obj.WriteAllString($"{CodeTools.WriteDuration(newduration)}\n{newtone}"); }
public SemiTone Transform(SemiTone natural) => natural + steps;