├── .gitattributes ├── JSONCrush.js ├── NoteCraft.zip ├── README.md ├── index.html ├── index.min.html ├── levelData.js └── screenshotSmall.png /.gitattributes: -------------------------------------------------------------------------------- 1 | *.html linguist-language=Javascript 2 | -------------------------------------------------------------------------------- /JSONCrush.js: -------------------------------------------------------------------------------- 1 | /////////////////////////////////////////////////////////////////////// 2 | // JSONCrush by Frank Force [MIT] https://github.com/KilledByAPixel/JSONCrush 3 | /////////////////////////////////////////////////////////////////////// 4 | 5 | "use strict"; 6 | 7 | function JSONCrush(string) 8 | { 9 | const maxSubstringLength = 50; // speed it up by limiting max length 10 | const delimiter = '\u0001'; // used to split parts of crushed string 11 | 12 | const JSCrush=(string, replaceCharacters)=> 13 | { 14 | // JSCrush Algorithm (repleace repeated substrings with single characters) 15 | let replaceCharacterPos = replaceCharacters.length; 16 | let splitString = ''; 17 | 18 | const ByteLength =(string)=>encodeURI(encodeURIComponent(string)).replace(/%../g,'i').length; 19 | const HasUnmatchedSurrogate =(string)=> 20 | { 21 | // check ends of string for unmatched surrogate pairs 22 | let c1 = string.charCodeAt(0); 23 | let c2 = string.charCodeAt(string.length-1); 24 | return (c1 >= 0xDC00 && c1 <= 0xDFFF) || (c2 >= 0xD800 && c2 <= 0xDBFF); 25 | } 26 | 27 | // count instances of substrings 28 | let substringCount = {}; 29 | for (let substringLength = 2; substringLength < maxSubstringLength; substringLength++) 30 | for (let i = 0; i < string.length - substringLength; ++i) 31 | { 32 | let substring = string.substr(i, substringLength); 33 | 34 | // don't recount if already in list 35 | if (substringCount[substring]) 36 | continue; 37 | 38 | // prevent breaking up unmatched surrogates 39 | if (HasUnmatchedSurrogate(substring)) 40 | continue; 41 | 42 | // count how many times the substring appears 43 | let count = 1; 44 | for (let substringPos = string.indexOf(substring, i+substringLength); substringPos >= 0; ++count) 45 | substringPos = string.indexOf(substring, substringPos + substringLength); 46 | 47 | // add to list if it appears multiple times 48 | if (count > 1) 49 | substringCount[substring] = count; 50 | } 51 | 52 | while(true) // loop while string can be crushed more 53 | { 54 | // get the next character that is not in the string 55 | for (;replaceCharacterPos-- && string.includes(replaceCharacters[replaceCharacterPos]);){} 56 | if (replaceCharacterPos < 0) 57 | break; // ran out of replacement characters 58 | let replaceCharacter = replaceCharacters[replaceCharacterPos]; 59 | 60 | // find the longest substring to replace 61 | let bestSubstring; 62 | let bestLengthDelta = 0; 63 | let replaceByteLength = ByteLength(replaceCharacter); 64 | for (let substring in substringCount) 65 | { 66 | // calculate change in length of string if it substring was replaced 67 | let count = substringCount[substring]; 68 | let lengthDelta = (count-1)*ByteLength(substring) - (count+1)*replaceByteLength; 69 | if (!splitString.length) 70 | lengthDelta -= ByteLength(delimiter); // include the delimiter length 71 | if (lengthDelta <= 0) 72 | delete substringCount[substring] 73 | else if (lengthDelta > bestLengthDelta) 74 | { 75 | bestSubstring = substring 76 | bestLengthDelta = lengthDelta; 77 | } 78 | } 79 | if (!bestSubstring) 80 | break; // string can't be compressed further 81 | 82 | // create new string with the split character 83 | string = string.split(bestSubstring).join(replaceCharacter) + replaceCharacter + bestSubstring; 84 | splitString = replaceCharacter + splitString; 85 | 86 | // update substring count list after the replacement 87 | let newSubstringCount = {}; 88 | for (let substring in substringCount) 89 | { 90 | // make a new substring with the replacement 91 | let newSubstring = substring.split(bestSubstring).join(replaceCharacter); 92 | 93 | // count how many times the new substring appears 94 | let count = 0; 95 | for (let i = string.indexOf(newSubstring); i >= 0; ++count) 96 | i = string.indexOf(newSubstring, i + newSubstring.length); 97 | 98 | // add to list if it appears multiple times 99 | if (count > 1) 100 | newSubstringCount[newSubstring] = count; 101 | 102 | } 103 | substringCount = newSubstringCount; 104 | } 105 | 106 | return {a:string, b:splitString}; 107 | } 108 | 109 | // create a string of replacement characters 110 | let characters = []; 111 | 112 | // prefer replacing with characters that will not be escaped by encodeURIComponent 113 | const unescapedCharacters = `-_.!~*'()`; 114 | for (let i=127; --i;) 115 | { 116 | if 117 | ( 118 | (i>=48 && i<=57) || // 0-9 119 | (i>=65 && i<=90) || // A-Z 120 | (i>=97 && i<=122)|| // a-z 121 | unescapedCharacters.includes(String.fromCharCode(i)) 122 | ) 123 | characters.push(String.fromCharCode(i)); 124 | } 125 | 126 | // pick from extended set last 127 | for (let i=32; i<255; ++i) 128 | { 129 | let c = String.fromCharCode(i); 130 | if (c!='\\' && !characters.includes(c)) 131 | characters.unshift(c); 132 | } 133 | 134 | // remove delimiter if it is found in the string 135 | string = string.replace(new RegExp(delimiter,'g'),''); 136 | 137 | // swap out common json characters 138 | string = JSONCrushSwap(string); 139 | 140 | // crush with JS crush 141 | const crushed = JSCrush(string, characters); 142 | 143 | // insert delimiter between JSCrush parts 144 | let crushedString = crushed.a; 145 | if (crushed.b.length) 146 | crushedString += delimiter + crushed.b; 147 | 148 | // fix issues with some links not being recognized properly 149 | crushedString += '_' 150 | 151 | // encode URI 152 | return encodeURIComponent(crushedString); 153 | } 154 | 155 | function JSONUncrush(string) 156 | { 157 | // string must be a decoded URI component, searchParams.get() does this automatically 158 | 159 | // remove last character 160 | string = string.substring(0, string.length - 1); 161 | 162 | // unsplit the string using the delimiter 163 | const stringParts = string.split('\u0001'); 164 | 165 | // JSUncrush algorithm 166 | let uncrushedString = stringParts[0]; 167 | if (stringParts.length > 1) 168 | { 169 | let splitString = stringParts[1]; 170 | for (let character of splitString) 171 | { 172 | // split the string using the current splitCharacter 173 | let splitArray = uncrushedString.split(character); 174 | 175 | // rejoin the string with the last element from the split 176 | uncrushedString = splitArray.join(splitArray.pop()); 177 | } 178 | } 179 | 180 | // unswap the json characters in reverse direction 181 | return JSONCrushSwap(uncrushedString, 0); 182 | } 183 | 184 | function JSONCrushSwap(string, forward=1) 185 | { 186 | // swap out characters for lesser used ones that wont get escaped 187 | const swapGroups = 188 | [ 189 | ['"', "'"], 190 | ["':", "!"], 191 | [",'", "~"], 192 | ['}', ")", '\\', '\\'], 193 | ['{', "(", '\\', '\\'], 194 | ]; 195 | 196 | const Swap=(string, g)=> 197 | { 198 | let regex = new RegExp(`${(g[2]?g[2]:'')+g[0]}|${(g[3]?g[3]:'')+g[1]}`,'g'); 199 | return string.replace(regex, $1 => ($1 === g[0] ? g[1] : g[0])); 200 | } 201 | 202 | // need to be able to swap characters in reverse direction for uncrush 203 | if (forward) 204 | for (let i = 0; i < swapGroups.length; ++i) 205 | string = Swap(string, swapGroups[i]); 206 | else 207 | for (let i = swapGroups.length; i--;) 208 | string = Swap(string, swapGroups[i]); 209 | 210 | return string; 211 | } -------------------------------------------------------------------------------- /NoteCraft.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KilledByAPixel/NoteCraft/a967ed39023f3b6738a81b7b888f8da0c6338ad8/NoteCraft.zip -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # NoteCraft 🎵🔨 2 | 3 | # [Live Demo](https://killedbyapixel.github.io/NoteCraft/) 4 | # [JS13k Submission](https://js13kgames.com/entries/notecraft) 5 | 6 | NoteCraft is a Cellular Automata Music System 7 | 8 |  9 | 10 | Features 11 | - Export to ZzFXM and OS13k 12 | - Share compressed links 13 | - Several example songs 14 | - Instruments are customizable 15 | - Undo and Redo 16 | - Cut, copy, and paste 17 | - Turing complete! 18 | 19 | Controls 20 | - Draw = Left Mouse 21 | - Erase = Ctrl + Left Mouse or Left + Right Mouse 22 | - Test Cell / Eyedropper = Right Mouse 23 | - Move View = Click & Drag Middle Mouse 24 | - Zoom View = Wheel 25 | - Select Area = Shift + Left Mouse 26 | 27 | Cell Types 28 | - Power/Mover - Provides power to neighbor cells and moves 29 | - Power Line - Transfers power 30 | - Rotator - Rotates cells and redirects movement when powered 31 | - Copier - Copies and unpoweres cell when powered 32 | - Push Blocks - Can be pushed or not pushed 33 | - Stop Block - Destroys anything pushed into it when powered 34 | - Note - Plays a note when powered and holds until unpowered 35 | - Note Control - Changes the key or attenuation of conneted notes 36 | 37 | Selection Controls 38 | - R/E = Rotate 39 | - Q = Mirror 40 | - T = Spread 41 | - WASD = Move 42 | 43 | Play Controls 44 | - Toggle Play/Edit = Space 45 | - 0 = Stop 46 | - 1 = Play 47 | - 2 = Pause 48 | - 3 = Step 49 | - 4 = Fast Forward 50 | -------------------------------------------------------------------------------- /index.html: -------------------------------------------------------------------------------- 1 | 11 | 12 |
157 | 158 | 159 | -------------------------------------------------------------------------------- /index.min.html: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /levelData.js: -------------------------------------------------------------------------------- 1 | const levelData = 2 | [ 3 | 4 | [6,"404 Demo",100,0,517,282,728,0,0,[25,3,6,1,2,4,6,1,4,5,2,1,8,5,3,0,12,5,3,0,13,5,3,0,14,5,3,0,15,5,3,0,16,5,2,1,20,5,2,1,24,5,3,0,4,6,3,0,8,6,3,0,12,6,3,0,16,6,3,0,20,6,3,0,24,6,3,0,4,7,3,0,8,7,3,0,12,7,3,0,16,7,3,0,20,7,3,0,24,7,3,0,4,8,3,0,8,8,3,0,12,8,3,0,16,8,3,0,20,8,3,0,24,8,3,0,4,9,3,0,5,9,3,0,6,9,3,0,7,9,3,0,8,9,3,0,12,9,3,0,16,9,3,0,20,9,3,0,21,9,3,0,22,9,3,0,23,9,3,0,24,9,3,0,8,10,3,0,12,10,3,0,16,10,3,0,24,10,3,0,8,11,3,0,12,11,3,0,16,11,3,0,24,11,3,0,8,12,3,0,12,12,3,0,16,12,3,0,24,12,3,0,8,13,2,1,12,13,2,1,13,13,3,0,14,13,3,0,15,13,3,0,16,13,3,0,24,13,2,1,4,14,1,1,26,14,6,1,3,15,6,1,18,17,6,0,23,17,6,0,19,18,1,1,7,19,1,4,18,19,6,0,20,19,7,2,21,19,7,2,23,19,6,0,6,20,2,3,7,20,7,1,8,20,2,2,17,20,1,4,18,20,6,0,20,20,2,0,21,20,2,0,7,21,6,0,19,21,1,1,20,21,3,0,21,21,0,0,22,21,3,0,23,21,3,0,24,21,3,0,25,21,6,0,7,22,1,4,17,22,1,4,24,22,0,0,25,22,1,4,17,23,6,0,18,23,2,3,19,23,3,0,20,23,3,0,21,23,3,0,22,23,3,0,23,23,3,0,24,23,3,0,20,24,1,4,23,24,1,4,24,24,6,0],29,29], 5 | 6 | [6,"Tetris Loop",120,0,-26,96,809,0,0,[31,5,0,0,28,6,0,0,29,6,0,0,31,6,0,0,17,7,0,0,18,7,0,0,19,7,0,0,21,7,0,0,22,7,0,0,24,7,0,0,25,7,0,0,26,7,0,0,28,7,0,0,31,7,0,0,34,7,0,0,35,7,0,0,18,8,0,0,21,8,0,0,22,8,0,0,25,8,0,0,28,8,0,0,31,8,0,0,33,8,0,0,34,8,0,0,20,10,3,0,21,10,3,0,29,10,3,0,30,10,3,0,20,11,3,0,21,11,3,0,29,11,3,0,30,11,3,0,20,12,3,0,21,12,3,0,29,12,3,0,30,12,3,0,20,13,3,0,21,13,3,0,29,13,3,0,30,13,3,0,15,14,3,0,16,14,3,0,20,14,3,0,21,14,3,0,29,14,3,0,30,14,3,0,40,14,3,0,41,14,3,0,15,15,3,0,16,15,3,0,20,15,3,0,24,15,3,0,25,15,3,0,30,15,3,0,32,15,3,0,33,15,3,0,34,15,3,0,35,15,3,0,36,15,3,0,40,15,3,0,41,15,3,0,15,16,3,0,16,16,3,2,17,16,7,4,20,16,3,0,22,16,3,2,24,16,3,2,25,16,3,0,28,16,3,2,30,16,3,0,32,16,3,0,33,16,3,0,34,16,3,0,35,16,3,0,36,16,3,0,38,16,3,2,40,16,3,0,41,16,3,2,11,17,6,0,16,17,2,0,17,17,7,4,20,17,2,0,22,17,2,0,24,17,2,0,25,17,7,4,26,17,7,4,28,17,2,0,30,17,2,0,32,17,2,0,33,17,7,4,34,17,7,4,36,17,2,0,38,17,2,0,40,17,2,0,41,17,7,4,42,17,7,4,43,17,7,4,10,18,7,4,16,18,1,1,42,18,6,0,43,18,7,4,9,19,7,4,10,19,7,4,12,19,2,2,14,19,2,3,16,19,2,2,18,19,2,3,22,19,2,3,24,19,2,2,26,19,2,3,30,19,2,3,32,19,2,2,34,19,2,3,36,19,2,2,38,19,2,2,40,19,2,3,42,19,7,4,43,19,7,4,9,20,7,4,10,20,6,0,9,21,7,4,10,21,7,4,11,21,7,4,12,21,2,0,14,21,7,4,15,21,7,4,16,21,2,0,18,21,7,4,19,21,7,4,20,21,2,0,22,21,7,4,23,21,7,4,24,21,2,0,26,21,7,4,27,21,7,4,28,21,2,0,30,21,2,0,32,21,7,4,33,21,7,4,34,21,7,4,35,21,7,4,36,21,2,0,38,21,2,0,40,21,2,0,41,21,6,0,12,22,3,0,13,22,3,0,14,22,3,0,15,22,3,0,16,22,3,0,20,22,3,2,23,22,3,2,24,22,3,0,28,22,3,2,30,22,3,2,36,22,3,0,38,22,3,2,40,22,3,2,12,23,3,0,13,23,3,0,14,23,3,0,15,23,3,0,16,23,3,0,24,23,3,0,28,23,3,0,36,23,3,0,40,23,3,0,24,24,3,0,28,24,3,0,36,24,3,0,37,24,3,0,40,24,3,0,24,25,3,0,28,25,3,0,36,25,3,0,37,25,3,0,40,25,3,0,24,26,3,0,36,26,3,0,37,26,3,0,36,27,3,0,37,27,3,0,36,28,3,0,37,28,3,0],57,57], 7 | 8 | [6,"Mario Intro",100,0,392,186,485,0,0,[42,9,3,0,23,10,6,0,24,10,2,2,42,10,3,0,21,11,3,3,22,11,2,3,24,11,1,1,26,11,6,0,37,11,3,0,39,11,3,0,40,11,3,0,42,11,3,0,44,11,3,0,52,11,3,0,22,12,2,3,26,12,2,3,27,12,3,1,32,12,3,0,37,12,3,0,39,12,3,0,40,12,3,0,42,12,3,0,44,12,3,0,48,12,3,0,52,12,3,0,22,13,6,0,26,13,2,3,27,13,3,3,32,13,3,0,37,13,3,0,39,13,3,0,40,13,3,0,42,13,3,0,44,13,3,0,48,13,3,0,52,13,3,0,57,13,3,0,24,14,2,3,25,14,6,0,32,14,3,0,37,14,3,0,40,14,3,0,42,14,3,0,44,14,3,0,46,14,3,0,48,14,3,0,50,14,3,0,52,14,3,0,54,14,3,0,57,14,3,0,58,14,3,0,12,15,3,2,14,15,3,0,15,15,3,0,32,15,3,0,35,15,3,0,37,15,3,0,40,15,3,0,42,15,3,0,44,15,3,0,46,15,3,0,48,15,3,0,50,15,3,0,52,15,3,0,54,15,3,0,57,15,3,0,58,15,3,0,12,16,3,0,14,16,3,0,15,16,3,0,32,16,3,0,35,16,3,0,37,16,3,0,40,16,3,0,42,16,3,0,44,16,3,0,46,16,3,0,48,16,3,0,50,16,3,0,52,16,3,0,54,16,3,0,57,16,3,0,58,16,3,0,12,17,3,0,14,17,3,0,15,17,3,0,17,17,3,0,18,17,3,0,27,17,1,2,32,17,3,0,35,17,3,0,37,17,3,0,40,17,3,0,42,17,3,0,44,17,3,0,46,17,3,0,48,17,3,0,50,17,3,0,52,17,3,0,54,17,3,0,57,17,3,0,58,17,3,0,5,18,3,2,6,18,3,0,10,18,3,2,12,18,3,0,14,18,3,0,15,18,3,0,17,18,3,0,18,18,3,0,19,18,3,0,27,18,0,0,32,18,3,0,35,18,3,0,37,18,3,0,40,18,3,0,42,18,3,0,44,18,3,0,46,18,3,0,48,18,3,0,50,18,3,0,52,18,3,0,54,18,3,0,57,18,3,0,58,18,3,0,5,19,3,0,6,19,3,0,7,19,3,0,8,19,3,0,10,19,3,0,12,19,3,0,14,19,3,2,15,19,2,0,17,19,3,0,18,19,3,0,19,19,3,0,29,19,3,2,32,19,3,0,35,19,3,0,37,19,3,0,40,19,3,0,42,19,3,0,44,19,3,0,46,19,3,2,48,19,3,0,50,19,3,0,52,19,3,2,54,19,3,2,56,19,3,2,58,19,3,0,4,20,7,4,5,20,2,0,6,20,2,0,8,20,2,0,10,20,2,0,11,20,2,0,12,20,3,0,13,20,7,4,14,20,7,4,15,20,7,4,17,20,2,0,18,20,7,4,19,20,7,4,20,20,7,4,27,20,1,1,28,20,0,3,29,20,2,0,30,20,7,4,32,20,2,0,33,20,7,4,35,20,2,0,36,20,7,4,37,20,3,0,38,20,2,0,40,20,2,0,42,20,2,0,43,20,2,0,44,20,3,0,46,20,2,0,47,20,2,0,48,20,3,2,50,20,3,2,51,20,2,0,52,20,2,0,54,20,2,0,56,20,2,0,58,20,2,0,59,20,7,4,4,21,1,1,5,21,5,1,21,21,4,0,26,21,7,4,28,21,5,1,61,21,4,0,20,22,7,4,21,22,7,4,22,22,7,4,23,22,7,4,24,22,7,4,25,22,7,4,26,22,7,4,27,22,0,3,40,22,3,0,41,22,3,0,42,22,3,0,43,22,3,0,44,22,3,0,45,22,2,0,47,22,3,0,48,22,3,0,49,22,2,0,50,22,3,0,51,22,3,0,52,22,3,0,56,22,3,0,57,22,2,0,60,22,7,4,26,23,7,4,47,23,3,0,48,23,3,0,49,23,3,0,50,23,3,0,51,23,3,0,52,23,3,2,55,23,3,0,56,23,3,0,57,23,3,2,60,23,7,4,26,24,7,4,27,24,7,4,28,24,7,4,29,24,7,4,30,24,7,4,31,24,7,4,32,24,7,4,33,24,7,4,34,24,7,4,35,24,7,4,36,24,7,4,37,24,7,4,38,24,7,4,39,24,7,4,40,24,7,4,41,24,7,4,42,24,7,4,43,24,7,4,44,24,7,4,45,24,7,4,46,24,7,4,47,24,7,4,48,24,7,4,49,24,7,4,50,24,7,4,51,24,7,4,52,24,7,4,53,24,7,4,54,24,7,4,55,24,7,4,56,24,7,4,57,24,7,4,58,24,7,4,59,24,7,4,60,24,7,4,26,25,7,4,26,26,7,4,37,26,3,0,38,26,3,0,39,26,3,0,40,26,3,0,46,26,3,2,47,26,7,4,48,26,7,4,49,26,7,4,50,26,7,4,51,26,7,4,52,26,7,4,54,26,3,0,55,26,3,0,56,26,3,0,57,26,3,0,58,26,3,0,59,26,3,0,20,27,7,4,21,27,7,4,22,27,7,4,23,27,7,4,24,27,7,4,25,27,7,4,26,27,7,4,27,27,0,3,36,27,3,0,37,27,3,0,38,27,3,0,39,27,3,0,40,27,2,1,42,27,3,0,43,27,3,0,44,27,3,0,45,27,3,0,46,27,3,0,47,27,2,1,52,27,7,4,54,27,3,0,55,27,3,0,56,27,3,0,57,27,2,1,58,27,3,0,59,27,3,0,60,27,3,0,4,28,1,1,5,28,5,1,21,28,4,0,26,28,7,4,28,28,5,1,61,28,4,0,4,29,7,4,5,29,2,1,6,29,2,1,7,29,3,0,8,29,2,1,10,29,2,1,11,29,2,1,13,29,2,1,14,29,7,4,15,29,7,4,17,29,2,1,18,29,7,4,19,29,7,4,20,29,7,4,27,29,1,1,28,29,0,3,29,29,2,1,30,29,7,4,32,29,2,1,33,29,7,4,35,29,2,1,36,29,7,4,38,29,2,1,41,29,3,0,42,29,2,1,43,29,2,1,45,29,2,1,46,29,2,1,47,29,3,2,49,29,2,1,51,29,2,1,53,29,3,2,54,29,2,1,56,29,2,1,58,29,2,1,59,29,7,4,5,30,3,0,6,30,3,0,7,30,3,2,10,30,3,0,11,30,3,0,13,30,3,0,14,30,3,0,15,30,3,0,17,30,3,0,18,30,3,0,19,30,3,0,29,30,3,0,30,30,3,0,32,30,3,0,38,30,3,0,41,30,3,0,43,30,3,0,45,30,3,0,49,30,3,2,51,30,3,2,56,30,3,0,58,30,3,0,59,30,3,0,10,31,3,0,11,31,3,2,13,31,3,0,14,31,3,0,15,31,3,0,17,31,3,0,18,31,3,0,19,31,3,0,27,31,0,0,29,31,3,0,30,31,3,0,32,31,3,0,38,31,3,0,41,31,3,0,43,31,3,0,45,31,3,0,49,31,3,0,51,31,3,0,56,31,3,0,58,31,3,0,59,31,3,0,14,32,3,0,15,32,3,0,17,32,3,0,18,32,3,0,27,32,1,0,29,32,3,0,30,32,3,0,32,32,3,0,38,32,3,0,41,32,3,0,43,32,3,0,45,32,3,0,49,32,3,0,51,32,3,0,54,32,3,0,55,32,3,0,56,32,3,0,58,32,3,0,59,32,3,0,15,33,3,2,29,33,3,0,30,33,3,0,32,33,3,0,38,33,3,0,41,33,3,0,43,33,3,0,45,33,3,0,48,33,3,0,49,33,3,0,51,33,3,0,54,33,3,0,55,33,3,0,56,33,3,0,58,33,3,0,59,33,3,0,32,34,3,0,38,34,3,0,41,34,3,0,43,34,3,0,45,34,3,0,48,34,3,0,49,34,3,0,55,34,3,0,56,34,3,0,38,35,3,0,41,35,3,0,43,35,3,0],69,69], 9 | 10 | [6,"Row your boat into a fire",120,0,382,163,655,0,0,[37,8,3,0,39,8,3,0,41,8,3,0,42,8,3,0,37,9,3,0,39,9,3,0,41,9,3,0,42,9,3,0,37,10,3,0,39,10,3,0,41,10,3,0,42,10,3,0,12,11,7,4,13,11,7,4,14,11,7,4,15,11,7,4,16,11,7,4,17,11,7,4,18,11,7,4,19,11,7,4,20,11,7,4,21,11,7,4,22,11,7,4,23,11,7,4,24,11,7,4,25,11,7,4,26,11,7,4,27,11,7,4,28,11,7,4,29,11,7,4,30,11,7,4,31,11,7,4,32,11,7,4,35,11,3,0,37,11,3,0,39,11,3,0,41,11,3,0,11,12,0,0,12,12,5,1,15,12,7,4,27,12,3,0,28,12,3,0,32,12,7,4,35,12,3,0,37,12,3,0,39,12,3,0,41,12,3,0,15,13,7,4,17,13,2,0,18,13,7,4,19,13,7,4,21,13,2,0,22,13,7,4,23,13,7,4,25,13,2,0,26,13,7,4,27,13,3,0,28,13,2,0,32,13,7,4,35,13,3,0,36,13,2,0,37,13,2,0,39,13,3,0,40,13,2,0,41,13,2,0,42,13,7,4,43,13,7,4,15,14,1,1,16,14,5,1,42,14,6,0,43,14,7,4,27,15,3,0,28,15,3,0,29,15,7,4,30,15,7,4,33,15,7,4,34,15,7,4,42,15,7,4,43,15,7,4,17,16,0,3,27,16,3,0,28,16,3,0,29,16,3,0,30,16,2,0,31,16,7,4,32,16,7,4,33,16,7,4,42,16,7,4,43,16,7,4,25,17,6,1,29,17,6,1,31,17,6,1,42,17,7,4,23,18,3,3,24,18,2,2,26,18,1,3,30,18,1,1,32,18,2,3,42,18,7,4,25,19,6,1,29,19,6,1,31,19,6,1,42,19,7,4,42,20,7,4,6,21,5,4,7,21,5,4,26,21,2,0,28,21,7,4,29,21,2,0,42,21,7,4,6,22,5,4,7,22,5,4,42,22,6,0,14,23,7,4,15,23,7,4,16,23,7,4,17,23,2,0,18,23,2,0,19,23,3,0,20,23,7,4,21,23,2,0,22,23,2,0,23,23,3,0,24,23,7,4,25,23,2,0,26,23,3,0,27,23,3,0,30,23,2,0,31,23,3,0,32,23,7,4,33,23,2,0,34,23,2,0,35,23,3,0,36,23,7,4,37,23,2,0,38,23,2,0,39,23,3,2,40,23,7,4,41,23,2,0,18,24,3,0,19,24,3,0,21,24,3,0,23,24,3,0,25,24,3,0,26,24,3,0,27,24,3,0,30,24,3,0,31,24,3,0,32,24,3,0,33,24,3,0,35,24,3,0,36,24,3,0,37,24,3,0,41,24,3,2,21,25,3,0,23,25,3,0,25,25,3,0,26,25,3,0,27,25,3,0,35,25,3,0,36,25,3,0,21,26,3,0,23,26,3,0,35,26,3,0,36,26,3,0,21,27,3,0,23,27,3,0,21,28,3,0,23,28,3,0],57,57], 11 | 12 | [6,"Automata Bomb 1",100,0,440,5,477,0,0,[33,31,5,4,34,31,5,4,33,32,5,4,34,32,5,4,33,33,1,4,34,33,1,4],68,68], 13 | 14 | [6,"Automata Bomb 2",100,0,310,-143,477,0,0,[31,30,1,4,32,30,1,4,33,30,1,4,34,30,1,4,35,30,1,4,36,30,1,4,31,31,1,4,32,31,5,4,33,31,5,4,34,31,5,4,35,31,5,4,36,31,1,4,31,32,1,4,32,32,5,4,33,32,1,4,34,32,1,4,35,32,5,4,36,32,1,4,31,33,1,4,32,33,5,4,33,33,1,4,34,33,1,4,35,33,5,4,36,33,1,4,31,34,1,4,32,34,5,4,33,34,5,4,34,34,5,4,35,34,5,4,36,34,1,4,31,35,1,4,32,35,1,4,33,35,1,4,34,35,1,4,35,35,1,4,36,35,1,4],68,68] 15 | 16 | ]; -------------------------------------------------------------------------------- /screenshotSmall.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KilledByAPixel/NoteCraft/a967ed39023f3b6738a81b7b888f8da0c6338ad8/screenshotSmall.png --------------------------------------------------------------------------------