From d0ba6e0e311a983484c3c5df5d083754ddc97e9c Mon Sep 17 00:00:00 2001 From: Timothy Farrell Date: Mon, 10 May 2021 11:30:38 -0500 Subject: [PATCH] More assets and reference removal --- assets/{ => images}/raccoon.png | Bin fonts/chicago.woff2 | Bin 0 -> 20052 bytes index.html | 6 +++--- 3 files changed, 3 insertions(+), 3 deletions(-) rename assets/{ => images}/raccoon.png (100%) create mode 100644 fonts/chicago.woff2 diff --git a/assets/raccoon.png b/assets/images/raccoon.png similarity index 100% rename from assets/raccoon.png rename to assets/images/raccoon.png diff --git a/fonts/chicago.woff2 b/fonts/chicago.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..cdbbccce7a8b97b780d0ff3d927eb5e2293dfe76 GIT binary patch literal 20052 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 literal 0 HcmV?d00001 diff --git a/index.html b/index.html index 112407f..0290442 100755 --- a/index.html +++ b/index.html @@ -55,7 +55,7 @@ "content": "context = require \"./lib/audio-context\"\n\nbufferLoader = (url) ->\n new Promise (resolve, reject) ->\n fetch(url)\n .then (response) ->\n throw response unless response.ok\n response.arrayBuffer()\n .then (buffer) ->\n context.decodeAudioData buffer, resolve, reject\n\nblobLoader = (url) ->\n fetch(url)\n .then (response) ->\n throw response unless response.ok\n response.blob()\n\nBASE_PATH = window.location\nurlFor = (path) ->\n \"#{BASE_PATH}assets/#{path}\"\n\nimgLoader = (url) ->\n new Promise (resolve, reject) ->\n image = new Image\n image.crossOrigin = true\n image.src = url\n image.onload = ->\n resolve image\n image.onerror = reject\n\nmodule.exports = Sample =\n load: (data) ->\n {sample} = data\n\n # Load audio buffer\n bufferLoader(urlFor(sample))\n .then (buffer) ->\n Object.assign data,\n buffer: buffer\n\n loadPack: ->\n imgLoader urlFor \"images/default.png\"\n .then (img) ->\n # TODO: a cleaner way to pass this to applySampleCSS\n Sample.image = img\n\n Promise.all defaultPack.map (sample, i) ->\n # Get blob url\n canvas = document.createElement 'canvas'\n canvas.width = 48\n canvas.height = 48\n ctx = canvas.getContext('2d')\n\n ctx.drawImage(img, i * 48, 0, 48, 48, 0, 0, 48, 48)\n\n new Promise (resolve, reject) ->\n canvas.toBlob (blob) ->\n url = URL.createObjectURL blob\n sample.cursor = \"url(#{url}) #{24} #{24}, default\"\n sample.url = url\n resolve()\n\n .then ->\n Promise.all(defaultPack.map(Sample.load))\n\n # Export all image/activeImage sprites to a single png\n # This is going to be part of the future format\n exportPNG: (samples) ->\n canvas = document.createElement 'canvas'\n canvas.width = 48 * samples.length\n canvas.height = 96\n ctx = canvas.getContext('2d')\n\n # All images are 48x48\n samples.forEach ({image, activeImage}, i) ->\n x = 48 * i\n ctx.drawImage(image, x, 0) #normal\n ctx.drawImage(activeImage, x, 48) # active y=48\n\n canvas.toBlob (blob) ->\n url = URL.createObjectURL(blob)\n window.open url, \"_blank\"\n\n# Load Editor sound effects, currently just the eraser\nbufferLoader(\"#{BASE_PATH}assets/erase2.wav\")\n.then (buffer) ->\n Sample.fx =\n eraser: buffer\n\nsamples =\n synth:\n sample: \"synth.wav\"\n piano:\n sample: \"piano.wav\"\n pan: -0.5\n guitar:\n sample: \"guitar.wav\"\n pan: 0.25\n bass:\n sample: \"16.wav\"\n horn:\n sample: \"horn.wav\"\n pan: -0.333\n orch_hit:\n sample: \"orch_hit.wav\"\n pan: 0.25\n chime:\n sample: \"5.wav\"\n pan: 0.5\n organ:\n sample: \"organ.wav\"\n pan: -0.25\n drum:\n sample: \"drum.wav\"\n snare:\n sample: \"snare.wav\"\n woodblock:\n sample: \"14.wav\"\n pan: -0.333\n clap:\n sample: \"clap.wav\"\n hat:\n sample: \"hat.wav\"\n pan: 0.333\n baby:\n sample: \"baby.wav\"\n pan: -0.5\n yoshi:\n sample: \"yoshi.wav\"\n pan: 0.5\n pig:\n sample: \"oink.wav\"\n cat:\n sample: \"cat.wav\"\n pan: 0.25\n dog:\n sample: \"dog.wav\"\n pan: -0.25\n french:\n sample: \"french-horn.wav\"\n pan: 0.333\n pitchShift: 0\n nylon:\n sample: \"nylon-guitar2.wav\"\n pan: -0.25\n pitchShift: -12\n snare2:\n sample: \"snare2.wav\"\n pitchShift: 0\n\ndefaultPack = Object.keys(samples).map (name, i) ->\n sample = samples[name]\n sample.name = name\n sample.index = i\n sample.pitchShift ?= -5 # These samples are pitched to F, the -5 pithces them to C\n sample.pan ?= 0\n sample.volume ?= 1\n\n sample\n" }, "style.styl": { - "content": "primary-color-dark = #4a148c\nprimary-color = #673ab7\nhighlight-color = #FFE0B2\nactive-color = #FFC107\nbg-color = #ede7f6\n\npixelated()\n -ms-interpolation-mode: nearest-neighbor\n image-rendering: crisp-edges\n image-rendering: pixelated\n\n@font-face\n font-display: auto\n font-family: 'Chicago'\n src: url('https://danielx.net/fonts/chicago.woff2') format('woff2'),\n url('https://danielx.net/fonts/chicago.woff') format('woff')\n font-weight: normal\n font-style: normal\n\n*\n box-sizing: border-box\n\nimg\n max-width: 100%\n\n.hidden\n display: none !important\n\n#modal \n > *\n border: 1px solid primary-color\n border-radius: 4px\n box-shadow: 1px 2px 0px primary-color\n color: inherit\n padding: 1rem\n\n > h1, > h2\n margin-top: 0\n\n > section.purchase\n background-color: transparent\n border: none\n border-radius: 0\n box-shadow: none\n padding: 0\n\n > .publish\n > p.status:empty\n margin: 0\n \n > pre\n user-select: all\n \n > actions\n display: flex\n > button:last-child\n margin-left: auto\n\n:focus\n color: white\n background-color: primary-color\n outline: none\n\nhtml, body\n height: 100%\n\nbody\n color: #241440\n display: flex\n font-family: Chicago, sans-serif\n font-size: 16px\n line-height: 1rem\n margin: 0\n overflow: hidden\n user-select: none\n\np\n font-family: sans-serif\n\n// Input and form things\ninput, textarea, select, button\n font-family: inherit\n\ninput\n background-color: bg-color\n border: 1px solid primary-color\n border-radius: 4px\n box-shadow: 1px 2px 0px primary-color inset\n color: primary-color\n font-size: inherit\n padding: 2px 0.25em\n\n // Firefox number spinners are a crime to my eyes ;_;\n // TODO Custom style for number spinners on all browsers\n &[type=\"number\"]\n -moz-appearance: textfield\n \n &:focus\n background-color: active-color\n color: rgba(0, 0, 0, 0.69)\n\n@keyframes note-active\n from\n background-color: rgba(0, 0, 0, 0)\n\n to\n background-color: rgba(255, 0, 255, 0)\n\n// Background has to be on ::after so it is above the ledger lines on ::before\n// Accidentals are in ::after content, vertically centered and left of the bg\nnote\n font-size: 48px\n height: 48px\n pixelated()\n position: absolute\n width: 48px\n\n &.active\n animation-name: note-active\n animation-duration: 0.25s\n\n &::after\n align-items: center\n background-repeat: no-repeat\n background-position: 100% 50%\n content: \"\"\n display: flex\n position: absolute\n left: 0\n top: 0\n width: 100%\n height: 100%\n text-indent: -12px\n\n &.♭\n &::after\n content: \"♭\"\n\n &.♯\n &::after\n content: \"♯\"\n\n // Extra ledger lines\n &.C4, &.A5, &.C6, &.C2, &.E2, &.B5, &.D2\n &::before\n content: \"\"\n width: 48px\n left: 0px\n top: 23px\n position: absolute\n height: 0\n border-bottom: 2px solid black\n\n &.B5\n &::before\n top: 40px\n\n &.D2\n &::before\n top: -8px\n\nsong-section\n height: 483px\n position: absolute\n top: -241px\n\n &::after\n content: \"\"\n border-right: 2px solid black\n height: 100%\n position: absolute\n right: 10px\n\n > span.measure-number\n background-color: rgba(255, 255, 255, 0.9375)\n border: 1px solid black\n box-shadow: 1px 1px 0 0 rgba(0,0,0,0.5)\n font-style: italic\n left: 0px\n padding: 2px 6px 2px 4px\n position: absolute\n top: -132px\n\n > div.key-signature\n &.s > ::after\n content: \"♯\"\n\n &.f > ::after\n content: \"♭\"\n\n > *\n display: none\n font-size: 96px\n height: 48px\n position: absolute\n width: 48px\n\n &::after\n align-items: center\n display: flex\n height: 100%\n width: 100%\n\n &.s1, &.s2, &.s3, &.s4, &.s5, &.s6, &.s7\n > :nth-child(1)\n display: initial\n top: -24px\n left: -96px\n &.s2, &.s3, &.s4, &.s5, &.s6, &.s7\n > :nth-child(2)\n display: initial\n top: 48px\n left: -72px\n &.s3, &.s4, &.s5, &.s6, &.s7\n > :nth-child(3)\n display: initial\n top: -48px\n left: -48px\n &.s4, &.s5, &.s6, &.s7\n > :nth-child(4)\n display: initial\n top: 24px\n left: -24px\n &.s5, &.s6, &.s7\n > :nth-child(5)\n display: initial\n top: 96px\n left: 0\n &.s6, &.s7\n > :nth-child(6)\n display: initial\n top: 0px\n left: 24px\n &.s7\n > :nth-child(7)\n display: initial\n top: 72px\n left: 48px\n \n &.f1, &.f2, &.f3, &.f4, &.f5, &.f6, &.f7\n > :nth-child(1)\n display: initial\n top: 72px\n left: -96px\n &.f2, &.f3, &.f4, &.f5, &.f6, &.f7\n > :nth-child(2)\n display: initial\n top: 0px\n left: -72px\n &.f3, &.f4, &.f5, &.f6, &.f7\n > :nth-child(3)\n display: initial\n top: 96px\n left: -48px\n &.f4, &.f5, &.f6, &.f7\n > :nth-child(4)\n display: initial\n top: 24px\n left: -24px\n &.f5, &.f6, &.f7\n > :nth-child(5)\n display: initial\n top: -48px\n left: 0\n &.f6, &.f7\n > :nth-child(6)\n display: initial\n top: 48px\n left: 24px\n &.f7\n > :nth-child(7)\n display: initial\n top: -24px\n left: 48px\n\ntd\n > select\n width: 100%\n > input\n border-radius: 0\n box-shadow: none\n > aside.fx-picker\n > label\n display: none\n\n &.sprite\n text-align: center\n vertical-align: middle\n\n > img\n margin-right: 1rem\n vertical-align: middle\n \n &.input\n > input[type=number]\n display: block\n margin: auto\n width: 60px\n\nsection.settings\n overflow: auto\n padding: 1rem\n position: relative\n\n > h2\n margin: 0 0 1rem\n > button.close\n position: absolute\n top: 1rem\n right: 1rem\n\n > table\n margin: 0 -8px\n width: calc(100% + 16px)\n\nsection.demo-picker\n overflow: auto\n padding: 1rem\n position: relative\n\n > h2\n margin: 0 0 1rem\n > button.close\n position: absolute\n top: 1rem\n right: 1rem\n\n > table\n font-size: 18px\n > tbody\n > tr\n cursor: pointer\n line-height: 2rem\n\n &:hover\n background-color: rgba(103, 58, 183, 0.19)\n\nviewport\n background-attachment: local\n background-color: bg-color\n display: flex\n height: 100%\n align-items: center\n overflow-x: scroll\n overflow-y: hidden\n\n > staff\n background-color: rgba(255, 255, 255, 0.9375)\n border: 1px solid rgba(0, 0, 0, 0.5)\n box-sizing: content-box\n box-shadow: 1px 1px 0 0 rgba(0, 0, 0, 0.5)\n display: block\n flex: 0 0 auto\n padding: 96px 0\n position: relative\n margin: 0 48px\n z-index: 0\n\n // Hack for right margin inside scrollable viewport\n // Also serving as song end bar\n &::after\n border-left: 8px solid black\n content: \"\"\n position: absolute\n right: -48px\n top: 96px\n width: 48px\n height: calc(100% - 192px)\n z-index: -1\n\n > z-meter\n display: block\n position: absolute\n left: 256px\n top: 96px\n height: calc(100% - 192px)\n width: calc(100% - 256px)\n\n &::before\n content: \"\"\n border-left: 2px solid black\n position: absolute\n height: 100%\n left: -257px\n\n > div.repeat\n position: absolute\n right: 0\n height: 100%\n\n &::before, &::after\n content: \"\"\n display: block\n background-color: black\n border-radius: 100%\n position: absolute\n width: 16px\n height: 16px\n right: 16px\n top: 66px\n\n &::after\n top: 114px\n \n &.bass\n position: relative\n top: 288px\n\n > notes\n display: block\n position: absolute\n left: 256px\n top: 337px\n\n > pattern-preview\n opacity: 0.5\n position: absolute\n\n > selection\n background-color: rgba(103, 58, 183, 0.25)\n border: 2px dashed primary-color\n position: absolute\n left: -150px\n z-index: 20\n\n > button\n display: none\n position: absolute\n top: 0\n left: 0\n right: 0\n bottom: 0\n margin: auto\n width: 48px\n height: 48px\n\n &.up\n bottom: calc(100%+4px)\n top: auto\n &.down\n top: calc(100%+4px)\n bottom: auto\n &.left\n right: calc(100%+4px)\n left: auto\n &.right\n left: calc(100%+4px)\n right: auto\n\n > actions\n display: none\n position: absolute\n\n > button\n margin-left: 4px\n\n &.t > actions\n top: 0\n &.b > actions\n bottom: 0\n &.l > actions\n left: 0\n &.r > actions\n right: 0\n\n &.set \n > actions\n display: flex\n > button\n display: block\n\n > lines\n display: block\n margin-bottom: 48px\n \n &:nth-child(2)\n margin-bottom: 0\n\n > line:last-child\n height: 0\n\n > line\n border-top: 3px solid black\n display: block\n height: 48px\n\n > playhead\n border-left: 1px solid rgba(103, 58, 183, 0.5)\n border-right: 1px solid rgba(103, 58, 183, 0.5)\n position: absolute\n top: 0\n height: 674px\n width: 2px\n z-index: 10\n\n &.buffer-start\n display: none\n border-color: rgba(255, 0, 0, 0.5)\n\n &.buffer-end\n display: none\n border-color: rgba(0, 0, 255, 0.5)\n\n > img\n position: absolute\n height: 600px\n top: -94px\n left: -120px\n\n &:last-child\n left: -100px\n top: 181px\n\nform\n > label\n display: block\n\n > h3\n font-size: 1rem\n\n &.inline\n display: inline-block\n margin-right: 0.5em\n\n > input\n padding-left: 2px\n width: 100%\n\n > actions\n display: flex\n justify-content: space-between\n margin-top: 1em\n\n &.purchase\n width: 672px\n\napp\n display: flex\n flex: 1 0\n height: 100%\n flex-direction: column\n\nbutton.loop\n font-size: 32px\n line-height: 1rem\n\naside.meter-picker\n margin-left: 8px\n > button\n border-radius: 0\n\n &:first-child\n border-top-left-radius: 4px\n border-bottom-left-radius: 4px\n\n &:last-child\n border-top-right-radius: 4px\n border-bottom-right-radius: 4px\n\naside.note-control\n > section\n display: flex\n margin-left: 1rem\n \n > label\n display: flex\n align-items: center\n margin-right: 4px\n\n > button\n flex: 0 0 auto\n font-size: 20px\n line-height: 1rem\n width: 36px\n\n border-radius: 0\n\n &.triplet\n font-size: 16px\n\n &:nth-child(n + 3)\n border-left: 0\n\n &:nth-child(2)\n border-top-left-radius: 4px\n border-bottom-left-radius: 4px\n\n &.snap\n > button\n &:nth-child(5)\n border-top-right-radius: 4px\n border-bottom-right-radius: 4px\n \n > input\n margin-left: 5px\n width: 60px\n\n &.accidental\n > button:nth-child(4)\n border-top-right-radius: 4px\n border-bottom-right-radius: 4px\n\nsection.persistence\n display: flex\n flex-direction: column\n padding: 1rem\n width: 480px\n\n > button\n margin-top: 8px\n width: 100%\n\n &:first-child\n margin-top: 0\n\nabout > actions\n > button, a.button\n width: 100%\n margin-top: 8px\n\naside\n display: flex\n > label\n display: flex\n align-items: center\n margin-right: 4px\n margin-left: 1rem\n\naside.stereo-analyser\n > canvas\n border: 1px solid #673ab7\n border-radius: 4px\n\naside.fx-picker\n display: flex\n\n > button\n background-size: 100%\n border: 1px solid #673ab7\n border-radius: 4px\n height: 36px\n padding: 0\n margin-left: 2px\n width: 36px\n\naside.actions\n background-color: white\n border-top: 2px solid primary-color\n display: flex\n flex: 0 0 auto\n flex-direction: column\n padding: 4px 4px 0px 4px\n width: 100%\n\n > section:nth-child(2)\n > button, > a.button\n padding: 15px 8px\n\n > section\n display: flex\n &:last-child\n margin-top: 8px\n\n > section.buttons\n > *\n margin-bottom: 6px\n \n &:nth-child(n + 2)\n margin-left: 4px\n \n > form\n display: flex\n \n > button, > a.button\n flex: 0 0 auto\n\n > label\n align-items: center\n border: 1px solid #673ab7\n border-radius: 4px\n box-shadow: 1px 2px 0px #673ab7\n color: #673ab7\n display: flex\n flex-direction: column\n padding: 5px 8px 4px\n white-space: nowrap\n \n > input\n padding: 2px 0 0\n text-align: center\n width: 60px\n \n > h2\n display: block\n font-size: 1em\n font-weight: normal\n margin: 0 0 4px\n \n > .right\n margin-left: auto\n\nactions > label\n background-color: white\n border 1px solid primary-color\n border-radius: 4px\n box-shadow: 1px 2px 0px primary-color\n color: #673ab7\n cursor: pointer\n font: inherit\n line-height: 1em\n padding: 9px 16px\n &:nth-child(n + 2)\n margin-left: 4px\n\na.button\n align-items: center\n display: inline-flex\n justify-content: center\n text-align: center\n text-decoration: none\n\n // Hack for merch icon spacing\n > :nth-child(2)\n margin-left: 5px\n\nbutton, a.button\n background-color: white\n border 1px solid primary-color\n border-radius: 4px\n box-shadow: 1px 2px 0px primary-color\n color: #673ab7\n cursor: pointer\n font-size: inherit\n line-height: 1em\n padding: 9px 8px\n white-space: nowrap\n\n &.full\n width: 100%\n\n &:focus\n background-color: active-color\n color: rgba(0, 0, 0, 0.69)\n outline-offset: 4px\n\n &:active, &.active\n background-color: primary-color\n border 1px solid primary-color\n color: white\n box-shadow: 1px 2px 0px #241440 inset\n\n &:disabled\n background-color: #eee\n border-color: #4e4e4e\n box-shadow: 1px 2px 0px #4e4e4e\n color: #4e4e4e\n cursor: default\n\ntools, patterns\n background-color: white\n border-bottom: 2px solid primary-color\n display: flex\n width: 100%\n\n > *\n background-repeat: no-repeat\n background-position: 50% 50%\n border-right: 1px solid primary-color\n cursor: pointer\n display: block\n width: 49px\n height: 48px\n &:hover\n background-color: highlight-color\n &.active\n background-color: active-color\n\n > tool.eraser\n order: 2\n background-image: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAAK/INwWK6QAAAIdJREFUeJzNUsERwCAIw15n031wDt0Hl0s/9VoF9NnmZzRBCERfI2zusdOtDABmopRGVoRCrdviADNMiADM6L873Mql2NYiw3E2WItzVi2dSuw8JBHNvQyegcU4vmjNFesWZrHFTSlYQ/RhRDgatKZFnXPy7zMIoVaYa3fH5i3PTHira4r/gQv1W1E4p9FksQAAAABJRU5ErkJggg==\")\n\n > .selection\n order: 2\n background-image: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAiUlEQVRYR+1XQQrAIAyr/3/0RLAyqoUdzNJDvFnEpkkM2MzssX21Qw1SGo0igHfNgfiZ6/sI4HqDSVs6wGlaCNXZpQ7gN80jkIxyNAtLkjIA0BOn99O0d0RlJIjvFC3JZkJ0Q3kgMqAcWIwoB8oEkXKAHsV0APIAXQI6AHkA9vf78jUbZ+gAaB7opmM7IWnG3nUAAAAASUVORK5CYII=\")\n\ntools\n > *\n pixelated()\n\npatterns\n margin-top: -1px\n\n &:empty\n display: none\n\n > pattern\n display: flex\n padding: 0 8px\n align-items: center\n width: 64px\n overflow: hidden\n\n > preview\n position: relative\n transform: scale(0.0625, 0.0625)\n top: -14px\n\n > *\n transform: scale(4)\n\npre.position\n background-color: rgba(255, 255, 255, 0.9375)\n border: 1px solid black\n box-shadow: 1px 1px 0 0 rgba(0,0,0,0.5)\n padding: 2px 6px 2px 4px\n font-family: inherit\n pointer-events: none\n padding: 4px\n position: absolute\n left: 1rem\n top: calc(45px + 1rem)\n\n &:empty\n display: none\n\npre.debug\n &:empty\n display: none\n\n@media only screen and (max-width: 768px)\n aside.actions\n border-top: none\n padding-top: 0\n > section\n &:first-child\n display: none\n &:nth-child(2)\n margin-top: 0\n\n button\n > span.description\n display: none\n\n tools, patterns\n order: 2\n border: none\n width: 49px\n height: 48px\n\n > *\n border-top: 1px solid primary-color\n display: none\n\n tool.active\n display: block\n\n pattern.active\n display: flex\n\n &.open\n background-color: primary-color\n display: grid\n grid-gap: 1px\n position: absolute\n width: 100%\n height: 100%\n grid-template-columns: 1fr 1fr 1fr 1fr 1fr 1fr 1fr 1fr\n z-index: 1\n\n > *\n background-color: white\n background-size: 100%\n border: none\n display: block\n image-rendering: pixelated\n height: 100%\n width: 100%\n\n &:hover\n background-color: #FFE0B2\n" + "content": "primary-color-dark = #4a148c\nprimary-color = #673ab7\nhighlight-color = #FFE0B2\nactive-color = #FFC107\nbg-color = #ede7f6\n\npixelated()\n -ms-interpolation-mode: nearest-neighbor\n image-rendering: crisp-edges\n image-rendering: pixelated\n\n@font-face\n font-display: auto\n font-family: 'Chicago'\n src: url('assets/fonts/chicago.woff2') format('woff2'),\n url('assets/fonts/chicago.woff') format('woff')\n font-weight: normal\n font-style: normal\n\n*\n box-sizing: border-box\n\nimg\n max-width: 100%\n\n.hidden\n display: none !important\n\n#modal \n > *\n border: 1px solid primary-color\n border-radius: 4px\n box-shadow: 1px 2px 0px primary-color\n color: inherit\n padding: 1rem\n\n > h1, > h2\n margin-top: 0\n\n > section.purchase\n background-color: transparent\n border: none\n border-radius: 0\n box-shadow: none\n padding: 0\n\n > .publish\n > p.status:empty\n margin: 0\n \n > pre\n user-select: all\n \n > actions\n display: flex\n > button:last-child\n margin-left: auto\n\n:focus\n color: white\n background-color: primary-color\n outline: none\n\nhtml, body\n height: 100%\n\nbody\n color: #241440\n display: flex\n font-family: Chicago, sans-serif\n font-size: 16px\n line-height: 1rem\n margin: 0\n overflow: hidden\n user-select: none\n\np\n font-family: sans-serif\n\n// Input and form things\ninput, textarea, select, button\n font-family: inherit\n\ninput\n background-color: bg-color\n border: 1px solid primary-color\n border-radius: 4px\n box-shadow: 1px 2px 0px primary-color inset\n color: primary-color\n font-size: inherit\n padding: 2px 0.25em\n\n // Firefox number spinners are a crime to my eyes ;_;\n // TODO Custom style for number spinners on all browsers\n &[type=\"number\"]\n -moz-appearance: textfield\n \n &:focus\n background-color: active-color\n color: rgba(0, 0, 0, 0.69)\n\n@keyframes note-active\n from\n background-color: rgba(0, 0, 0, 0)\n\n to\n background-color: rgba(255, 0, 255, 0)\n\n// Background has to be on ::after so it is above the ledger lines on ::before\n// Accidentals are in ::after content, vertically centered and left of the bg\nnote\n font-size: 48px\n height: 48px\n pixelated()\n position: absolute\n width: 48px\n\n &.active\n animation-name: note-active\n animation-duration: 0.25s\n\n &::after\n align-items: center\n background-repeat: no-repeat\n background-position: 100% 50%\n content: \"\"\n display: flex\n position: absolute\n left: 0\n top: 0\n width: 100%\n height: 100%\n text-indent: -12px\n\n &.♭\n &::after\n content: \"♭\"\n\n &.♯\n &::after\n content: \"♯\"\n\n // Extra ledger lines\n &.C4, &.A5, &.C6, &.C2, &.E2, &.B5, &.D2\n &::before\n content: \"\"\n width: 48px\n left: 0px\n top: 23px\n position: absolute\n height: 0\n border-bottom: 2px solid black\n\n &.B5\n &::before\n top: 40px\n\n &.D2\n &::before\n top: -8px\n\nsong-section\n height: 483px\n position: absolute\n top: -241px\n\n &::after\n content: \"\"\n border-right: 2px solid black\n height: 100%\n position: absolute\n right: 10px\n\n > span.measure-number\n background-color: rgba(255, 255, 255, 0.9375)\n border: 1px solid black\n box-shadow: 1px 1px 0 0 rgba(0,0,0,0.5)\n font-style: italic\n left: 0px\n padding: 2px 6px 2px 4px\n position: absolute\n top: -132px\n\n > div.key-signature\n &.s > ::after\n content: \"♯\"\n\n &.f > ::after\n content: \"♭\"\n\n > *\n display: none\n font-size: 96px\n height: 48px\n position: absolute\n width: 48px\n\n &::after\n align-items: center\n display: flex\n height: 100%\n width: 100%\n\n &.s1, &.s2, &.s3, &.s4, &.s5, &.s6, &.s7\n > :nth-child(1)\n display: initial\n top: -24px\n left: -96px\n &.s2, &.s3, &.s4, &.s5, &.s6, &.s7\n > :nth-child(2)\n display: initial\n top: 48px\n left: -72px\n &.s3, &.s4, &.s5, &.s6, &.s7\n > :nth-child(3)\n display: initial\n top: -48px\n left: -48px\n &.s4, &.s5, &.s6, &.s7\n > :nth-child(4)\n display: initial\n top: 24px\n left: -24px\n &.s5, &.s6, &.s7\n > :nth-child(5)\n display: initial\n top: 96px\n left: 0\n &.s6, &.s7\n > :nth-child(6)\n display: initial\n top: 0px\n left: 24px\n &.s7\n > :nth-child(7)\n display: initial\n top: 72px\n left: 48px\n \n &.f1, &.f2, &.f3, &.f4, &.f5, &.f6, &.f7\n > :nth-child(1)\n display: initial\n top: 72px\n left: -96px\n &.f2, &.f3, &.f4, &.f5, &.f6, &.f7\n > :nth-child(2)\n display: initial\n top: 0px\n left: -72px\n &.f3, &.f4, &.f5, &.f6, &.f7\n > :nth-child(3)\n display: initial\n top: 96px\n left: -48px\n &.f4, &.f5, &.f6, &.f7\n > :nth-child(4)\n display: initial\n top: 24px\n left: -24px\n &.f5, &.f6, &.f7\n > :nth-child(5)\n display: initial\n top: -48px\n left: 0\n &.f6, &.f7\n > :nth-child(6)\n display: initial\n top: 48px\n left: 24px\n &.f7\n > :nth-child(7)\n display: initial\n top: -24px\n left: 48px\n\ntd\n > select\n width: 100%\n > input\n border-radius: 0\n box-shadow: none\n > aside.fx-picker\n > label\n display: none\n\n &.sprite\n text-align: center\n vertical-align: middle\n\n > img\n margin-right: 1rem\n vertical-align: middle\n \n &.input\n > input[type=number]\n display: block\n margin: auto\n width: 60px\n\nsection.settings\n overflow: auto\n padding: 1rem\n position: relative\n\n > h2\n margin: 0 0 1rem\n > button.close\n position: absolute\n top: 1rem\n right: 1rem\n\n > table\n margin: 0 -8px\n width: calc(100% + 16px)\n\nsection.demo-picker\n overflow: auto\n padding: 1rem\n position: relative\n\n > h2\n margin: 0 0 1rem\n > button.close\n position: absolute\n top: 1rem\n right: 1rem\n\n > table\n font-size: 18px\n > tbody\n > tr\n cursor: pointer\n line-height: 2rem\n\n &:hover\n background-color: rgba(103, 58, 183, 0.19)\n\nviewport\n background-attachment: local\n background-color: bg-color\n display: flex\n height: 100%\n align-items: center\n overflow-x: scroll\n overflow-y: hidden\n\n > staff\n background-color: rgba(255, 255, 255, 0.9375)\n border: 1px solid rgba(0, 0, 0, 0.5)\n box-sizing: content-box\n box-shadow: 1px 1px 0 0 rgba(0, 0, 0, 0.5)\n display: block\n flex: 0 0 auto\n padding: 96px 0\n position: relative\n margin: 0 48px\n z-index: 0\n\n // Hack for right margin inside scrollable viewport\n // Also serving as song end bar\n &::after\n border-left: 8px solid black\n content: \"\"\n position: absolute\n right: -48px\n top: 96px\n width: 48px\n height: calc(100% - 192px)\n z-index: -1\n\n > z-meter\n display: block\n position: absolute\n left: 256px\n top: 96px\n height: calc(100% - 192px)\n width: calc(100% - 256px)\n\n &::before\n content: \"\"\n border-left: 2px solid black\n position: absolute\n height: 100%\n left: -257px\n\n > div.repeat\n position: absolute\n right: 0\n height: 100%\n\n &::before, &::after\n content: \"\"\n display: block\n background-color: black\n border-radius: 100%\n position: absolute\n width: 16px\n height: 16px\n right: 16px\n top: 66px\n\n &::after\n top: 114px\n \n &.bass\n position: relative\n top: 288px\n\n > notes\n display: block\n position: absolute\n left: 256px\n top: 337px\n\n > pattern-preview\n opacity: 0.5\n position: absolute\n\n > selection\n background-color: rgba(103, 58, 183, 0.25)\n border: 2px dashed primary-color\n position: absolute\n left: -150px\n z-index: 20\n\n > button\n display: none\n position: absolute\n top: 0\n left: 0\n right: 0\n bottom: 0\n margin: auto\n width: 48px\n height: 48px\n\n &.up\n bottom: calc(100%+4px)\n top: auto\n &.down\n top: calc(100%+4px)\n bottom: auto\n &.left\n right: calc(100%+4px)\n left: auto\n &.right\n left: calc(100%+4px)\n right: auto\n\n > actions\n display: none\n position: absolute\n\n > button\n margin-left: 4px\n\n &.t > actions\n top: 0\n &.b > actions\n bottom: 0\n &.l > actions\n left: 0\n &.r > actions\n right: 0\n\n &.set \n > actions\n display: flex\n > button\n display: block\n\n > lines\n display: block\n margin-bottom: 48px\n \n &:nth-child(2)\n margin-bottom: 0\n\n > line:last-child\n height: 0\n\n > line\n border-top: 3px solid black\n display: block\n height: 48px\n\n > playhead\n border-left: 1px solid rgba(103, 58, 183, 0.5)\n border-right: 1px solid rgba(103, 58, 183, 0.5)\n position: absolute\n top: 0\n height: 674px\n width: 2px\n z-index: 10\n\n &.buffer-start\n display: none\n border-color: rgba(255, 0, 0, 0.5)\n\n &.buffer-end\n display: none\n border-color: rgba(0, 0, 255, 0.5)\n\n > img\n position: absolute\n height: 600px\n top: -94px\n left: -120px\n\n &:last-child\n left: -100px\n top: 181px\n\nform\n > label\n display: block\n\n > h3\n font-size: 1rem\n\n &.inline\n display: inline-block\n margin-right: 0.5em\n\n > input\n padding-left: 2px\n width: 100%\n\n > actions\n display: flex\n justify-content: space-between\n margin-top: 1em\n\n &.purchase\n width: 672px\n\napp\n display: flex\n flex: 1 0\n height: 100%\n flex-direction: column\n\nbutton.loop\n font-size: 32px\n line-height: 1rem\n\naside.meter-picker\n margin-left: 8px\n > button\n border-radius: 0\n\n &:first-child\n border-top-left-radius: 4px\n border-bottom-left-radius: 4px\n\n &:last-child\n border-top-right-radius: 4px\n border-bottom-right-radius: 4px\n\naside.note-control\n > section\n display: flex\n margin-left: 1rem\n \n > label\n display: flex\n align-items: center\n margin-right: 4px\n\n > button\n flex: 0 0 auto\n font-size: 20px\n line-height: 1rem\n width: 36px\n\n border-radius: 0\n\n &.triplet\n font-size: 16px\n\n &:nth-child(n + 3)\n border-left: 0\n\n &:nth-child(2)\n border-top-left-radius: 4px\n border-bottom-left-radius: 4px\n\n &.snap\n > button\n &:nth-child(5)\n border-top-right-radius: 4px\n border-bottom-right-radius: 4px\n \n > input\n margin-left: 5px\n width: 60px\n\n &.accidental\n > button:nth-child(4)\n border-top-right-radius: 4px\n border-bottom-right-radius: 4px\n\nsection.persistence\n display: flex\n flex-direction: column\n padding: 1rem\n width: 480px\n\n > button\n margin-top: 8px\n width: 100%\n\n &:first-child\n margin-top: 0\n\nabout > actions\n > button, a.button\n width: 100%\n margin-top: 8px\n\naside\n display: flex\n > label\n display: flex\n align-items: center\n margin-right: 4px\n margin-left: 1rem\n\naside.stereo-analyser\n > canvas\n border: 1px solid #673ab7\n border-radius: 4px\n\naside.fx-picker\n display: flex\n\n > button\n background-size: 100%\n border: 1px solid #673ab7\n border-radius: 4px\n height: 36px\n padding: 0\n margin-left: 2px\n width: 36px\n\naside.actions\n background-color: white\n border-top: 2px solid primary-color\n display: flex\n flex: 0 0 auto\n flex-direction: column\n padding: 4px 4px 0px 4px\n width: 100%\n\n > section:nth-child(2)\n > button, > a.button\n padding: 15px 8px\n\n > section\n display: flex\n &:last-child\n margin-top: 8px\n\n > section.buttons\n > *\n margin-bottom: 6px\n \n &:nth-child(n + 2)\n margin-left: 4px\n \n > form\n display: flex\n \n > button, > a.button\n flex: 0 0 auto\n\n > label\n align-items: center\n border: 1px solid #673ab7\n border-radius: 4px\n box-shadow: 1px 2px 0px #673ab7\n color: #673ab7\n display: flex\n flex-direction: column\n padding: 5px 8px 4px\n white-space: nowrap\n \n > input\n padding: 2px 0 0\n text-align: center\n width: 60px\n \n > h2\n display: block\n font-size: 1em\n font-weight: normal\n margin: 0 0 4px\n \n > .right\n margin-left: auto\n\nactions > label\n background-color: white\n border 1px solid primary-color\n border-radius: 4px\n box-shadow: 1px 2px 0px primary-color\n color: #673ab7\n cursor: pointer\n font: inherit\n line-height: 1em\n padding: 9px 16px\n &:nth-child(n + 2)\n margin-left: 4px\n\na.button\n align-items: center\n display: inline-flex\n justify-content: center\n text-align: center\n text-decoration: none\n\n // Hack for merch icon spacing\n > :nth-child(2)\n margin-left: 5px\n\nbutton, a.button\n background-color: white\n border 1px solid primary-color\n border-radius: 4px\n box-shadow: 1px 2px 0px primary-color\n color: #673ab7\n cursor: pointer\n font-size: inherit\n line-height: 1em\n padding: 9px 8px\n white-space: nowrap\n\n &.full\n width: 100%\n\n &:focus\n background-color: active-color\n color: rgba(0, 0, 0, 0.69)\n outline-offset: 4px\n\n &:active, &.active\n background-color: primary-color\n border 1px solid primary-color\n color: white\n box-shadow: 1px 2px 0px #241440 inset\n\n &:disabled\n background-color: #eee\n border-color: #4e4e4e\n box-shadow: 1px 2px 0px #4e4e4e\n color: #4e4e4e\n cursor: default\n\ntools, patterns\n background-color: white\n border-bottom: 2px solid primary-color\n display: flex\n width: 100%\n\n > *\n background-repeat: no-repeat\n background-position: 50% 50%\n border-right: 1px solid primary-color\n cursor: pointer\n display: block\n width: 49px\n height: 48px\n &:hover\n background-color: highlight-color\n &.active\n background-color: active-color\n\n > tool.eraser\n order: 2\n background-image: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAAK/INwWK6QAAAIdJREFUeJzNUsERwCAIw15n031wDt0Hl0s/9VoF9NnmZzRBCERfI2zusdOtDABmopRGVoRCrdviADNMiADM6L873Mql2NYiw3E2WItzVi2dSuw8JBHNvQyegcU4vmjNFesWZrHFTSlYQ/RhRDgatKZFnXPy7zMIoVaYa3fH5i3PTHira4r/gQv1W1E4p9FksQAAAABJRU5ErkJggg==\")\n\n > .selection\n order: 2\n background-image: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAiUlEQVRYR+1XQQrAIAyr/3/0RLAyqoUdzNJDvFnEpkkM2MzssX21Qw1SGo0igHfNgfiZ6/sI4HqDSVs6wGlaCNXZpQ7gN80jkIxyNAtLkjIA0BOn99O0d0RlJIjvFC3JZkJ0Q3kgMqAcWIwoB8oEkXKAHsV0APIAXQI6AHkA9vf78jUbZ+gAaB7opmM7IWnG3nUAAAAASUVORK5CYII=\")\n\ntools\n > *\n pixelated()\n\npatterns\n margin-top: -1px\n\n &:empty\n display: none\n\n > pattern\n display: flex\n padding: 0 8px\n align-items: center\n width: 64px\n overflow: hidden\n\n > preview\n position: relative\n transform: scale(0.0625, 0.0625)\n top: -14px\n\n > *\n transform: scale(4)\n\npre.position\n background-color: rgba(255, 255, 255, 0.9375)\n border: 1px solid black\n box-shadow: 1px 1px 0 0 rgba(0,0,0,0.5)\n padding: 2px 6px 2px 4px\n font-family: inherit\n pointer-events: none\n padding: 4px\n position: absolute\n left: 1rem\n top: calc(45px + 1rem)\n\n &:empty\n display: none\n\npre.debug\n &:empty\n display: none\n\n@media only screen and (max-width: 768px)\n aside.actions\n border-top: none\n padding-top: 0\n > section\n &:first-child\n display: none\n &:nth-child(2)\n margin-top: 0\n\n button\n > span.description\n display: none\n\n tools, patterns\n order: 2\n border: none\n width: 49px\n height: 48px\n\n > *\n border-top: 1px solid primary-color\n display: none\n\n tool.active\n display: block\n\n pattern.active\n display: flex\n\n &.open\n background-color: primary-color\n display: grid\n grid-gap: 1px\n position: absolute\n width: 100%\n height: 100%\n grid-template-columns: 1fr 1fr 1fr 1fr 1fr 1fr 1fr 1fr\n z-index: 1\n\n > *\n background-color: white\n background-size: 100%\n border: none\n display: block\n image-rendering: pixelated\n height: 100%\n width: 100%\n\n &:hover\n background-color: #FFE0B2\n" }, "templates/about.jadelet": { "content": "about\n h1 About\n\n p ProTip™ hold Shift to sharp, Ctrl to flat\n\n p\n | By\n a(href=\"https://danielx.net\") Daniel X. Moore\n | creator of\n a(href=\"https://whimsy.space\") Whimsy.Space\n\n p\n" @@ -427,7 +427,7 @@ "content": "" }, "templates/persistence.jadelet": { - "content": "section.persistence\n button(click=@showDemoSongPicker) Load a demo song\n button(click=@saveFile) Save to disk\n button(click=@openFile) Load from disk\n\n button(click=@loadFromURLString) Load from URL\n button(click=@exportAudio) Export to .wav or .mp3\n" + "content": "section.persistence\n button(click=@showDemoSongPicker) Load a demo song\n button(click=@saveFile) Save to disk\n button(click=@openFile) Load from disk\n button(click=@exportAudio) Export to .wav or .mp3\n" }, "templates/arranger.jadelet": { "content": "section.arranger\n h2 Sections\n table\n thead\n tr\n th Name\n th Time Signature\n th Key Signature\n th Length\n th Tempo\n th FX\n th Action\n tbody\n @items\n actions\n button(click=@newSection) + New Section\n" @@ -865,7 +865,7 @@ "content": "var Observable;\n\nObservable = system.ui.Observable;\n\nmodule.exports = {\n name: \"Delay\",\n value: Observable(100),\n min: 0,\n max: 250,\n unit: \"ms\"\n};\n" }, "templates/persistence": { - "content": "module.exports = system.ui.Jadelet.exec([\"section\",{\"class\":[\"persistence\"]},[[\"button\",{\"click\":{\"bind\":\"showDemoSongPicker\"}},[\"Load a demo song\"]],[\"button\",{\"click\":{\"bind\":\"saveFile\"}},[\"Save to disk\"]],[\"button\",{\"click\":{\"bind\":\"openFile\"}},[\"Load from disk\"]],[\"button\",{\"click\":{\"bind\":\"loadFromURLString\"}},[\"Load from URL\"]],[\"button\",{\"click\":{\"bind\":\"exportAudio\"}},[\"Export to .wav or .mp3\"]]]]);" + "content": "module.exports = system.ui.Jadelet.exec([\"section\",{\"class\":[\"persistence\"]},[[\"button\",{\"click\":{\"bind\":\"showDemoSongPicker\"}},[\"Load a demo song\"]],[\"button\",{\"click\":{\"bind\":\"saveFile\"}},[\"Save to disk\"]],[\"button\",{\"click\":{\"bind\":\"openFile\"}},[\"Load from disk\"]],[\"button\",{\"click\":{\"bind\":\"exportAudio\"}},[\"Export to .wav or .mp3\"]]]]);" }, "templates/arranger": { "content": "module.exports = system.ui.Jadelet.exec([\"section\",{\"class\":[\"arranger\"]},[[\"h2\",{},[\"Sections\"]],[\"table\",{},[[\"thead\",{},[[\"tr\",{},[[\"th\",{},[\"Name\"]],[\"th\",{},[\"Time Signature\"]],[\"th\",{},[\"Key Signature\"]],[\"th\",{},[\"Length\"]],[\"th\",{},[\"Tempo\"]],[\"th\",{},[\"FX\"]],[\"th\",{},[\"Action\"]]]]]],[\"tbody\",{},[{\"bind\":\"items\"}]]]],[\"actions\",{},[[\"button\",{\"click\":{\"bind\":\"newSection\"}},[\"+ New Section\"]]]]]]);"