<|"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
\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

</h3>\n <p class=\"mt-1 max-w-2xl \ text-sm/6 text-gray-500\"><Mood/></p>\n </div>\n <div class=\"mt-6 border-t \ border-gray-100 flex flex-row gap-x-5\">\n <dl class=\"divide-y \ divide-gray-100 gap-y-3 flex flex-col\">\n <CircleFifth/>\n </dl> \ \n <dl class=\"divide-y divide-gray-100 gap-y-3 flex flex-col\">\n \ <div class=\"flex flex-row gap-x-3\">\n <ChordChart/>\n \ <ScaleChart/>\n </div>\n <p class=\"mt-1 max-w-2xl text-sm/6 \ text-gray-500\">Select the instrument</p>\n <TuningComponent/>\n \ </dl>\n </div>\n</div>\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" -> "<div ><div class=\"px-4 sm:px-0\"><h3 class=\"text-base/7 \ font-semibold text-gray-900\">C Major</h3><p class=\"mt-1 max-w-2xl text-sm/6 \ text-gray-500\">Bright and upbeat feeling</p></div><div class=\"mt-6 border-t \ border-gray-100 flex flex-row gap-x-5\"><dl class=\"divide-y divide-gray-100 \ gap-y-3 flex \ flex-col\">FrontEndExecutable[86bbb3ec-f889-4529-bed3-2e6fc0106020]</dl><dl \ class=\"divide-y divide-gray-100 gap-y-3 flex flex-col\"><div class=\"flex \ flex-row \ gap-x-3\">FrontEndExecutable[f8fd31a4-1b70-4dc1-80de-6bd268366b68]FrontEndExe\ cutable[d795a0a3-032b-4257-984a-a0179222e7c6]</div><p class=\"mt-1 max-w-2xl \ text-sm/6 text-gray-500\">Select the instrument</p><div \ class=\"py-1\"><fieldset class=\"text-sm mb-2 rounded\"><button \ id=\"keys-button-2e0a787d-0f14-4e92-8b5b-10247e12ef4d\" class=\"px-2 py-1 \ rounded ring-1 ring-inset ring-gray-200 bg-white\">Keys</button><button \ id=\"strings-button-2e0a787d-0f14-4e92-8b5b-10247e12ef4d\" class=\"px-2 py-1 \ rounded\">Strings</button></fieldset><div \ id=\"strings-2e0a787d-0f14-4e92-8b5b-10247e12ef4d\" class=\"hidden text-sm \ px-2\">FrontEndExecutable[04297fb8-a7b5-4dc4-9ca4-29ef326bce4e]</div><script \ type=\"module\"> const keysButton = \ document.getElementById('keys-button-2e0a787d-0f14-4e92-8b5b-10247e12ef4d');\ \n const stringButton = \ document.getElementById('strings-button-2e0a787d-0f14-4e92-8b5b-10247e12ef4d'\ );\n const container = \ document.getElementById('strings-2e0a787d-0f14-4e92-8b5b-10247e12ef4d');\n\n \ keysButton.addEventListener('click', () => {\n \ keysButton.classList.add(...('ring-1 ring-inset ring-gray-200 \ bg-white'.split(' ')));\n stringButton.classList.remove(...('ring-1 \ ring-inset ring-gray-200 bg-white'.split(' ')));\n \ container.classList.add('hidden');\n \ server.kernel.emitt('a0a75235-0d80-4b89-92a3-dde4d02f5c7b', '\"Keys\"', \ 'Instrument');\n });\n\n stringButton.addEventListener('click', () => \ {\n stringButton.classList.add(...('ring-1 ring-inset ring-gray-200 \ bg-white'.split(' ')));\n keysButton.classList.remove(...('ring-1 \ ring-inset ring-gray-200 bg-white'.split(' ')));\n \ container.classList.remove('hidden');\n \ server.kernel.emitt('a0a75235-0d80-4b89-92a3-dde4d02f5c7b', '\"Strings\"', \ 'Instrument');\n })</script></div></dl></div></div>", "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<div class=\"p-4 bg-white h-full w-full\">\n <div \ class=\"pb-2\">\n <h3 class=\"text-base/7 font-semibold \ text-gray-900\"><Title/></h3>\n </div>\n <Widget/>\n</div>\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<div \ class=\"p-4 bg-white h-full w-full\">\n <div class=\"pb-2\">\n <h3 \ class=\"text-base/7 font-semibold text-gray-900\"><Title/></h3>\n </div>\n \ <Widget/>\n</div>\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 \ <div class=\"flex flex-row gap-x-2 items-center\">\n <Widget/>\n \ <h3><Roman/></h3>\n </div>\n ], {r, {\"I\", \"II\", \"III\", \"IV\", \ \"V\", \"VI\"}}]},\n\n <div class=\"flex flex-col gap-y-2 p-4 \ bg-white\">\n <p class=\"mt-1 max-w-2xl text-sm/6 \ text-gray-500\"><CurrentKey/><span> </span><CurrentScale/></p>\n \ <TableList/>\n </div>\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 <div \ class=\"flex flex-row gap-x-2 items-center\">\n <Widget/>\n \ <h3><Roman/></h3>\n </div>\n ], {r, {\"I\", \"II\", \"III\", \"IV\", \ \"V\", \"VI\"}}]},\n\n <div class=\"flex flex-col gap-y-2 p-4 \ bg-white\">\n <p class=\"mt-1 max-w-2xl text-sm/6 \ text-gray-500\"><CurrentKey/><span> </span><CurrentScale/></p>\n \ <TableList/>\n </div>\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<div class=\"p-4 bg-white h-full \ w-full\">\n <div class=\"px-4 sm:px-0\">\n <p class=\"mt-1 max-w-2xl \ text-sm/6 text-gray-500\">Pick scale and key</p>\n </div>\n \ <MainWindow/>\n</div>\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"|>