preliminary (incomplete) implementation to display scale highlights on piano roll , like lmms

This commit is contained in:
Michael Becker 2019-11-30 05:11:55 -05:00
parent 69f9a4e3be
commit 387f6cded6
No known key found for this signature in database
GPG Key ID: 389DFF5D73781A12
2 changed files with 124 additions and 2 deletions

View File

@ -155,12 +155,66 @@
<Command ID="PianoRollEditor_ContextMenu_InsertLyrics" Title="Insert _Lyrics..." />
<Command ID="PianoRollEditor_ContextMenu_Properties" Title="P_roperties..." />
<Command ID="PianoRollEditor_ContextMenu_Scale_None" Title="_None" />
<Command ID="PianoRollEditor_ContextMenu_Scale_Major" Title="Major" />
<Command ID="PianoRollEditor_ContextMenu_Scale_MinorHarmonic" Title="Harmonic minor" />
<Command ID="PianoRollEditor_ContextMenu_Scale_MinorMelodic" Title="Melodic minor" />
<Command ID="PianoRollEditor_ContextMenu_Scale_Diminished" Title="Diminished" />
<Command ID="PianoRollEditor_ContextMenu_Scale_BebopMajor" Title="Major bebop" />
<Command ID="PianoRollEditor_ContextMenu_Scale_BebopDominant" Title="Dominant bebop" />
<Command ID="PianoRollEditor_ContextMenu_Scale_Arabic" Title="Arabic" />
<Command ID="PianoRollEditor_ContextMenu_Scale_Enigmatic" Title="Enigmatic" />
<Command ID="PianoRollEditor_ContextMenu_Scale_Neopolitan" Title="Melodic minor" />
<Command ID="PianoRollEditor_ContextMenu_Scale_NeopolitanMinor" Title="Neopolitan minor" />
<Command ID="PianoRollEditor_ContextMenu_Scale_HungarianMinor" Title="Hungarian minor" />
<Command ID="PianoRollEditor_ContextMenu_Scale_Dorian" Title="Dorian" />
<Command ID="PianoRollEditor_ContextMenu_Scale_Phyrogolydian" Title="Phyrogolydian" />
<Command ID="PianoRollEditor_ContextMenu_Scale_Lydian" Title="Lydian" />
<Command ID="PianoRollEditor_ContextMenu_Scale_Mixolydian" Title="Mixolydian" />
<Command ID="PianoRollEditor_ContextMenu_Scale_Aeolian" Title="Aeolian" />
<Command ID="PianoRollEditor_ContextMenu_Scale_Locrian" Title="Locrian" />
<Command ID="PianoRollEditor_ContextMenu_Scale_Minor" Title="Minor" />
<Command ID="PianoRollEditor_ContextMenu_Scale_Chromatic" Title="Chromatic" />
<Command ID="PianoRollEditor_ContextMenu_Scale_HalfWholeDiminished" Title="Half-whole diminished" />
<Command ID="PianoRollEditor_ContextMenu_Scale" Title="_Scale">
<Items>
<CommandReference CommandID="PianoRollEditor_ContextMenu_Scale_None" />
<Separator />
<CommandReference CommandID="PianoRollEditor_ContextMenu_Scale_Major" />
<CommandReference CommandID="PianoRollEditor_ContextMenu_Scale_MinorHarmonic" />
<CommandReference CommandID="PianoRollEditor_ContextMenu_Scale_MinorMelodic" />
<CommandReference CommandID="PianoRollEditor_ContextMenu_Scale_Diminished" />
<CommandReference CommandID="PianoRollEditor_ContextMenu_Scale_BebopMajor" />
<CommandReference CommandID="PianoRollEditor_ContextMenu_Scale_BebopDominant" />
<CommandReference CommandID="PianoRollEditor_ContextMenu_Scale_Arabic" />
<CommandReference CommandID="PianoRollEditor_ContextMenu_Scale_Enigmatic" />
<CommandReference CommandID="PianoRollEditor_ContextMenu_Scale_Neopolitan" />
<CommandReference CommandID="PianoRollEditor_ContextMenu_Scale_NeopolitanMinor" />
<CommandReference CommandID="PianoRollEditor_ContextMenu_Scale_HungarianMinor" />
<CommandReference CommandID="PianoRollEditor_ContextMenu_Scale_Dorian" />
<CommandReference CommandID="PianoRollEditor_ContextMenu_Scale_Phyrogolydian" />
<CommandReference CommandID="PianoRollEditor_ContextMenu_Scale_Lydian" />
<CommandReference CommandID="PianoRollEditor_ContextMenu_Scale_Mixolydian" />
<CommandReference CommandID="PianoRollEditor_ContextMenu_Scale_Aeolian" />
<CommandReference CommandID="PianoRollEditor_ContextMenu_Scale_Locrian" />
<CommandReference CommandID="PianoRollEditor_ContextMenu_Scale_Minor" />
<CommandReference CommandID="PianoRollEditor_ContextMenu_Scale_Chromatic" />
<CommandReference CommandID="PianoRollEditor_ContextMenu_Scale_HalfWholeDiminished" />
</Items>
</Command>
<Command ID="PianoRollEditor_ContextMenu_Chord" Title="C_hord" />
<Command ID="PianoRollEditor_ContextMenu">
<Items>
<CommandReference CommandID="PianoRollEditor_ContextMenu_Arrow" />
<CommandReference CommandID="PianoRollEditor_ContextMenu_Draw" />
<CommandReference CommandID="PianoRollEditor_ContextMenu_Erase" />
<Separator />
<CommandReference CommandID="PianoRollEditor_ContextMenu_Scale" />
<CommandReference CommandID="PianoRollEditor_ContextMenu_Chord" />
<Separator />
<CommandReference CommandID="PianoRollEditor_ContextMenu_NoteFixedLength" />
<CommandReference CommandID="PianoRollEditor_ContextMenu_Quantize" />
<CommandReference CommandID="PianoRollEditor_ContextMenu_Length" />

