Example #1
0
 public static DiatonicTone Key(
     this KeySignature signature,
     SemiTone tone,
     out PitchTransform transform
     ) =>
 new DiatonicTone(
     signature.KeyOfPitchClass(tone.PitchClass, out transform),
     tone.Octave
     );
Example #2
0
 public Note(
     NoteID id,
     Duration duration,
     SemiTone tone
     )
 {
     this.id       = id;
     this.duration = duration;
     this.tone     = tone;
 }
Example #3
0
        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);
        }
Example #4
0
        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));
        }
Example #5
0
        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);
        }
Example #6
0
        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);
            });
        }
Example #7
0
        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}");
        }
Example #8
0
 public SemiTone Transform(SemiTone natural) =>
 natural + steps;