|"Notebook" -> <|"Controller" -> "f6300315-ff63-4312-bc49-dbc30d206f7b",
"FocusedCell" -> CoffeeLiqueur`Notebook`Cells`CellObj[
CoffeeLiqueur`Notebook`Cells`CellObj`$332], "HaveToSaveAs" -> False,
"MessangerChannel" -> Messanger, "ModalsChannel" ->
"45d6a684-5535-4fb3-bcd5-9551ef067a9b",
"Objects" -> <|"532235e0-ff61-4965-a2a8-164886fc87e2" ->
<|"Public" -> Hold[CellView[
"
FrontEndExecutable[93190ffa-364f-4471-893e-31274e5d9abc]
",
"Display" -> "wlx"]]|>, "8b2319a0-4025-4f50-96b5-be8bc20c09ea" ->
<|"Public" -> Hold[CellView["FrontEndExecutable[cc92465a-d374-4192-805d-5b140ea9a315]
", "Display" ->
"wlx"]]|>, "86bbb3ec-f889-4529-bed3-2e6fc0106020" ->
<|"Public" -> Hold[Graphics[{{{Line[{{0.06470476127563017,
0.24148145657226705}, {0.2588190451025207,
0.9659258262890682}}], Text["I", {0, 1}, {0, 0}],
{Opacity[0.3], RGBColor[0.30980392156862746,
0.47058823529411764, 0.34509803921568627],
Rotate[{EventListener[Polygon[{{0.1616928484400852,
0.6034459255989321}, {0.15808336399480044,
0.6046773106608907}, {0.06835700523617148,
0.6212506095249661}, {-0.022826264411036773,
0.6245830302313996}, {-0.11352303186214777,
0.6146035480184163}, {-0.1613333584687302,
0.6021042907610239}, {-0.2420000377030953,
0.9031564361415358}, {-0.17028454779322166,
0.9219053220276244}, {-0.03423939661655516,
0.9368745453470995}, {0.10253550785425723,
0.9318759142874493}, {0.2371250459922007,
0.9070159659913362}, {0.2425392726601278,
0.9051688883983983}}], {"click" ->
"7fb14808-d204-4ab0-b152-ddd51f6f0f6f"}], Opacity[1],
Directive[FontSize -> 14], Text["C",
{0.000022492509783969572, 0.7812684418588233}, {0, 0}]}, 0, {
0, 0}]}}, {Line[{{0.17677669529663687, 0.17677669529663687}, {
0.7071067811865475, 0.7071067811865475}}],
Text["II", {Rational[1, 2], Rational[1, 2]*Sqrt[3]}, {0, 0}],
{Opacity[0.3], RGBColor[0.2980392156862745, 0.28627450980392155,
0.5490196078431373], Rotate[{EventListener[Polygon[
{{0.06467713937603409, 0.24137837023957287},
{0.06323334559792018, 0.2418709242643563},
{0.027342802094468596, 0.24850024380998648},
{-0.00913050576441471, 0.24983321209255985},
{-0.04540921274485911, 0.24584141920736652},
{-0.06453334338749209, 0.24084171630440956},
{-0.1613333584687302, 0.6021042907610239},
{-0.11352303186214777, 0.6146035480184163},
{-0.022826264411036773, 0.6245830302313996},
{0.06835700523617148, 0.6212506095249661},
{0.15808336399480044, 0.6046773106608907},
{0.16169284844008516, 0.6034459255989321}}],
{"click" -> "a4906cde-cb98-4071-bb42-2afb0acc868d"}],
Opacity[1], Directive[FontSize -> 14], Text["Dm",
{0.000013191095963502262, 0.4581875072555506}, {0, 0}]},
Rational[1, 6]*Pi, {0, 0}]}}, {Line[{{0.24148145657226705,
0.06470476127563017}, {0.9659258262890682,
0.2588190451025207}}], Text["III", {Rational[1, 2]*Sqrt[3],
Rational[1, 2]}, {0, 0}], {Opacity[0.3], RGBColor[
0.27058823529411763, 0.1843137254901961, 0.3764705882352941],
Rotate[{EventListener[Polygon[{{0.06467713937603409,
0.24137837023957287}, {0.06323334559792018,
0.2418709242643563}, {0.027342802094468596,
0.24850024380998648}, {-0.00913050576441471,
0.24983321209255985}, {-0.04540921274485911,
0.24584141920736652}, {-0.06453334338749209,
0.24084171630440956}, {-0.1613333584687302,
0.6021042907610239}, {-0.11352303186214777,
0.6146035480184163}, {-0.022826264411036773,
0.6245830302313996}, {0.06835700523617148,
0.6212506095249661}, {0.15808336399480044,
0.6046773106608907}, {0.16169284844008516,
0.6034459255989321}}], {"click" ->
"b2a8a336-e3df-44bd-bd55-319af2bee171"}], Opacity[1],
Directive[FontSize -> 14], Text["Em",
{0.000013191095963502262, 0.4581875072555506}, {0, 0}]},
Rational[1, 3]*Pi, {0, 0}]}}, {Line[{{0.24148145657226705,
-0.06470476127563017}, {0.9659258262890682,
-0.2588190451025207}}], Text["IV", {1, 0}, {0, 0}],
{Opacity[0.3], RGBColor[0.8784313725490196, 0.10196078431372549,
0.20784313725490197], Rotate[{EventListener[Polygon[
{{0.1616928484400852, 0.6034459255989321},
{0.15808336399480044, 0.6046773106608907},
{0.06835700523617148, 0.6212506095249661},
{-0.022826264411036773, 0.6245830302313996},
{-0.11352303186214777, 0.6146035480184163},
{-0.1613333584687302, 0.6021042907610239},
{-0.2420000377030953, 0.9031564361415358},
{-0.17028454779322166, 0.9219053220276244},
{-0.03423939661655516, 0.9368745453470995},
{0.10253550785425723, 0.9318759142874493},
{0.2371250459922007, 0.9070159659913362},
{0.2425392726601278, 0.9051688883983983}}],
{"click" -> "0b649098-647f-48f0-8b71-a5c665d8ad86"}],
Opacity[1], Directive[FontSize -> 14], Text["F",
{0.000022492509783969572, 0.7812684418588233}, {0, 0}]},
Rational[1, 2]*Pi, {0, 0}]}}, {Line[{{0.17677669529663687,
-0.17677669529663687}, {0.7071067811865475,
-0.7071067811865475}}], Text["V", {Rational[1, 2]*Sqrt[3],
Rational[-1, 2]}, {0, 0}], {Opacity[0.3], RGBColor[0.8,
0.058823529411764705, 0.07450980392156863],
Rotate[{EventListener[Polygon[{{0.1616928484400852,
0.6034459255989321}, {0.15808336399480044,
0.6046773106608907}, {0.06835700523617148,
0.6212506095249661}, {-0.022826264411036773,
0.6245830302313996}, {-0.11352303186214777,
0.6146035480184163}, {-0.1613333584687302,
0.6021042907610239}, {-0.2420000377030953,
0.9031564361415358}, {-0.17028454779322166,
0.9219053220276244}, {-0.03423939661655516,
0.9368745453470995}, {0.10253550785425723,
0.9318759142874493}, {0.2371250459922007,
0.9070159659913362}, {0.2425392726601278,
0.9051688883983983}}], {"click" ->
"61ea9aed-e414-45bb-a193-d0800ad468c1"}], Opacity[1],
Directive[FontSize -> 14], Text["G",
{0.000022492509783969572, 0.7812684418588233}, {0, 0}]},
Rational[2, 3]*Pi, {0, 0}]}}, {Line[{{0.06470476127563017,
-0.24148145657226705}, {0.2588190451025207,
-0.9659258262890682}}], Text["VI", {Rational[1, 2],
Rational[-1, 2]*Sqrt[3]}, {0, 0}], {Opacity[0.3],
RGBColor[0.803921568627451, 0.30980392156862746,
0.07058823529411765], Rotate[{EventListener[Polygon[
{{0.06467713937603409, 0.24137837023957287},
{0.06323334559792018, 0.2418709242643563},
{0.027342802094468596, 0.24850024380998648},
{-0.00913050576441471, 0.24983321209255985},
{-0.04540921274485911, 0.24584141920736652},
{-0.06453334338749209, 0.24084171630440956},
{-0.1613333584687302, 0.6021042907610239},
{-0.11352303186214777, 0.6146035480184163},
{-0.022826264411036773, 0.6245830302313996},
{0.06835700523617148, 0.6212506095249661},
{0.15808336399480044, 0.6046773106608907},
{0.16169284844008516, 0.6034459255989321}}],
{"click" -> "ffb0f742-ddca-45e5-a08b-0a778f216e4f"}],
Opacity[1], Directive[FontSize -> 14], Text["Am",
{0.000013191095963502262, 0.4581875072555506}, {0, 0}]},
Rational[5, 6]*Pi, {0, 0}]}}, {Line[{{-0.06470476127563017,
-0.24148145657226705}, {-0.2588190451025207,
-0.9659258262890682}}], Text["VII", {0, -1}, {0, 0}],
{Opacity[0.3], RGBColor[1, 0.7254901960784313,
0.09411764705882353], Rotate[{EventListener[Polygon[
{{0.06467713937603409, 0.24137837023957287},
{0.06323334559792018, 0.2418709242643563},
{0.027342802094468596, 0.24850024380998648},
{-0.00913050576441471, 0.24983321209255985},
{-0.04540921274485911, 0.24584141920736652},
{-0.06453334338749209, 0.24084171630440956},
{-0.1613333584687302, 0.6021042907610239},
{-0.11352303186214777, 0.6146035480184163},
{-0.022826264411036773, 0.6245830302313996},
{0.06835700523617148, 0.6212506095249661},
{0.15808336399480044, 0.6046773106608907},
{0.16169284844008516, 0.6034459255989321}}],
{"click" -> "597ae859-5df4-4b37-87bd-da9447c02b35"}],
Opacity[1], Directive[FontSize -> 14], Text["Bm",
{0.000013191095963502262, 0.4581875072555506}, {0, 0}]}, Pi,
{0, 0}]}}, {Line[{{-0.17677669529663687,
-0.17677669529663687}, {-0.7071067811865475,
-0.7071067811865475}}], Text["VIII", {Rational[-1, 2],
Rational[-1, 2]*Sqrt[3]}, {0, 0}], {Opacity[0.3],
RGBColor[0.9568627450980393, 0.796078431372549,
0.13725490196078433], Rotate[{EventListener[Polygon[
{{0.1616928484400852, 0.6034459255989321},
{0.15808336399480044, 0.6046773106608907},
{0.06835700523617148, 0.6212506095249661},
{-0.022826264411036773, 0.6245830302313996},
{-0.11352303186214777, 0.6146035480184163},
{-0.1613333584687302, 0.6021042907610239},
{-0.2420000377030953, 0.9031564361415358},
{-0.17028454779322166, 0.9219053220276244},
{-0.03423939661655516, 0.9368745453470995},
{0.10253550785425723, 0.9318759142874493},
{0.2371250459922007, 0.9070159659913362},
{0.2425392726601278, 0.9051688883983983}}],
{"click" -> "fc05dc16-949e-425d-ba2d-394a798e3c62"}],
Opacity[1], Directive[FontSize -> 14], Text["C",
{0.000022492509783969572, 0.7812684418588233}, {0, 0}]},
Rational[7, 6]*Pi, {0, 0}]}}, {Line[{{-0.24148145657226705,
-0.06470476127563017}, {-0.9659258262890682,
-0.2588190451025207}}], Text["IX", {Rational[-1, 2]*Sqrt[3],
Rational[-1, 2]}, {0, 0}], {Opacity[0.3], RGBColor[
0.9529411764705882, 0.9803921568627451, 0.5725490196078431],
Rotate[{EventListener[Polygon[{{0.06467713937603409,
0.24137837023957287}, {0.06323334559792018,
0.2418709242643563}, {0.027342802094468596,
0.24850024380998648}, {-0.00913050576441471,
0.24983321209255985}, {-0.04540921274485911,
0.24584141920736652}, {-0.06453334338749209,
0.24084171630440956}, {-0.1613333584687302,
0.6021042907610239}, {-0.11352303186214777,
0.6146035480184163}, {-0.022826264411036773,
0.6245830302313996}, {0.06835700523617148,
0.6212506095249661}, {0.15808336399480044,
0.6046773106608907}, {0.16169284844008516,
0.6034459255989321}}], {"click" ->
"d21ea44d-249c-4f12-8935-fbe3c3739b79"}], Opacity[1],
Directive[FontSize -> 14], Text["Dm",
{0.000013191095963502262, 0.4581875072555506}, {0, 0}]},
Rational[4, 3]*Pi, {0, 0}]}}, {Line[{{-0.24148145657226705,
0.06470476127563017}, {-0.9659258262890682,
0.2588190451025207}}], Text["X", {-1, 0}, {0, 0}],
{Opacity[0.3], RGBColor[0.4117647058823529, 0.592156862745098,
0.4], Rotate[{EventListener[Polygon[{{0.06467713937603409,
0.24137837023957287}, {0.06323334559792018,
0.2418709242643563}, {0.027342802094468596,
0.24850024380998648}, {-0.00913050576441471,
0.24983321209255985}, {-0.04540921274485911,
0.24584141920736652}, {-0.06453334338749209,
0.24084171630440956}, {-0.1613333584687302,
0.6021042907610239}, {-0.11352303186214777,
0.6146035480184163}, {-0.022826264411036773,
0.6245830302313996}, {0.06835700523617148,
0.6212506095249661}, {0.15808336399480044,
0.6046773106608907}, {0.16169284844008516,
0.6034459255989321}}], {"click" ->
"64fb0b7a-3b0d-43c4-9a8d-a27d16a08c03"}], Opacity[1],
Directive[FontSize -> 14], Text["Em",
{0.000013191095963502262, 0.4581875072555506}, {0, 0}]},
Rational[3, 2]*Pi, {0, 0}]}}, {Line[{{-0.17677669529663687,
0.17677669529663687}, {-0.7071067811865475,
0.7071067811865475}}], Text["XI", {Rational[-1, 2]*Sqrt[3],
Rational[1, 2]}, {0, 0}], {Opacity[0.3], RGBColor[
0.30980392156862746, 0.47058823529411764,
0.34509803921568627], Rotate[{EventListener[Polygon[
{{0.1616928484400852, 0.6034459255989321},
{0.15808336399480044, 0.6046773106608907},
{0.06835700523617148, 0.6212506095249661},
{-0.022826264411036773, 0.6245830302313996},
{-0.11352303186214777, 0.6146035480184163},
{-0.1613333584687302, 0.6021042907610239},
{-0.2420000377030953, 0.9031564361415358},
{-0.17028454779322166, 0.9219053220276244},
{-0.03423939661655516, 0.9368745453470995},
{0.10253550785425723, 0.9318759142874493},
{0.2371250459922007, 0.9070159659913362},
{0.2425392726601278, 0.9051688883983983}}],
{"click" -> "bd825c7b-b38a-4f79-b229-449b3fa1c542"}],
Opacity[1], Directive[FontSize -> 14], Text["F",
{0.000022492509783969572, 0.7812684418588233}, {0, 0}]},
Rational[5, 3]*Pi, {0, 0}]}}, {Line[{{-0.06470476127563017,
0.24148145657226705}, {-0.2588190451025207,
0.9659258262890682}}], Text["XII", {Rational[-1, 2],
Rational[1, 2]*Sqrt[3]}, {0, 0}], {Opacity[0.3],
RGBColor[0.2980392156862745, 0.28627450980392155,
0.5490196078431373], Rotate[{EventListener[Polygon[
{{0.1616928484400852, 0.6034459255989321},
{0.15808336399480044, 0.6046773106608907},
{0.06835700523617148, 0.6212506095249661},
{-0.022826264411036773, 0.6245830302313996},
{-0.11352303186214777, 0.6146035480184163},
{-0.1613333584687302, 0.6021042907610239},
{-0.2420000377030953, 0.9031564361415358},
{-0.17028454779322166, 0.9219053220276244},
{-0.03423939661655516, 0.9368745453470995},
{0.10253550785425723, 0.9318759142874493},
{0.2371250459922007, 0.9070159659913362},
{0.2425392726601278, 0.9051688883983983}}],
{"click" -> "1d271dbf-ed46-4c46-9d75-d477ee89b2cf"}],
Opacity[1], Directive[FontSize -> 14], Text["G",
{0.000022492509783969572, 0.7812684418588233}, {0, 0}]},
Rational[11, 6]*Pi, {0, 0}]}}}, Circle[{0, 0}, 0.25],
Circle[{0, 0}, 0.625]}, "Controls" -> False,
ImageSize -> {250, 250}]]|>,
"7970ec24-94e9-4686-9ba4-ffac9c2f81de" ->
<|"Public" -> Hold[Graphics[{FrontInstanceReference[
1524674792206635800], {GrayLevel[1], EdgeForm[GrayLevel[0.5]],
{Annotation[Rectangle[{1.5, 0}, {2.5, 1}], 0, 1],
Annotation[Rectangle[{2.5, 0}, {3.5, 1}], 0, 3],
Annotation[Rectangle[{3.5, 0}, {4.5, 1}], 0, 5],
Annotation[Rectangle[{4.5, 0}, {5.5, 1}], 0, 6],
Annotation[Rectangle[{5.5, 0}, {6.5, 1}], 0, 8],
Annotation[Rectangle[{6.5, 0}, {7.5, 1}], 0, 10],
{RGBColor[1, 0.6862745098039216, 0.47843137254901963],
Annotation[Rectangle[{7.5, 0}, {8.5, 1}], 0, 12]},
Annotation[Rectangle[{8.5, 0}, {9.5, 1}], 0, 13],
Annotation[Rectangle[{9.5, 0}, {10.5, 1}], 0, 15],
Annotation[Rectangle[{10.5, 0}, {11.5, 1}], 0, 17],
Annotation[Rectangle[{11.5, 0}, {12.5, 1}], 0, 18],
{RGBColor[1, 0.6862745098039216, 0.47843137254901963],
Annotation[Rectangle[{12.5, 0}, {13.5, 1}], 0, 20]},
{RGBColor[1, 0.6862745098039216, 0.47843137254901963],
Annotation[Rectangle[{13.5, 0}, {14.5, 1}], 0, 22]},
Annotation[Rectangle[{14.5, 0}, {15.5, 1}], 0, 24],
Annotation[Rectangle[{15.5, 0}, {16.5, 1}], 0, 25]},
RGBColor[0.3333333333333333, 0.3333333333333333,
0.3333333333333333], {Annotation[Rectangle[{2.2, 0.5}, {2.8,
1}], 1, 2], Annotation[Rectangle[{3.2, 0.5}, {3.8, 1}], 1,
4], Annotation[Rectangle[{5.2, 0.5}, {5.8, 1}], 1, 7],
Annotation[Rectangle[{6.2, 0.5}, {6.8, 1}], 1, 9],
Annotation[Rectangle[{7.2, 0.5}, {7.8, 1}], 1, 11],
Annotation[Rectangle[{9.2, 0.5}, {9.8, 1}], 1, 14],
Annotation[Rectangle[{10.2, 0.5}, {10.8, 1}], 1, 16],
Annotation[Rectangle[{12.2, 0.5}, {12.8, 1}], 1, 19],
Annotation[Rectangle[{13.2, 0.5}, {13.8, 1}], 1, 21],
Annotation[Rectangle[{14.2, 0.5}, {14.8, 1}], 1, 23]}},
{RGBColor[1, 1, 0], Opacity[0.3]}, {GrayLevel[0],
{Text["G", {13, 0.4}, {0, 0}], Text["A", {14, 0.4}, {0, 0}],
Text["B", {8, 0.4}, {0, 0}]}}, EventListener[Graphics`Canvas[],
{"click" -> "550d29c9-fefb-4b4f-812c-dc90f97e27ca"}]},
ImageSize -> {500, 200}, "Controls" -> False]]|>,
"1658f480-2dd5-407e-a6e7-786a8d2eded0" ->
<|"Public" -> Hold[Graphics[{FrontInstanceReference[
315864363497754200], EventListener[Graphics`Canvas[],
{"click" -> "c0213d25-e2cb-415b-aec0-92eb3f12c6a7"}],
{Line[{{0, 1}, {12, 1}}], Line[{{0, 2}, {12, 2}}],
Line[{{0, 3}, {12, 3}}], Line[{{0, 4}, {12, 4}}],
Line[{{0, 5}, {12, 5}}], Line[{{0, 6}, {12, 6}}]},
{Line[{{0.5, 0.8}, {0.5, 6.2}}], Line[{{1.5, 0.8}, {1.5, 6.2}}],
Line[{{2.5, 0.8}, {2.5, 6.2}}], Line[{{3.5, 0.8}, {3.5, 6.2}}],
Line[{{4.5, 0.8}, {4.5, 6.2}}], Line[{{5.5, 0.8}, {5.5, 6.2}}],
Line[{{6.5, 0.8}, {6.5, 6.2}}], Line[{{7.5, 0.8}, {7.5, 6.2}}],
Line[{{8.5, 0.8}, {8.5, 6.2}}], Line[{{9.5, 0.8}, {9.5, 6.2}}],
Line[{{10.5, 0.8}, {10.5, 6.2}}], Line[{{11.5, 0.8},
{11.5, 6.2}}]}, {Text["E", {-0.4, 0.8}, {-1, -1}],
Text["A", {-0.4, 1.8}, {-1, -1}], Text["D", {-0.4, 2.8},
{-1, -1}], Text["G", {-0.4, 3.8}, {-1, -1}],
Text["B", {-0.4, 4.8}, {-1, -1}], Text["E", {-0.4, 5.8},
{-1, -1}]}, {AbsoluteThickness[4], Line[{{0.5, 1}, {0.5, 6}}],
GrayLevel[0.5], {Disk[{3, 0.3}, {0.075, 0.21}],
Disk[{5, 0.3}, {0.075, 0.21}], Disk[{7, 0.3}, {0.075, 0.21}],
Disk[{9, 0.3}, {0.075, 0.21}]}, Disk[{11.9, 0.3},
{0.075, 0.21}], Disk[{12.1, 0.3}, {0.075, 0.21}]},
{{RGBColor[0.9215686274509803, 0.49411764705882355,
0.43137254901960786], {Annotation[Disk[{0, 1}, {0.15, 0.42}],
4, "E"]}}, {RGBColor[1, 0.7215686274509804,
0.2196078431372549], {Annotation[Disk[{0, 4}, {0.15, 0.42}],
19, "G"], {Annotation[Disk[{5, 3}, {0.15, 0.42}], 19, "G"],
GrayLevel[1], Text["G", {5, 2.84}, {0, -1}]},
{Annotation[Disk[{10, 2}, {0.15, 0.42}], 19, "G"], GrayLevel[
1], Text["G", {10, 1.84}, {0, -1}]}}},
{RGBColor[0.9490196078431372, 0.8627450980392157,
0.43529411764705883], {{Annotation[Disk[{2, 2}, {0.15, 0.42}],
11, "B"], GrayLevel[1], Text["B", {2, 1.84}, {0, -1}]},
{Annotation[Disk[{7, 1}, {0.15, 0.42}], 11, "B"], GrayLevel[
1], Text["B", {7, 0.84}, {0, -1}]}}}}},
ImageSize -> {600, 120}, "Controls" -> False, ImagePadding -> None,
PlotRange -> {{-0.5, 12.5}, {0, 6.5}}]]|>,
"93190ffa-364f-4471-893e-31274e5d9abc" ->
<|"Public" -> Hold[HTMLView["",
Prolog -> HTMLView`TemplateProcessor[Association["instanceId" ->
CreateUUID[]]]]]|>, "cc92465a-d374-4192-805d-5b140ea9a315" ->
<|"Public" -> Hold[HTMLView["",
Prolog -> HTMLView`TemplateProcessor[Association["instanceId" ->
CreateUUID[]]]]]|>, "f8fd31a4-1b70-4dc1-80de-6bd268366b68" ->
<|"Public" -> Hold[HTMLView["\n", Prolog ->
HTMLView`TemplateProcessor[Association["instanceId" ->
CreateUUID[]]]]]|>, "d795a0a3-032b-4257-984a-a0179222e7c6" ->
<|"Public" -> Hold[HTMLView["\n", Prolog ->
HTMLView`TemplateProcessor[Association["instanceId" ->
CreateUUID[]]]]]|>, "04297fb8-a7b5-4dc4-9ca4-29ef326bce4e" ->
<|"Public" -> Hold[HTMLView["",
Prolog -> HTMLView`TemplateProcessor[Association["instanceId" ->
CreateUUID[]]]]]|>|>, "Path" -> "/Users/kirill/Github/wljs-demo\
s-archive/Demos/17 - Apps/Scales and chords.wln", "Quick" -> True,
"Symbols" -> <||>, "TOC" -> {CoffeeLiqueur`Extensions`TOC`Private`heading[
1, "Musical scales on piano and guitar",
CoffeeLiqueur`Notebook`Cells`CellObj[
CoffeeLiqueur`Notebook`Cells`CellObj`$284]],
CoffeeLiqueur`Extensions`TOC`Private`heading[2, "Internal framework",
CoffeeLiqueur`Notebook`Cells`CellObj[
CoffeeLiqueur`Notebook`Cells`CellObj`$286]],
CoffeeLiqueur`Extensions`TOC`Private`heading[2, "Components",
CoffeeLiqueur`Notebook`Cells`CellObj[
CoffeeLiqueur`Notebook`Cells`CellObj`$289]],
CoffeeLiqueur`Extensions`TOC`Private`heading[3, "Circle of 5s",
CoffeeLiqueur`Notebook`Cells`CellObj[
CoffeeLiqueur`Notebook`Cells`CellObj`$289]],
CoffeeLiqueur`Extensions`TOC`Private`heading[2, "Windows",
CoffeeLiqueur`Notebook`Cells`CellObj[
CoffeeLiqueur`Notebook`Cells`CellObj`$294]],
CoffeeLiqueur`Extensions`TOC`Private`heading[3,
"Main window with search", CoffeeLiqueur`Notebook`Cells`CellObj[
CoffeeLiqueur`Notebook`Cells`CellObj`$294]],
CoffeeLiqueur`Extensions`TOC`Private`heading[2, "Circle5 window",
CoffeeLiqueur`Notebook`Cells`CellObj[
CoffeeLiqueur`Notebook`Cells`CellObj`$302]],
CoffeeLiqueur`Extensions`TOC`Private`heading[2, "Piano View",
CoffeeLiqueur`Notebook`Cells`CellObj[
CoffeeLiqueur`Notebook`Cells`CellObj`$313]],
CoffeeLiqueur`Extensions`TOC`Private`heading[2, "Guitar view",
CoffeeLiqueur`Notebook`Cells`CellObj[
CoffeeLiqueur`Notebook`Cells`CellObj`$318]],
CoffeeLiqueur`Extensions`TOC`Private`heading[2, "Output widget",
CoffeeLiqueur`Notebook`Cells`CellObj[
CoffeeLiqueur`Notebook`Cells`CellObj`$326]]}|>,
"Cells" -> {<|"Data" -> ".md\n# Musical scales on piano and guitar\nA small \
widget, which allows to build chords from scales, play them and show on both: \
strings and keys. ", "Display" -> "codemirror",
"Hash" -> "4a9dc253-c12b-465c-b95a-8e8c686f77eb", "Invisible" -> False,
"MetaOnly" -> False, "Props" -> <|"Hidden" -> True|>, "State" -> "Idle",
"Type" -> "Input", "UID" -> Null, "Notebook" ->
"a7352ca2-aa7f-4e29-860d-98cd43b6081a"|>,
<|"Data" -> "# Musical scales on piano and guitar\nA small widget, which \
allows to build chords from scales, play them and show on both: strings and \
keys. ", "Display" -> "markdown", "Hash" ->
"765d8483-ecc1-405b-8b06-ba9373512220", "Invisible" -> False,
"MetaOnly" -> False, "Props" -> <||>, "State" -> "Idle",
"Type" -> "Output", "UID" -> Null, "Notebook" ->
"a7352ca2-aa7f-4e29-860d-98cd43b6081a"|>,
<|"Data" ->
".md\n## Internal framework\nAllows to work with notes easier",
"Display" -> "codemirror", "Hash" ->
"d5d97e41-b74c-489f-8d10-6f5d012ae00e", "Invisible" -> False,
"MetaOnly" -> False, "Props" -> <|"Hidden" -> True|>, "State" -> "Idle",
"Type" -> "Input", "UID" -> Null, "Notebook" ->
"a7352ca2-aa7f-4e29-860d-98cd43b6081a"|>,
<|"Data" -> "## Internal framework\nAllows to work with notes easier",
"Display" -> "markdown", "Hash" ->
"34ca0a63-76bc-4582-bb59-e4f4cbecf538", "Invisible" -> False,
"MetaOnly" -> False, "Props" -> <||>, "State" -> "Idle",
"Type" -> "Output", "UID" -> Null, "Notebook" ->
"a7352ca2-aa7f-4e29-860d-98cd43b6081a"|>,
<|"Data" -> "convertToSemitones[s_String] := With[{c = StringCases[s, \
{a__~~b:DigitCharacter :> {a,ToExpression[b]}, a__ :> {a,4}}]//First},\n \
semitone[c[[1]]] + (c[[2]] - 4) 12\n]\nconvertToSemitones[s_] := \
s;\n\nconvertToSemitones[l_List] := convertToSemitones /@ l\n\nsemitone[0] = \
\"C\";\nsemitone[1] = \"C#\";\nsemitone[2] = \"D\";\nsemitone[3] = \
\"D#\";\nsemitone[3] = \"Eb\";\nsemitone[4] = \"E\";\nsemitone[5] = \
\"F\";\nsemitone[6] = \"F#\";\nsemitone[6] = \"Gb\";\nsemitone[7] = \
\"G\";\nsemitone[8] = \"Ab\";\nsemitone[8] = \"G#\";\nsemitone[9] = \
\"A\";\nsemitone[10] = \"Bb\";\nsemitone[11] = \"B\";\n\nsemitone[n_Integer] \
:= semitone[Mod[n, 12]] /; n>11 \n\nsemitone[\"C\"] = 0;\nsemitone[\"C#\"] = \
1;\nsemitone[\"D\"] = 2;\nsemitone[\"D#\"] = 3;\nsemitone[\"Eb\"] = \
3;\nsemitone[\"E\"] = 4;\nsemitone[\"F\"] = 5;\nsemitone[\"F#\"] = \
6;\nsemitone[\"Gb\"] = 6;\nsemitone[\"G\"] = 7;\nsemitone[\"Ab\"] = \
8;\nsemitone[\"G#\"] = 8;\nsemitone[\"A\"] = 9;\nsemitone[\"Bb\"] = \
10;\nsemitone[\"B\"] = 11;\n\nscale[\"Major\"] = \
{2,2,1,2,2,2,1};\nmood[\"Major\"] = \"Bright and upbeat \
feeling\";\nscale[\"Major Pentatonic\"] = {2, 2, 3, 2, 3};\nmood[\"Major \
Pentatonic\"] = \"Joyful and open feeling\";\nscale[\"Minor\"] = \
{2,1,2,2,1,2,2};\nmood[\"Minor\"] = \"Sad and reflective \
feeling\";\nscale[\"Minor Pentatonic\"] = {3, 2, 2, 3, 2};\nmood[\"Minor \
Pentatonic\"] = \"Bluesy and soulful feeling\";\nscale[\"Dorian\"] = \
{2,1,2,2,2,1,2};\nmood[\"Dorian\"] = \"Mellow and jazzy \
feeling\";\nscale[\"Lydian\"] = {2,2,2,1,2,2,1};\nmood[\"Lydian\"] = \"Dreamy \
and mystical feeling\";\nscale[\"Mixolydian\"] = \
{2,2,1,2,2,1,2};\nmood[\"Mixolydian\"] = \"Bluesy and relaxed \
feeling\";\nscale[\"Phrygian\"] = {1,2,2,2,1,2,2};\nmood[\"Phrygian\"] = \
\"Exotic and tense feeling\";\n\ntuning[\"Standard\"] = \
{\"E6\",\"B5\",\"G5\",\"D5\",\"A4\",\"E4\"};\ntuning[\"Drop Ab\"] = {\"Ab\", \
\"Eb\", \"Ab\", \"Eb\", \"Ab\", \"Bb\"};\ntuning[\"Drop C\"] = {\"D6\", \
\"A5\",\"F5\",\"C5\", \"G4\",\"C4\" };\n\nmajorQ[SoundNote[n_List]] := \
With[{notes = Sort[convertToSemitones @ n]},\n notes[[2]] - notes[[1]] > \
3\n]\n\nmakeScale[root_Integer, scale_List] := With[{base = \
Accumulate[Join[{root}, scale]]},\n (base[[Mod[#-1, Length[base]-1] + 1]] + \
12 Floor[# / Length[base]]) &\n]\n\nmakeScale[root_String, scale_List] := \
makeScale[convertToSemitones[root], scale]\n\nmakeChord[root_, \
scalename_String, ext_Integer:3] := With[{s = makeScale[root, \
scale[scalename]]},\n chordObject[s, \
ext]\n]\n\nNoteTranspose[SoundNote[l_List], i_Integer] := With[{c = \
convertToSemitones[l]}, \n SoundNote[Map[(# + i)&, \
c]]\n]\n\nNoteTranspose[SoundNote[l_Integer], i_Integer] := With[{c = \
convertToSemitones[l]}, \n SoundNote[c + \
i]\n]\n\nNoteMerge[s:(SoundNote[_List]..)] := \
SoundNote[DeleteDuplicates[convertToSemitones[Join @@ \
({s}[[All,1]])]]]\n\n\nmakeChord[root_, scalename_String, \
ext_String];\nmakeChord[root_, scalename_String, ext_Integer, \
mod_Rule];\nmakeChord[root_, scalename_String, ext_Integer, \
mod:{__Rule}];\n\nchordObject[s_, ext_][offset_String] := chordObject[s, \
ext][FromRomanNumeral[offset]-1]\n\nchordObject[s_, ext_][offset_Integer] := \
SoundNote @ Table[ s[i + offset], {i, 1, 2 ext, 2}] \
\n\nNoteNormalize[SoundNote[l_List], {min_, max_}] := With[{notes = \
convertToSemitones @ l},\n SoundNote[With[{mod = Mod[#, max]}, If[mod < min, \
mod + min, mod]] &/@ notes // DeleteDuplicates]\n]",
"Display" -> "codemirror", "Hash" ->
"79df484a-7dbe-4880-b7ee-7ba0d3dde317", "Invisible" -> False,
"MetaOnly" -> False, "Props" -> <|"InitGroup" -> True|>,
"State" -> "Idle", "Type" -> "Input", "UID" -> Null,
"Notebook" -> "a7352ca2-aa7f-4e29-860d-98cd43b6081a"|>,
<|"Data" -> ".md\n## Components\n\n### Circle of 5s",
"Display" -> "codemirror", "Hash" ->
"de75f8fa-fa8e-436b-bbbd-3bdc2d48484c", "Invisible" -> False,
"MetaOnly" -> False, "Props" -> <|"Hidden" -> True|>, "State" -> "Idle",
"Type" -> "Input", "UID" -> Null, "Notebook" ->
"a7352ca2-aa7f-4e29-860d-98cd43b6081a"|>,
<|"Data" -> "## Components\n\n### Circle of 5s", "Display" -> "markdown",
"Hash" -> "4e15b9b4-895a-41c8-a3dd-0db4c0f17453", "Invisible" -> False,
"MetaOnly" -> False, "Props" -> <||>, "State" -> "Idle",
"Type" -> "Output", "UID" -> Null, "Notebook" ->
"a7352ca2-aa7f-4e29-860d-98cd43b6081a"|>,
<|"Data" -> "pad2 = With[{\nc2 = {Cos[ Pi/2 - Pi/12], Sin[ Pi/2 - Pi/12]} \
// N,\nc3 = {Cos[1 2Pi/12 + Pi/2 - Pi/12], Sin[1 2Pi/12 + Pi/2 - Pi/12]} //N \
\n},\n RegionIntersection[RegionDifference[Polygon[{c2 0.1, 1.5 c2, 1.5 c3, \
c3 0.1}], Disk[{0,0}, 0.25]],\n Disk[{0,0}, (0.75+0.5)/2]\n ]\n] // \
BoundaryDiscretizeRegion // MeshCoordinates // Polygon;\n\npad1 = With[{\nc2 \
= {Cos[ Pi/2 - Pi/12], Sin[ Pi/2 - Pi/12]} // N,\nc3 = {Cos[1 2Pi/12 + Pi/2 - \
Pi/12], Sin[1 2Pi/12 + Pi/2 - Pi/12]} //N \n},\n \
RegionIntersection[RegionDifference[Polygon[{c2 0.1, 1.5 c2, 1.5 c3, c3 \
0.1}], Disk[{0,0}, (0.75+0.5)/2]],\n Disk[{0,0}, (((0.75 + 1)/2.0) + \
1)/2.0]\n ]\n] // BoundaryDiscretizeRegion // MeshCoordinates // \
Polygon;\n\ncircleFifth[key_, scale_] := Graphics[{Table[With[{\n c1 = \
{Cos[-i 2Pi/12 + Pi/2], Sin[-i 2Pi/12 + Pi/2]},\n c2 = {Cos[-i 2Pi/12 + Pi/2 \
- Pi/12], Sin[-i 2Pi/12 + Pi/2 - Pi/12]} //N,\n chord = makeChord[key, \
scale, 3][i]\n}, {\n\n Line[{0.25 c2, c2}],\n Text[RomanNumeral[i+1], c1, \
{0,0}],\n \n {Opacity[0.3], ColorData[35][i+6], Rotate[If[majorQ[chord], \
{\n EventHandler[pad1, {\"click\" -> Function[Null, \
NoteNormalize[NoteMerge[chord, NoteTranspose[chord, 12]], {12,24+12}] // \
Sound // EmitSound]}],\n Opacity[1], Directive[FontSize->12], \
Text[semitone[chord[[1,1]]], pad1 // RegionCentroid, {0,0}]\n }, {\n \
EventHandler[pad2, {\"click\" -> Function[Null, \
NoteNormalize[NoteMerge[chord, NoteTranspose[chord, 12]], {12, 24+12}] // \
Sound // EmitSound]}],\n Opacity[1], Directive[FontSize->12], \
Text[semitone[chord[[1,1]]] <> \"m\", pad2 // RegionCentroid, {0,0}]\n }], i \
2 Pi/12, {0,0}]}\n}], {i, 0,11}],\n\nCircle[{0,0}, 0.25],\nCircle[{0,0}, \
(0.75+0.5)/2]\n\n}, \"Controls\"->False, ImageSize->{250,250}]",
"Display" -> "codemirror", "Hash" ->
"b849509f-2921-4201-a5a1-6b7eb0423241", "Invisible" -> False,
"MetaOnly" -> False, "Props" -> <|"InitGroup" -> True|>,
"State" -> "Idle", "Type" -> "Input", "UID" -> Null,
"Notebook" -> "a7352ca2-aa7f-4e29-860d-98cd43b6081a"|>,
<|"Data" -> "", "Display" -> "codemirror",
"Hash" -> "625b06b3-6f3e-4f22-bd56-ffa5387dbc8f", "Invisible" -> False,
"MetaOnly" -> False, "Props" -> <||>, "State" -> "Idle",
"Type" -> "Input", "UID" -> Null, "Notebook" ->
"a7352ca2-aa7f-4e29-860d-98cd43b6081a"|>,
<|"Data" -> "", "Display" -> "codemirror",
"Hash" -> "584f945f-db10-4a21-8e8e-19820bd07dbf", "Invisible" -> False,
"MetaOnly" -> False, "Props" -> <||>, "State" -> "Idle",
"Type" -> "Input", "UID" -> Null, "Notebook" ->
"a7352ca2-aa7f-4e29-860d-98cd43b6081a"|>,
<|"Data" ->
".md\n## Windows\n### Main window with search\nHelper functions",
"Display" -> "codemirror", "Hash" ->
"1d0a1d72-66d8-4631-914a-db34734c77cd", "Invisible" -> False,
"MetaOnly" -> False, "Props" -> <|"Hidden" -> True|>, "State" -> "Idle",
"Type" -> "Input", "UID" -> Null, "Notebook" ->
"a7352ca2-aa7f-4e29-860d-98cd43b6081a"|>,
<|"Data" -> "## Windows\n### Main window with search\nHelper functions",
"Display" -> "markdown", "Hash" ->
"1dd4c91e-998b-4ef3-a8fd-6e6d49f13c84", "Invisible" -> False,
"MetaOnly" -> False, "Props" -> <||>, "State" -> "Idle",
"Type" -> "Output", "UID" -> Null, "Notebook" ->
"a7352ca2-aa7f-4e29-860d-98cd43b6081a"|>,
<|"Data" -> "searchScale[text_] := With[{\n scales = \
DownValues[scale][[All,1,1,1]],\n semitones = \
DownValues[semitone][[All,1,1,1]]\n},\n With[{words = StringTrim /@ \
StringSplit[text, \" \"]},\n With[{key = SelectFirst[words, \
(StringLength[#]<=2)&]},\n \n If[MissingQ[key],\n \
<|\"Key\"->Missing[], \"Scales\"->Table[{scale, Total @ Map[Function[word, \
Count[\n Map[Function[scaleWord, StringMatchQ[scaleWord, \
___~~word~~___] ], StringSplit[scale, \" \"]]\n , True]], words]}, \
{scale, scales}]|>\n ,\n With[{rest = words /. {key -> \
Nothing}},\n If[NumberQ[semitone[key]],\n <|\"Key\"->key, \
\"Scales\"->Table[{scale, Total @ Map[Function[word, Count[\n \
Map[Function[scaleWord, StringMatchQ[scaleWord, ___~~word~~___] ], \
StringSplit[scale, \" \"]]\n , True]], rest]}, {scale, \
scales}]|>\n ,\n <|\"Key\"->Missing[], \
\"Scales\"->Table[{scale, Total @ Map[Function[word, Count[\n \
Map[Function[scaleWord, StringMatchQ[scaleWord, ___~~word~~___] ], \
StringSplit[scale, \" \"]]\n , True]], rest]}, {scale, \
scales}]|>\n ]\n ]\n ]\n ]\n \
]\n]\n\n\npickScales[data_, n_:5] := With[{scales = \
Take[SortBy[data[\"Scales\"], -#[[2]]&], Min[n, \
Length[data[\"Scales\"]]]][[All,1]]},\n If[MissingQ[data[\"Key\"]],\n \
Table[k -> {\"C\", k}, {k, scales}] // Association\n ,\n \
Table[StringTemplate[\"`` ``\"][data[\"Key\"], k] -> {data[\"Key\"], k}, {k, \
scales}] // Association\n ]\n]", "Display" -> "codemirror",
"Hash" -> "411cb189-2826-4591-8bd6-df3967bee249", "Invisible" -> False,
"MetaOnly" -> False, "Props" -> <|"InitGroup" -> True|>,
"State" -> "Idle", "Type" -> "Input", "UID" -> Null,
"Notebook" -> "a7352ca2-aa7f-4e29-860d-98cd43b6081a"|>,
<|"Data" -> ".md\nWidget", "Display" -> "codemirror",
"Hash" -> "772bad76-5f57-45c1-8056-7b9dd00f16fe", "Invisible" -> False,
"MetaOnly" -> False, "Props" -> <|"Hidden" -> True|>, "State" -> "Idle",
"Type" -> "Input", "UID" -> Null, "Notebook" ->
"a7352ca2-aa7f-4e29-860d-98cd43b6081a"|>, <|"Data" -> "Widget",
"Display" -> "markdown", "Hash" ->
"9ff90440-fa4c-4f41-b6b1-217c65a8fd5b", "Invisible" -> False,
"MetaOnly" -> False, "Props" -> <||>, "State" -> "Idle",
"Type" -> "Output", "UID" -> Null, "Notebook" ->
"a7352ca2-aa7f-4e29-860d-98cd43b6081a"|>,
<|"Data" -> ".wlx\n\nmainWindow[callback_] := Module[{pick = Null}, \
With[{\n InputField = InputAutocomplete[Function[{text, cbk},\n pick = \
pickScales[searchScale[text]];\n pick//Keys//cbk;\n ], \
\"ClearOnSubmit\"->True]\n},\n\n EventHandler[InputField, \
Function[selected,\n If[MissingQ[pick[selected]] || pick === Null,\n \
Notify[\"Key / Scale does not exist\", \"Type\"->\"Warning\"];\n \
Return[];\n ];\n\n callback @ (pick[selected]) \n ]];\n\n \n \
\n
\n\n]\n]", "Display" -> "codemirror",
"Hash" -> "c7752d85-adcd-451a-a26f-d689907c575c", "Invisible" -> False,
"MetaOnly" -> False, "Props" -> <|"InitGroup" -> True|>,
"State" -> "Idle", "Type" -> "Input", "UID" -> Null,
"Notebook" -> "a7352ca2-aa7f-4e29-860d-98cd43b6081a"|>,
<|"Data" -> "CellView[mainWindow[Print[{##}]&], \"Display\"->\"wlx\"]",
"Display" -> "codemirror", "Hash" ->
"71375333-744a-4482-8ce1-8ec1bd0e11ad", "Invisible" -> False,
"MetaOnly" -> False, "Props" -> <||>, "State" -> "Idle",
"Type" -> "Input", "UID" -> Null, "Notebook" ->
"a7352ca2-aa7f-4e29-860d-98cd43b6081a"|>,
<|"Data" -> "(*VB[*)(FrontEndRef[\"532235e0-ff61-4965-a2a8-164886fc87e2\"]\
)(*,*)(*\"1:eJxTTMoPSmNkYGAoZgESHvk5KRCeEJBwK8rPK3HNS3GtSE0uLUlMykkNVgEKmxobG\
RmbphropqWZGeqaWJqZ6iYaJVroGpqZWFiYpSVbmKcaAQBzhBTz\"*)(*]VB*)",
"Display" -> "codemirror", "Hash" ->
"8b8cb056-4fed-4ec2-b52f-1b83ccbedcce", "Invisible" -> False,
"MetaOnly" -> False, "Props" -> <||>, "State" -> "Idle",
"Type" -> "Output", "UID" -> Null, "Notebook" ->
"a7352ca2-aa7f-4e29-860d-98cd43b6081a"|>,
<|"Data" -> ".md\n## Circle5 window\n\nTuning component",
"Display" -> "codemirror", "Hash" ->
"6fcf877c-c677-467f-98ad-45b9bdb2404f", "Invisible" -> False,
"MetaOnly" -> False, "Props" -> <|"Hidden" -> True|>, "State" -> "Idle",
"Type" -> "Input", "UID" -> Null, "Notebook" ->
"a7352ca2-aa7f-4e29-860d-98cd43b6081a"|>,
<|"Data" -> "## Circle5 window\n\nTuning component",
"Display" -> "markdown", "Hash" ->
"7bf0ec48-7221-4480-9466-c8b585d211a9", "Invisible" -> False,
"MetaOnly" -> False, "Props" -> <||>, "State" -> "Idle",
"Type" -> "Output", "UID" -> Null, "Notebook" ->
"a7352ca2-aa7f-4e29-860d-98cd43b6081a"|>,
<|"Data" -> ".wlx\n\nOptions[TuningComponent] = \
{\"Event\"->\"\"}\nTuningComponent[OptionsPattern[]] := Module[{\n Event = \
OptionValue[\"Event\"],\n UId = CreateUUID[],\n tunings = \
DownValues[tuning][[All,1,1,1]] \n},\n\nWith[{\n TuningField = \
InputAutocomplete[Function[{input, cbk}, \n buffer = SortBy[Table[{tuning, \
Total @ Map[Function[word, Count[\n Map[Function[tuningWord, \
StringMatchQ[tuningWord, ___~~word~~___, IgnoreCase->True] ], \
StringSplit[tuning, \" \"]]\n , True]], StringSplit[input, \" \
\"]]}, {tuning, tunings}], Function[l, -l[[2]]]];\n \
cbk[buffer[[All,1]]];\n\n ], \"Standard\", \"Label\"->\"Tuning\", \
\"ClearOnSubmit\"->False]\n},\n\nEventHandler[TuningField, {\n\n \
\"Selected\" -> Function[key,\n EventFire[Event, \"Tuning\", \
convertToSemitones @ tuning[key]];\n ],\n\n \"Entered\" -> \
Function[input,\n With[{semitones = convertToSemitones @ \
StringSplit[input, \" \"]},\n If[!TrueQ[AllTrue[semitones, NumberQ]], \n \
Notify[\"Tuning must be like E5 D5 ... form\", \
\"Type\"->\"Warning\"];\n Return[];\n ];\n\n \
EventFire[Event, \"Tuning\", semitones];\n ]\n ]\n}];\n\n\n
\n
\n \
\n
\n \n
\n]]",
"Display" -> "codemirror", "Hash" ->
"1e16a94a-6ee5-423f-857d-e9abcb61e552", "Invisible" -> False,
"MetaOnly" -> False, "Props" -> <|"InitGroup" -> True|>,
"State" -> "Idle", "Type" -> "Input", "UID" -> Null,
"Notebook" -> "a7352ca2-aa7f-4e29-860d-98cd43b6081a"|>,
<|"Data" -> "CellView[TuningComponent[\"Event\"->\"bullshit\"] , \
\"Display\"->\"wlx\"]", "Display" -> "codemirror",
"Hash" -> "c0e22276-ddcc-4f6d-9a2c-e79d44d3c76c", "Invisible" -> False,
"MetaOnly" -> False, "Props" -> <||>, "State" -> "Idle",
"Type" -> "Input", "UID" -> Null, "Notebook" ->
"a7352ca2-aa7f-4e29-860d-98cd43b6081a"|>,
<|"Data" -> "(*VB[*)(FrontEndRef[\"8b2319a0-4025-4f50-96b5-be8bc20c09ea\"]\
)(*,*)(*\"1:eJxTTMoPSmNkYGAoZgESHvk5KRCeEJBwK8rPK3HNS3GtSE0uLUlMykkNVgEKWyQZG\
RtaJhromhgYmeqapJka6FqaJZnqJqVaJCUbGSQbWKYmAgB2NxVl\"*)(*]VB*)",
"Display" -> "codemirror", "Hash" ->
"922abeec-0f00-446e-8c4e-71d2087a8b37", "Invisible" -> False,
"MetaOnly" -> False, "Props" -> <||>, "State" -> "Idle",
"Type" -> "Output", "UID" -> Null, "Notebook" ->
"a7352ca2-aa7f-4e29-860d-98cd43b6081a"|>,
<|"Data" ->
"Notify[\"Tuning must be like E5 D5 ... form\", \"Type\"->\"Warning\"];"\
, "Display" -> "codemirror", "Hash" ->
"3be4c7ed-a250-45a4-aa70-0f261e81675a", "Invisible" -> False,
"MetaOnly" -> False, "Props" -> <||>, "State" -> "Idle",
"Type" -> "Input", "UID" -> Null, "Notebook" ->
"a7352ca2-aa7f-4e29-860d-98cd43b6081a"|>,
<|"Data" -> ".md\nMain window", "Display" -> "codemirror",
"Hash" -> "921eb9bf-7ca6-4717-a02a-bd9190e41413", "Invisible" -> False,
"MetaOnly" -> False, "Props" -> <|"Hidden" -> True|>, "State" -> "Idle",
"Type" -> "Input", "UID" -> Null, "Notebook" ->
"a7352ca2-aa7f-4e29-860d-98cd43b6081a"|>, <|"Data" -> "Main window",
"Display" -> "markdown", "Hash" ->
"b136faeb-6da3-42c7-b5f9-409c3a067d32", "Invisible" -> False,
"MetaOnly" -> False, "Props" -> <||>, "State" -> "Idle",
"Type" -> "Output", "UID" -> Null, "Notebook" ->
"a7352ca2-aa7f-4e29-860d-98cd43b6081a"|>,
<|"Data" -> ".wlx\n\nOptions[LandingWindow] = {\"Key\"->\"C\", \
\"Scale\"->\"Major\"}\nLandingWindow[callback_, OptionsPattern[]] := \
Module[{\n stringTuning = tuning[\"Standard\"],\n localControls = \
CreateUUID[],\n instrument = \"Keys\"\n},\n\nWith[{\n CircleFifth = \
circleFifth[OptionValue[\"Key\"], OptionValue[\"Scale\"]],\n TuningComponent \
= TuningComponent[\"Event\"->localControls],\n ChordChart = \
InputButton[\"Chord charts\", \"Style\"->\"box-shadow: rgb(255, 255, 255) 0px \
0px 0px 0px inset, rgb(229, 231, 235) 0px 0px 0px 1px inset, rgba(0, 0, 0, 0) \
0px 0px 0px 0px; font-weight:normal; font-size:14px\"],\n ScaleChart = \
InputButton[\"Scale charts\", \"Style\"->\"box-shadow: rgb(255, 255, 255) 0px \
0px 0px 0px inset, rgb(229, 231, 235) 0px 0px 0px 1px inset, rgba(0, 0, 0, 0) \
0px 0px 0px 0px; font-weight:normal; font-size:14px\"],\n Title = \
StringJoin[OptionValue[\"Key\"], \" \", OptionValue[\"Scale\"]],\n Mood = \
mood[OptionValue[\"Scale\"]],\n currentScale = OptionValue[\"Scale\"],\n \
currentKey = OptionValue[\"Key\"]\n},\n\nEventHandler[localControls, \
{\"Instrument\" -> Function[i, instrument = i], \"Tuning\" -> Function[t, \
stringTuning = t]}];\n\nEventHandler[ChordChart, Function[Null,\n \
callback[\"Chord\", {currentKey, currentScale}, instrument, \
\"Tuning\"->stringTuning];\n]];\n\nEventHandler[ScaleChart, Function[Null,\n \
callback[\"Scale\", {currentKey, currentScale}, instrument, \
\"Tuning\"->stringTuning];\n]];\n\n\n
\n
\n
\n \n
\
\n
\n \
\n \n \
\n
\n Select the instrument
\n \n \
\n
\n
\n] ]", "Display" -> "codemirror",
"Hash" -> "e18944c1-300d-4085-ad4e-0ca922dcce69", "Invisible" -> False,
"MetaOnly" -> False, "Props" -> <|"InitGroup" -> True|>,
"State" -> "Idle", "Type" -> "Input", "UID" -> Null,
"Notebook" -> "a7352ca2-aa7f-4e29-860d-98cd43b6081a"|>,
<|"Data" -> ".wlx\n\nLandingWindow[Print[{##}]&, \"Scale\"->\"Major\", \
\"Key\"->\"C\"]", "Display" -> "codemirror",
"Hash" -> "cff0aeb8-3009-4fc7-b996-f0d303f61d9b", "Invisible" -> False,
"MetaOnly" -> False, "Props" -> <||>, "State" -> "Idle",
"Type" -> "Input", "UID" -> Null, "Notebook" ->
"a7352ca2-aa7f-4e29-860d-98cd43b6081a"|>,
<|"Data" -> "C Major
Bright and upbeat feeling
FrontEndExecutable[86bbb3ec-f889-4529-bed3-2e6fc0106020]
FrontEndExecutable[f8fd31a4-1b70-4dc1-80de-6bd268366b68]FrontEndExe\
cutable[d795a0a3-032b-4257-984a-a0179222e7c6]
Select the instrument
FrontEndExecutable[04297fb8-a7b5-4dc4-9ca4-29ef326bce4e]
", "Display" -> "wlx",
"Hash" -> "449e5bcb-e9a7-4691-a298-5c492b78b0da", "Invisible" -> False,
"MetaOnly" -> False, "Props" -> <||>, "State" -> "Idle",
"Type" -> "Output", "UID" -> Null, "Notebook" ->
"a7352ca2-aa7f-4e29-860d-98cd43b6081a"|>,
<|"Data" -> ".md\n## Piano View", "Display" -> "codemirror",
"Hash" -> "279937e4-a77f-4505-a6d0-b83e34adb45e", "Invisible" -> False,
"MetaOnly" -> False, "Props" -> <|"Hidden" -> True|>, "State" -> "Idle",
"Type" -> "Input", "UID" -> Null, "Notebook" ->
"a7352ca2-aa7f-4e29-860d-98cd43b6081a"|>, <|"Data" -> "## Piano View",
"Display" -> "markdown", "Hash" ->
"0983e949-c907-4a8a-995b-7306a1da8840", "Invisible" -> False,
"MetaOnly" -> False, "Props" -> <||>, "State" -> "Idle",
"Type" -> "Output", "UID" -> Null, "Notebook" ->
"a7352ca2-aa7f-4e29-860d-98cd43b6081a"|>,
<|"Data" -> "keyLevels = {0, 1, 0, 1, 0, 0, 1, 0, 1, 0, 1, 0, \
0};\ngenerateKeys[keyCount_] := Module[\n {index = 1, position = 1, \
keyWidth, keyOffset},\n Table[\n With[\n {\n cycleIndex = \
Mod[index - 1, 12] + 1,\n level = keyLevels[[Mod[index - 1, 12] + \
1]]\n },\n keyWidth = 0.5 - 0.2 level;\n keyOffset = 0.5 \
level;\n position += 1 - level;\n index++;\n Rectangle[\n \
{position - keyWidth + keyOffset, keyOffset},\n {position + keyWidth \
+ keyOffset, 1}\n ]\n ],\n {keyCount}\n \
]\n];\n\nannotateKeys[keys_] := MapIndexed[\n Annotation[#, \
keyLevels[[Mod[#2[[1]] - 1, 12] + 1]], #2[[1]]] &,\n \
keys\n];\n\nhighlightNotes[skeys_, indexes_] := Map[Function[key,\n \
If[MemberQ[indexes, key[[3]]], \n {(*VB[*)(RGBColor[1., \
0.6862745098039216, \
0.47843137254901963])(*,*)(*\"1:eJxTTMoPSmNkYGAoZgESHvk5KRCeGJAIcndyzs/JLwouT\
yxJzghJzS3ISSxJTWMGyXMgyRcxgMEH+6JvX0HgqX3R/HkgcM8eAIGmHxI=\"*)(*]VB*), \
key}\n ,\n key\n ]\n], skeys]\n\nseparateKeys[keys_] := Module[\n \
{annotatedKeys = annotateKeys[keys]},\n {\n Cases[annotatedKeys, \
Annotation[_, 0, _]],\n Cases[annotatedKeys, Annotation[_, 1, _]]\n \
}\n];\n\n\nclicker[scene_, separated_, keys_, additional_:{}, notes_, \
scale_:False][xy_] := With[{\n whiteMatch = SelectFirst[separated[[1]], \
RegionMember[#[[1]], xy] &],\n blackMatch = SelectFirst[separated[[2]], \
RegionMember[#[[1]], xy] &]\n},\n\n With[{\n key = \
If[!MissingQ[blackMatch], blackMatch[[3]], whiteMatch[[3]]]\n },\n \n \
If[scale === False, With[{group = FrontInstanceGroup[]}, \n \n \
FrontSubmit[NoteTranspose[SoundNote[Join[additional, \
{key-1}]//DeleteDuplicates], 12] // Sound];\n FrontSubmit[{\n \
Red, Text[notes[[Mod[# - 1, 12] + 1]], \n Mean[List @@ (keys[[#]])] - \
{0,0.2}, {0,0}] &/@ Join[(Mod[#, Length[keys]-1] &/@ additional)+1, {key}], \
\n Opacity[0.3], keys[[Join[((Mod[#, Length[keys]-1]) &/@ \
additional)+1, {key}]]]\n } // group, scene];\n \n \
SetTimeout[Delete[group], 200];\n Return[]\n ]];\n\n With[{sorted \
= Join[additional, {key-1}]//DeleteDuplicates // Sort},\n Do[With[{note \
= sorted[[i]], window = CurrentWindow[]},\n SetTimeout[\n \
FrontSubmit[NoteTranspose[SoundNote[note], 12] // Sound, \
\"Window\"->window];\n With[{group = FrontInstanceGroup[]},\n \
FrontSubmit[{\n Red, Text[notes[[Mod[# - 1, 12] + 1]], \
\n Mean[List @@ (keys[[#]])] - {0,0.2}, {0,0}] &/@ \
Join[(Mod[#, Length[keys]-1] &/@ {note})+1, {key}], \n \
Opacity[0.3], keys[[Join[((Mod[#, Length[keys]-1]) &/@ {note})+1, {key}]]]\n \
} // group, scene, \"Window\"->window]; \n \
SetTimeout[Delete[group], 400];\n ];\n , (i-1)400 + 10];\n \
], {i, Length[sorted]}]\n ];\n\n \n \
]\n]\n\n\nClearAll[PianoView];\nPianoView[] := \
PianoView[SoundNote[{}]]\nPianoView[SoundNote[rawNotes_List], \
OptionsPattern[]] := Module[{\n keys, separated, scene, scaleMode = False,\n \
highlighted, names = {\"C\", \"C#\", \"D\", \"Eb\", \"E\", \"F\", \"F#\", \
\"G\", \"Ab\", \"A\", \"Bb\", \"B\", \"C\"}, annotations,\n notes = \
convertToSemitones @ rawNotes\n},\n keys = \
generateKeys[OptionValue[\"Size\"]];\n\n separated = separateKeys[keys];\n\n \
scene = FrontInstanceReference[];\n\n highlighted = Mod[#, Length[keys]] + \
1 &/@ notes;\n annotations = Text[names[[Mod[#, 12]+1]], Mean @ (\n List \
@@ keys[[Mod[#, Length[keys]] + 1]]\n ) + {0.,-0.1}, {0,0}] &/@ notes;\n\n \
notes = Switch[OptionValue[\"Mode\"],\n \"Play\",\n notes,\n\n \
\"Show\",\n {},\n\n \"Scale\",\n scaleMode = True; notes,\n \
_,\n notes\n ];\n\n Graphics[{scene,\n {White, EdgeForm[Gray], \
highlightNotes[separated[[1]], highlighted], Black//Lighter, \
highlightNotes[separated[[2]],highlighted]},\n {Yellow, Opacity[0.3]}, \
{Black, annotations},\n EventHandler[Graphics`Canvas[], {\"click\" -> \
clicker[scene, separated, keys, notes, names, scaleMode]}]\n }, \
ImageSize->OptionValue[ImageSize], \
\"Controls\"->False]\n]\n\nOptions[PianoView] = {ImageSize->{500,200}, \
\"Size\"->25, \"Mode\"->\"Play\"};\n\n", "Display" -> "codemirror",
"Hash" -> "256b1bde-f2f4-4023-bd9e-f3cd0c12da67", "Invisible" -> False,
"MetaOnly" -> False, "Props" -> <|"InitGroup" -> True|>,
"State" -> "Idle", "Type" -> "Input", "UID" -> Null,
"Notebook" -> "a7352ca2-aa7f-4e29-860d-98cd43b6081a"|>,
<|"Data" ->
"PianoView[SoundNote[{\"G5\", \"A5\", \"B\" }], \"Mode\"->\"Scale\"]",
"Display" -> "codemirror", "Hash" ->
"f2a511f8-80c2-430b-88bb-cc568464ab2d", "Invisible" -> False,
"MetaOnly" -> False, "Props" -> <||>, "State" -> "Idle",
"Type" -> "Input", "UID" -> Null, "Notebook" ->
"a7352ca2-aa7f-4e29-860d-98cd43b6081a"|>,
<|"Data" -> "(*VB[*)(FrontEndRef[\"7970ec24-94e9-4686-9ba4-ffac9c2f81de\"]\
)(*,*)(*\"1:eJxTTMoPSmNkYGAoZgESHvk5KRCeEJBwK8rPK3HNS3GtSE0uLUlMykkNVgEKm1uaG\
6QmG5noWpqkWuqamFmY6VomJZropqUlJlsmG6VZGKakAgB+/BXx\"*)(*]VB*)",
"Display" -> "codemirror", "Hash" ->
"b6085ae5-85d5-4ce2-92dc-e025f90c91ff", "Invisible" -> False,
"MetaOnly" -> False, "Props" -> <||>, "State" -> "Idle",
"Type" -> "Output", "UID" -> Null, "Notebook" ->
"a7352ca2-aa7f-4e29-860d-98cd43b6081a"|>,
<|"Data" -> ".md\n## Guitar view", "Display" -> "codemirror",
"Hash" -> "b0e1d51f-ed42-4f03-94b6-bbb0aeb298ed", "Invisible" -> False,
"MetaOnly" -> False, "Props" -> <|"Hidden" -> True|>, "State" -> "Idle",
"Type" -> "Input", "UID" -> Null, "Notebook" ->
"a7352ca2-aa7f-4e29-860d-98cd43b6081a"|>, <|"Data" -> "## Guitar view",
"Display" -> "markdown", "Hash" ->
"c530dd97-98a6-47c0-bca4-96750905770e", "Invisible" -> False,
"MetaOnly" -> False, "Props" -> <||>, "State" -> "Idle",
"Type" -> "Output", "UID" -> Null, "Notebook" ->
"a7352ca2-aa7f-4e29-860d-98cd43b6081a"|>,
<|"Data" -> "plucker[scene_, board_, highlighted_, additional_, \
scaleQ_][xy_] := With[{\n match = SelectFirst[board//Values//Flatten, \
With[{reg = Disk[#[[1,1]], #[[1,2]] * 2] },\n RegionMember[reg, xy]\n \
]&]\n},\n If[MissingQ[match], Return[]];\n With[{\n notes = \
Sort[Join[additional, {match[[2]]}]//DeleteDuplicates],\n client = \
CurrentWindow[]\n },\n\n If[scaleQ,\n MapIndexed[Function[{val, \
index},\n SetTimeout[With[{group = FrontInstanceGroup[]},\n \n \
FrontSubmit[SoundNote[val, \"8n\"] // Sound, \"Window\"->client];\n \
FrontSubmit[{\n Opacity[0.7], highlighted[{val}, Red]\n \
} // group, scene, \"Window\"->client];\n \n \
SetTimeout[Delete[group], 450]; \n \n ], 450 * (index[[1]]-1) \
+ 1]\n ], notes]; \n ,\n With[{group = \
FrontInstanceGroup[]},\n FrontSubmit[SoundNote[notes] // Sound];\n \
FrontSubmit[{\n Opacity[0.7], highlighted[notes]\n } // \
group, scene];\n \n SetTimeout[Delete[group], 200]; \n ]\n \
]\n ] \n]\n\n\nGuitarView[SoundNote[rawNotes_List], OptionsPattern[]] := \
Module[{\n tuning = convertToSemitones @ OptionValue[\"Tuning\"],\n scene = \
FrontInstanceReference[],\n scaleQ = False,\n names = {\"C\", \"C#\", \"D\", \
\"Eb\", \"E\", \"F\", \"F#\", \"G\", \"Ab\", \"A\", \"Bb\", \"B\", \"C\"}, \
annotations,\n notes = convertToSemitones @ rawNotes,\n board, \
highlighted,\n semitoneTuning = Reverse[convertToSemitones @ \
OptionValue[\"Tuning\"]]\n},\n\nnotes = Switch[OptionValue[\"Mode\"],\n \
\"Play\",\n notes,\n\n \"Show\",\n {},\n\n \"Scale\",\n \
scaleQ = True;\n notes,\n\n _,\n notes\n ];\n\nnotes = With[{c \
= Mod[#, convertToSemitones @ (semitoneTuning[[-1]] + 12)]},\n If[c < \
semitoneTuning[[1]],\n c + 12\n ,\n c\n ]\n] &/@ notes;\n\nboard = \
GroupBy[Flatten[\n Table[With[{note = semitoneTuning[[y]] + x},\n \
Annotation[Disk[{x,y}, {0.15, 0.15 2.8 }], note, names[[Mod[note, 12]+1]]]\n \
], {x, 0, 12}, {y, Length[tuning]}]\n], #[[2]] &];\n\nhighlighted[notes_, \
color_:Automatic] := {\n If[color === Automatic, ColorData[97], color&] /@ \
Range[notes // Length],\n Map[Function[place, \n If[place[[1,1,1]] > \
0.5,\n {place, White, Text[place[[3]] , place[[1,1]]- {0,0.16}, \
{0,-1}]}\n ,\n place\n ]\n ], board[#]] &/@ \
notes\n}//Transpose;\n\nGraphics[{\n scene, EventHandler[Graphics`Canvas[], \
{\"click\"->plucker[scene, board, highlighted, notes, scaleQ]}],\n \
Table[Line[{{0, string}, {12, string}}], {string, Length[tuning]}],\n \
Table[Line[{{i - 0.5, 1 - 0.2 }, {i - 0.5, Length[tuning] + 0.2}}], {i, \
12}],\n Table[Text[semitone[tuning[[Length[tuning] + 1 - string]]], {-0.4, \
string - 0.2}, {-1,-1}], {string, Length[tuning]}],\n {\n \
AbsoluteThickness[4], Line[{{0.5, 1}, {0.5, Length[tuning]}}], \n Gray, \
Table[Disk[{0.5 + 2.5 + k, 0.3}, {0.15, 0.15 2.8 }/2], {k, 0, 6, 2}],\n \
Disk[{0.5 + 2.5 + 8.9, 0.3}, {0.15, 0.15 2.8 }/2], Disk[{0.5 + 2.5 + 9.1, \
0.3}, {0.15, 0.15 2.8 }/2]\n },\n \n highlighted[notes]\n \n}, \
ImageSize->OptionValue[ImageSize], \"Controls\"->False, ImagePadding->None, \
PlotRange->{{0 - 0.5, 12 + 0.5}, {0, Length[tuning] + \
.5}}]\n]\n\nOptions[GuitarView] = {\"Tuning\"->({\"E4\", \"A4\", \"D5\", \
\"G5\", \"B5\", \"E6\"}//Reverse), \"Mode\"->\"Play\", ImageSize->(1.2 \
{500,100})}\n\n", "Display" -> "codemirror",
"Hash" -> "16929ca2-35ca-4d93-9ddd-4cd4969fb70d", "Invisible" -> False,
"MetaOnly" -> False, "Props" -> <|"InitGroup" -> True|>,
"State" -> "Idle", "Type" -> "Input", "UID" -> Null,
"Notebook" -> "a7352ca2-aa7f-4e29-860d-98cd43b6081a"|>,
<|"Data" -> "{\"Tuning\"->{\"E6\",\"B5\",\"G5\",\"D5\",\"A4\",\"E4\"},\"Mo\
de\"->\"Play\",ImageSize->{600.`,120.`}}", "Display" -> "codemirror",
"Hash" -> "53d9c3ea-121f-42f7-a21b-4e9cb52b4bd6", "Invisible" -> False,
"MetaOnly" -> False, "Props" -> <||>, "State" -> "Idle",
"Type" -> "Output", "UID" -> Null, "Notebook" ->
"a7352ca2-aa7f-4e29-860d-98cd43b6081a"|>,
<|"Data" ->
"GuitarView[SoundNote[{\"E4\", \"G5\", \"B4\"}], \"Mode\"->\"Scale\"]",
"Display" -> "codemirror", "Hash" ->
"828af6ac-3e05-48e7-9f33-b69215a9560f", "Invisible" -> False,
"MetaOnly" -> False, "Props" -> <||>, "State" -> "Idle",
"Type" -> "Input", "UID" -> Null, "Notebook" ->
"a7352ca2-aa7f-4e29-860d-98cd43b6081a"|>,
<|"Data" -> "(*VB[*)(FrontEndRef[\"1658f480-2dd5-407e-a6e7-786a8d2eded0\"]\
)(*,*)(*\"1:eJxTTMoPSmNkYGAoZgESHvk5KRCeEJBwK8rPK3HNS3GtSE0uLUlMykkNVgEKG5qZW\
qSZWBjoGqWkmOqaGJin6iaapZrrmluYJVqkGKWmpKYYAAB7NBWx\"*)(*]VB*)",
"Display" -> "codemirror", "Hash" ->
"2dabddaf-9dc0-40a6-b3fd-e092efeb312a", "Invisible" -> False,
"MetaOnly" -> False, "Props" -> <||>, "State" -> "Idle",
"Type" -> "Output", "UID" -> Null, "Notebook" ->
"a7352ca2-aa7f-4e29-860d-98cd43b6081a"|>,
<|"Data" -> "EvaluationNotebook[]", "Display" -> "codemirror",
"Hash" -> "ebfe350c-6221-4f56-9ac5-a3e2e837e883", "Invisible" -> False,
"MetaOnly" -> False, "Props" -> <||>, "State" -> "Idle",
"Type" -> "Input", "UID" -> Null, "Notebook" ->
"a7352ca2-aa7f-4e29-860d-98cd43b6081a"|>,
<|"Data" -> "RemoteNotebook[\"68d64a5d-d727-419f-8a86-e9665e84a280\"]",
"Display" -> "codemirror", "Hash" ->
"7fd1f989-8fc1-42a9-9e82-b6fdc8f41ee9", "Invisible" -> False,
"MetaOnly" -> False, "Props" -> <||>, "State" -> "Idle",
"Type" -> "Output", "UID" -> Null, "Notebook" ->
"a7352ca2-aa7f-4e29-860d-98cd43b6081a"|>,
<|"Data" -> ".md\n## Output widget", "Display" -> "codemirror",
"Hash" -> "36ef0a4a-ef93-41bd-a4d9-9f60fed1c7f6", "Invisible" -> False,
"MetaOnly" -> False, "Props" -> <|"Hidden" -> True|>, "State" -> "Idle",
"Type" -> "Input", "UID" -> Null, "Notebook" ->
"a7352ca2-aa7f-4e29-860d-98cd43b6081a"|>,
<|"Data" -> "## Output widget", "Display" -> "markdown",
"Hash" -> "362ad76d-94bc-4046-94b7-5b3cca0754d8", "Invisible" -> False,
"MetaOnly" -> False, "Props" -> <||>, "State" -> "Idle",
"Type" -> "Output", "UID" -> Null, "Notebook" ->
"a7352ca2-aa7f-4e29-860d-98cd43b6081a"|>,
<|"Data" -> ".wlx\n\ninternalMiddleware[notebook_][rest__] := \
internalHandler[rest, \"Notebook\"->notebook];\n\ninternalHandler[\"Scale\", \
{currentKey_, currentScale_}, \"Keys\", OptionsPattern[]] := \
CellPrint[With[{\n Widget = PianoView[\n With[{scaleMaker = \
makeScale[currentKey, scale[currentScale]]},\n scaleMaker /@ \
Range[12-4]\n ] // SoundNote\n , \"Mode\"->\"Scale\"],\n Title = \
StringTemplate[\"`` ``\"][currentKey, currentScale],\n Mood = \
mood[currentScale]\n},\n\n], \
\"Notebook\"->OptionValue[\"Notebook\"], \"Target\"->_, \
\"Display\"->\"wlx\"]\n\n\ninternalHandler[\"Scale\", {currentKey_, \
currentScale_}, \"Strings\", OptionsPattern[]] := CellPrint[With[{\n Widget \
= GuitarView[\n With[{scaleMaker = makeScale[currentKey, \
scale[currentScale]]},\n With[{notes = scaleMaker /@ Range[12-4] // \
SoundNote},\n NoteMerge[NoteTranspose[notes, 12], NoteTranspose[notes, \
12 2], NoteTranspose[notes, 12 3]]\n ]\n ] \n , \"Mode\"->\"Scale\", \
\"Tuning\"->(OptionValue[\"Tuning\"])],\n Title = StringTemplate[\"`` \
``\"][currentKey, currentScale],\n Mood = mood[currentScale]\n},\n\n], \"Notebook\"->OptionValue[\"Notebook\"], \"Target\"->_, \
\"Display\"->\"wlx\"]\n\nOptions[internalHandler] = {\"Notebook\"->\"\", \
\"Tuning\"->\"\"};", "Display" -> "codemirror",
"Hash" -> "82ba2342-fb42-4e36-bf42-1cfd34d3f0bc", "Invisible" -> False,
"MetaOnly" -> False, "Props" -> <|"InitGroup" -> True|>,
"State" -> "Idle", "Type" -> "Input", "UID" -> Null,
"Notebook" -> "a7352ca2-aa7f-4e29-860d-98cd43b6081a"|>,
<|"Data" -> ".md\nChord maker", "Display" -> "codemirror",
"Hash" -> "f3311481-777c-4f8b-82a5-70082aafc4e5", "Invisible" -> False,
"MetaOnly" -> False, "Props" -> <|"Hidden" -> True|>, "State" -> "Idle",
"Type" -> "Input", "UID" -> Null, "Notebook" ->
"a7352ca2-aa7f-4e29-860d-98cd43b6081a"|>, <|"Data" -> "Chord maker",
"Display" -> "markdown", "Hash" ->
"3e434468-c105-4e0e-9ad0-8afeabe687ac", "Invisible" -> False,
"MetaOnly" -> False, "Props" -> <||>, "State" -> "Idle",
"Type" -> "Output", "UID" -> Null, "Notebook" ->
"a7352ca2-aa7f-4e29-860d-98cd43b6081a"|>,
<|"Data" -> ".wlx\n\ninternalHandler[\"Chord\", {CurrentKey_, \
CurrentScale_}, \"Keys\", OptionsPattern[]] := CellPrint[With[{m = \
makeChord[CurrentKey, CurrentScale, 3]},\n With[{TableList = Table[With[{\n \
Widget = PianoView[m[r], ImageSize->{270,100}], \n Roman = r\n },\n \
\n \n \
\n \n ], {r, {\"I\", \"II\", \"III\", \"IV\", \
\"V\", \"VI\"}}]},\n\n \n ]\n], \"Notebook\"->OptionValue[\"Notebook\"], \
\"Target\"->_, \"Display\"->\"wlx\"]\n\ninternalHandler[\"Chord\", \
{CurrentKey_, CurrentScale_}, \"Strings\", OptionsPattern[]] := \
CellPrint[With[{m = makeChord[CurrentKey, CurrentScale, 3]},\n \
With[{TableList = Table[With[{\n Widget = \
GuitarView[NoteMerge[NoteTranspose[m[r], 12], NoteTranspose[m[r], 24], \
NoteTranspose[m[r], 12 3]], ImageSize->( {500,100}), \
\"Tuning\"->OptionValue[\"Tuning\"]], \n Roman = r\n },\n \n \n \
\n \n ], {r, {\"I\", \"II\", \"III\", \"IV\", \
\"V\", \"VI\"}}]},\n\n \n ]\n], \"Notebook\"->OptionValue[\"Notebook\"], \
\"Target\"->_, \"Display\"->\"wlx\"]", "Display" -> "codemirror",
"Hash" -> "0d1e1bf0-fbce-45f4-ad6f-28d81bb2edeb", "Invisible" -> False,
"MetaOnly" -> False, "Props" -> <|"InitGroup" -> True|>,
"State" -> "Idle", "Type" -> "Input", "UID" -> Null,
"Notebook" -> "a7352ca2-aa7f-4e29-860d-98cd43b6081a"|>,
<|"Data" -> "", "Display" -> "codemirror",
"Hash" -> "2e51346f-6b18-4de4-bc9b-91afc6ffae22", "Invisible" -> False,
"MetaOnly" -> False, "Props" -> <||>, "State" -> "Idle",
"Type" -> "Input", "UID" -> Null, "Notebook" ->
"a7352ca2-aa7f-4e29-860d-98cd43b6081a"|>,
<|"Data" -> ".wlx\n\nWith[{notebook = EvaluationNotebook[]},\n \
With[{MainWindow = mainWindow[Function[keyScale,\n \
CellPrint[LandingWindow[internalMiddleware[notebook], \"Key\"->keyScale[[1]], \
\"Scale\"->keyScale[[2]]], \"Notebook\"->notebook, \"Target\"->_, \
\"Display\"->\"wlx\"];\n ]]\n },\n\n ]\n]", "Display" -> "codemirror",
"Hash" -> "677f4f54-1f24-4980-9ebb-a795ae3e1af5", "Invisible" -> False,
"MetaOnly" -> False, "Props" -> <|"InitGroup" -> True|>,
"State" -> "Idle", "Type" -> "Input", "UID" -> Null,
"Notebook" -> "a7352ca2-aa7f-4e29-860d-98cd43b6081a"|>},
"serializer" -> "jsfn4"|>