View File

@ -51,6 +51,28 @@ namespace UniversalEditor.Editors.Multimedia.Audio.Synthesized.PianoRoll.Control
Application.AttachCommandEventHandler("PianoRollEditor_ContextMenu_NoteFixedLength_Triplet", ContextMenu_NoteFixedLength_Click);
Application.AttachCommandEventHandler("PianoRollEditor_ContextMenu_NoteFixedLength_Dot", ContextMenu_NoteFixedLength_Click);
Application.AttachCommandEventHandler("PianoRollEditor_ContextMenu_Scale_None", ContextMenu_Scale_Click);
Application.AttachCommandEventHandler("PianoRollEditor_ContextMenu_Scale_Major", ContextMenu_Scale_Click);
Application.AttachCommandEventHandler("PianoRollEditor_ContextMenu_Scale_MinorHarmonic", ContextMenu_Scale_Click);
Application.AttachCommandEventHandler("PianoRollEditor_ContextMenu_Scale_MinorMelodic", ContextMenu_Scale_Click);
Application.AttachCommandEventHandler("PianoRollEditor_ContextMenu_Scale_Diminished", ContextMenu_Scale_Click);
Application.AttachCommandEventHandler("PianoRollEditor_ContextMenu_Scale_BebopMajor", ContextMenu_Scale_Click);
Application.AttachCommandEventHandler("PianoRollEditor_ContextMenu_Scale_BebopDominant", ContextMenu_Scale_Click);
Application.AttachCommandEventHandler("PianoRollEditor_ContextMenu_Scale_Arabic", ContextMenu_Scale_Click);
Application.AttachCommandEventHandler("PianoRollEditor_ContextMenu_Scale_Enigmatic", ContextMenu_Scale_Click);
Application.AttachCommandEventHandler("PianoRollEditor_ContextMenu_Scale_Neopolitan", ContextMenu_Scale_Click);
Application.AttachCommandEventHandler("PianoRollEditor_ContextMenu_Scale_NeopolitanMinor", ContextMenu_Scale_Click);
Application.AttachCommandEventHandler("PianoRollEditor_ContextMenu_Scale_Hungarian", ContextMenu_Scale_Click);
Application.AttachCommandEventHandler("PianoRollEditor_ContextMenu_Scale_Dorian", ContextMenu_Scale_Click);
Application.AttachCommandEventHandler("PianoRollEditor_ContextMenu_Scale_Phyrogolydian", ContextMenu_Scale_Click);
Application.AttachCommandEventHandler("PianoRollEditor_ContextMenu_Scale_Lydian", ContextMenu_Scale_Click);
Application.AttachCommandEventHandler("PianoRollEditor_ContextMenu_Scale_Mixolydian", ContextMenu_Scale_Click);
Application.AttachCommandEventHandler("PianoRollEditor_ContextMenu_Scale_Aeolian", ContextMenu_Scale_Click);
Application.AttachCommandEventHandler("PianoRollEditor_ContextMenu_Scale_Locrian", ContextMenu_Scale_Click);
Application.AttachCommandEventHandler("PianoRollEditor_ContextMenu_Scale_Minor", ContextMenu_Scale_Click);
Application.AttachCommandEventHandler("PianoRollEditor_ContextMenu_Scale_Chromatic", ContextMenu_Scale_Click);
Application.AttachCommandEventHandler("PianoRollEditor_ContextMenu_Scale_HalfWholeDiminished", ContextMenu_Scale_Click);
Application.AttachCommandEventHandler("PianoRollEditor_ContextMenu_ShowGridLines", ContextMenuToggleGridLines_Click);
Application.AttachCommandEventHandler("PianoRollEditor_ContextMenu_Properties", ContextMenuProperties_Click);
}
@ -100,6 +122,39 @@ namespace UniversalEditor.Editors.Multimedia.Audio.Synthesized.PianoRoll.Control
}
}
// TODO: make this more user-friendly
private static Dictionary<string, int[]> Scales = new Dictionary<string, int[]>();
static PianoRollView()
{
Scales.Add("Major", new int[] { 1, 3, 5, 6, 8, 10, 12 });
Scales.Add("MinorHarmonic", new int[] { 1, 3, 4, 6, 7, 10, 12 });
}
private int[] _CurrentScale = null;
public int[] CurrentScale
{
get { return _CurrentScale; }
set
{
_CurrentScale = value;
Refresh();
}
}
private void ContextMenu_Scale_Click(object sender, EventArgs e)
{
Command cmd = (sender as Command);
string sValue = cmd.ID.Substring("PianoRollEditor_ContextMenu_Scale_".Length);
if (Scales.ContainsKey(sValue))
{
CurrentScale = Scales[sValue];
}
else
{
CurrentScale = null;
}
}
protected override void OnBeforeContextMenu(EventArgs e)
{
base.OnBeforeContextMenu(e);
@ -448,7 +503,6 @@ namespace UniversalEditor.Editors.Multimedia.Audio.Synthesized.PianoRoll.Control
}
}
int[] noteValuesBlackKeys = new int[] { 1, 3, 5, 8, 10 };
private Vector2D Quantize(Vector2D pt)
@ -527,7 +581,21 @@ namespace UniversalEditor.Editors.Multimedia.Audio.Synthesized.PianoRoll.Control
int noteValue = (int)(((double)i / gridHeight) % 12) + 1;
if (Array.IndexOf<int>(noteValuesBlackKeys, noteValue) != -1)
{
e.Graphics.FillRectangle(new SolidBrush(Color.FromRGBAByte(0xDD, 0xDD, 0xDD)), new Rectangle(gridRect.X, gridRect.Y + i, gridRect.Width, gridHeight));
if (CurrentScale != null && (Array.IndexOf<int>(CurrentScale, noteValue) != -1))
{
e.Graphics.FillRectangle(new SolidBrush(Color.FromRGBAByte(0xAA, 0xCC, 0xAA)), new Rectangle(gridRect.X, gridRect.Y + i, gridRect.Width, gridHeight));
}
else
{
e.Graphics.FillRectangle(new SolidBrush(Color.FromRGBAByte(0xDD, 0xDD, 0xDD)), new Rectangle(gridRect.X, gridRect.Y + i, gridRect.Width, gridHeight));
}
}
else
{
if (CurrentScale != null && (Array.IndexOf<int>(CurrentScale, noteValue) != -1))
{
e.Graphics.FillRectangle(new SolidBrush(Color.FromRGBAByte(0xAA, 0xDD, 0xAA)), new Rectangle(gridRect.X, gridRect.Y + i, gridRect.Width, gridHeight));
}
}
gridPen.Color = Colors.LightGray;