[
  {
    "path": ".gitattributes",
    "content": "# GitHub Language Detection\n*.gbsproj linguist-language=JSON\n\n# Normalize Line Endings to LineFeed\n*.md text=auto\n*.text text=auto\n*.txt text=auto\n*.xml text=auto\nLICENSE text=auto\n\n# LFS\n*.7z filter=lfs diff=lfs merge=lfs -text\n*.apk filter=lfs diff=lfs merge=lfs -text\n*.app filter=lfs diff=lfs merge=lfs -text\n*.dll filter=lfs diff=lfs merge=lfs -text\n*.docx filter=lfs diff=lfs merge=lfs -text\n*.exe filter=lfs diff=lfs merge=lfs -text\n*.mod filter=lfs diff=lfs merge=lfs -text\n*.mp3 filter=lfs diff=lfs merge=lfs -text\n*.ogg filter=lfs diff=lfs merge=lfs -text\n*.otf filter=lfs diff=lfs merge=lfs -text\n*.pages filter=lfs diff=lfs merge=lfs -text\n*.rar filter=lfs diff=lfs merge=lfs -text\n*.svg filter=lfs diff=lfs merge=lfs -text\n*.ttf filter=lfs diff=lfs merge=lfs -text\n*.wav filter=lfs diff=lfs merge=lfs -text\n*.xnb filter=lfs diff=lfs merge=lfs -text\n*.zip filter=lfs diff=lfs merge=lfs -text\n"
  },
  {
    "path": ".gitignore",
    "content": "[Bb]uild/\n*.bak\n~*\n"
  },
  {
    "path": "Backgrounds/README.md",
    "content": "# Credits:\n\n**Chris Maltby:**\n\n- `stars.png`\n\n**Ember/DeerTears:**\n\n- `big_checkers.png`\n\n**GumpyFunction:**\n\n- `Cabin(Exterior).png`\n- `Cabin(Interior).png`\n- `Forest (day).png`\n- `Forest (night).png`\n"
  },
  {
    "path": "COMMUNITY_LINKS.md",
    "content": "# Community Links\n\nNone of these links are endorsed officially by GB Studio or Chris Maltby. Not all of the contents following these links are usable under the MIT licence. Refer to each page for licence details. As always with the internet, enter at your own risk.\n\n## Free Software\n\nName | Author | Use | Website | From GB Community\n---- | ------ | --- | ------- | ------\nGylphBoy Swap | sododev | Hacks non-Latin Glyphs into GBS | https://sododev.itch.io/glyphboyswap | Yes\nGameboy Sprite Exporter | momeka | Counts and Manages Unique 8x8 Background Tiles | https://momeka.itch.io/gameboy-tools | Yes\nRotSprite | Xenowhirl | Rotates pixel art | http://info.sonicretro.org/RotSprite | No\nFt2Mod | James Park | Converts Famitracker text export into OpenMPT paste data | https://gb.jamespark.ninja/ft2mod/ | Yes\nMaxBgCalc | James Park | Calculates X or Y image dimensions to help you maximize your background size | https://gb.jamespark.ninja/maxbgcalc/ | Yes\nGbBgTxt | James Park | Generates images with text using your GB Studio font assets | https://gb.jamespark.ninja/gbbgtxt/ | Yes\nMIDI2MOD | James Park | Convert MIDI files to .mod compatible tracker output you can copy and paste! | https://gb.jamespark.ninja/midi2mod/ | Yes\n2BitCharactersGenerator | 0x72 | Generate (human) Sprites for GBC with multiple Frames from slider-inputs (CC0 Licence) | https://0x72.itch.io/2bitcharactergenerator | ?\n\n## Project Templates\n\nName | Author | Latest Compatible Version | Link\n---- | ------ | -------------- | ----\nActor Switching | digthezig | 1.1.0 | https://digthezig.itch.io/switching\n3D Maze | jojoruteon | 1.2.1 | https://jojoruteon.itch.io/3dmaze-gbstudio\nBattle System | manugamesdev | 1.1.0 | https://manugamesdev.itch.io/battle-system\nDungeon Crawler Template | TOXWORKS | 1.2.0 | https://toxworks.itch.io/dungeon-crawler-in-gb\nReal Time Combat | manugamesdev | 1.1.0 | https://manugamesdev.itch.io/real-time-combat\nMenu/Inventory System | TOXWORKS | 1.1.0 | https://toxworks.itch.io/menu-system-in-gb\nPortal Gun System for GB Studio | TOXWORKS | 1.2.0 | https://toxworks.itch.io/portal-gun-system-in-gb\nSododev Text Input | SodoDev | 2.0.0 | https://sododev.itch.io/sododev-text-input\nText Input | TOXWORKS | 1.1.0 | https://toxworks.itch.io/text-input-system-in-gb\nText Entry Template | Setsune Wave | 2.0.0 | https://setsune.itch.io/textinputgbs2\nJumping for Other Actors (Platformer) | Bumbiss | 2.0.0 | https://bumbiss.itch.io/jumping-for-actors-in-gb-studio\n\n## Free Asset Packs\n\nName | Author | Contains | Link\n---- | ------ | ---- | ----\nRetro Horror Asset Pack | catladycreates | Animated Actors, Tilesets, Tiled Working File | https://catladycreates.itch.io/horror-assest-gb-studio\nGB Studio Fence Tiles | cobgoblin | Tilesets | https://cobgoblin.itch.io/gbfences\nGio Ex's GB studio Resource Pack | Gio-Ex | UI Elements, Background, Actor, | https://gio-ex.itch.io/gb-studio-resource-pack\nWhere's Naldo + Extra | moshuo | Tileset | https://moshuo.itch.io/gbstudio-sprites\nGB Studio Tiles - Woodland | pixelmech | Tilemap, Tiled Working File | https://pixelmech.itch.io/gb-studio-tiles\nsprite-pack-1 | pollorenzo | Animated Actors, UI Elements | https://pollorenzo.itch.io/sprite-pack-1\nFairy Fountain.mod | Skittles | Free song | https://cdn.discordapp.com/attachments/554713715942096916/864917924707696640/Fairy_Fountain_by_Skittles.mod\nGB Studio Sprites 16x16 | rekkimaru | Actors | https://rekkimaru.itch.io/gb-studio-sprites-16x16\nGB Studio Dungeon Tileset | rekkimaru | Tilemap, Actors, Tiled Working File | https://rekkimaru.itch.io/gb-studio-dungeon-tileset-8x8\nDIALOG BOXES + MORE FOR GB STUDIO | wyatt199x | UI Elements, Default Font Alterations | https://wyatt199x.itch.io/dialog-boxes-more-for-gb-studio\nRoute1 Song.mod | copperine | Free song | https://cdn.discordapp.com/attachments/570924885291827200/759130941532274708/route1.mod\nGB Studio Sprites | rustedparadigm | Animated Actors | https://rustedparadigm.itch.io/gbstudio-sprites\nGB Studio Tilesets | rustedparadigm | Tilesets | https://rustedparadigm.itch.io/gbstudio-tilesets\nGB Studio Spartan Templates | rustedparadigm | Spartan Working Files | https://rustedparadigm.itch.io/gbs-spartan-templates\nGameBoy Assets and Sprites | materialfuture | Outdoor foliage, rocks, Actor, Tileset | https://materialfuture.itch.io/gameboy-assets\n\n## Free Fonts\n\n### .ttf\nName | Author | Licence | Link\n---- | ------ | ------- | ----\nPress Start 2P | CodeMan38 | [OFL](https://scripts.sil.org/cms/scripts/page.php?site_id=nrsi&id=OFL) | https://fonts.google.com/specimen/Press+Start+2P#license\n\n### .png\nName | Author | Licence | Link\n---- | ------ | ------- | ----\nFonts for GB Studio | jeremyoduber | none, see .zip Readme | https://jeremyoduber.itch.io/fonts-for-gb-studio\n"
  },
  {
    "path": "CONTRIBUTING.md",
    "content": "# How-To Contribute\n\n## #1 Filenames\n\nMake sure the file you're adding has a unique and distinctive name.\nIf you're using a common name (\"cactus\", \"apple\", \"dance\") put a number at the end of it so others may use the same name.\n\n**Good filename examples:**\n\n- \"short_cactus_1.png\"\n- \"short_cactus_2.png\"\n- \"husky_howling.mod\"\n- \"wolf_howl_1.mod\"\n- \"jenna's_house.png\"\n\n**Bad filename examples:**\n\n- \"ascii.png\"\n- \"plant27.png\"\n- \"background2.png\n- \"template.mod\"\n- \"mysong.mod\"\n\n## #2 Filetypes\n\nNo working files (.psd, .ai, .pdn, .gimp, .etc). Please only add .png images and .mod music files if you're submitting assets to be used. Don't make anybody else have to do the file-conversion process!\n\n## #3 The Github Process\n\n1. Have a Github account with all your files ready to be added\n\n2. Make a fork of this repository\n\n3. Upload your own files to your own fork (using the appropriate folders too)\n\n4. Edit the README.md of the folder that has your new files to include the following formatting:\n\n     **Your Name:**\n\n      ``Your file`` - And a little blurb describing it\n\n5. Make a pull request across forks. Make sure the page is showing `[my repository] <== [your fork]`\n\n6. If you'd like to be added to the contributors list so you can approve your own pull requests or approve others', just let me know in your pull request. I'm happy to have more people contribute often.\n\n"
  },
  {
    "path": "Engine/GBT Player Banks/Ember Triangle.s",
    "content": ";-------------------------------------------------------------------------------\r\n;\r\n; GBT Player v2.2.0\r\n;\r\n; SPDX-License-Identifier: MIT\r\n;\r\n; Copyright (c) 2009-2020, Antonio Niño Díaz <antonio_nd@outlook.com>\r\n;\r\n;-------------------------------------------------------------------------------\r\n\r\n\t.NR10 = 0xFF10\r\n\t.NR11 = 0xFF11\r\n\t.NR12 = 0xFF12\r\n\t.NR13 = 0xFF13\r\n\t.NR14 = 0xFF14\r\n\t.NR21 = 0xFF16\r\n\t.NR22 = 0xFF17\r\n\t.NR23 = 0xFF18\r\n\t.NR24 = 0xFF19\r\n\t.NR30 = 0xFF1A\r\n\t.NR31 = 0xFF1B\r\n\t.NR32 = 0xFF1C\r\n\t.NR33 = 0xFF1D\r\n\t.NR34 = 0xFF1E\r\n\t.NR41 = 0xFF20\r\n\t.NR42 = 0xFF21\r\n\t.NR43 = 0xFF22\r\n\t.NR44 = 0xFF23\r\n\t.NR50 = 0xFF24\r\n\t.NR51 = 0xFF25\r\n\t.NR52 = 0xFF26\r\n\r\n;-------------------------------------------------------------------------------\r\n\r\n\t.area\t_CODE_1\r\n\r\n;-------------------------------------------------------------------------------\r\n\r\ngbt_wave: ; 8 sounds\r\n\t.DB\t0xA5,0xD7,0xC9,0xE1,0xBC,0x9A,0x76,0x31,0x0C,0xBA,0xDE,0x60,0x1B,0xCA,0x03,0x93 ; random :P\r\n\t.DB\t0x00,0x11,0x22,0x33,0x44,0x55,0x66,0x77,0x88,0x77,0x66,0x55,0x44,0x33,0x22,0x11 ; ember triangle\r\n\t.DB\t0xFD,0xEC,0xDB,0xCA,0xB9,0xA8,0x97,0x86,0x79,0x68,0x57,0x46,0x35,0x24,0x13,0x02 ; little up-downs\r\n\t.DB\t0xDE,0xFE,0xDC,0xBA,0x9A,0xA9,0x87,0x77,0x88,0x87,0x65,0x56,0x54,0x32,0x10,0x12\r\n\t.DB\t0xAB,0xCD,0xEF,0xED,0xCB,0xA0,0x12,0x3E,0xDC,0xBA,0xBC,0xDE,0xFE,0xDC,0x32,0x10 ; triangular broken\r\n\t.DB\t0xFF,0xEE,0xDD,0xCC,0xBB,0xAA,0x99,0x88,0x77,0x66,0x55,0x44,0x33,0x22,0x11,0x00 ; triangular\r\n\t.DB\t0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ; square 50%\r\n\t.DB\t0x79,0xBC,0xDE,0xEF,0xFF,0xEE,0xDC,0xB9,0x75,0x43,0x21,0x10,0x00,0x11,0x23,0x45 ; sine\r\n\r\n; gbt_noise: ; Moved to Mod2GBT for better note range & performance\r\n\t; 7 bit, can adjust with pitch C D# F# A# C\r\n\t;.DB\t0x5F,0x4E,0x3E,0x2F,0x2E,0x2C,0x1F,0x0F\r\n\t; 15 bit\r\n\t;.DB\t0x64,0x54,0x44,0x24,0x00\r\n\t;.DB\t0x67,0x56,0x46\r\n\r\ngbt_frequencies:\r\n\t.DW\t  44,  156,  262,  363,  457,  547,  631,  710,  786,  854,  923,  986\r\n\t.DW\t1046, 1102, 1155, 1205, 1253, 1297, 1339, 1379, 1417, 1452, 1486, 1517\r\n\t.DW\t1546, 1575, 1602, 1627, 1650, 1673, 1694, 1714, 1732, 1750, 1767, 1783\r\n\t.DW\t1798, 1812, 1825, 1837, 1849, 1860, 1871, 1881, 1890, 1899, 1907, 1915\r\n\t.DW\t1923, 1930, 1936, 1943, 1949, 1954, 1959, 1964, 1969, 1974, 1978, 1982\r\n\t.DW\t1985, 1988, 1992, 1995, 1998, 2001, 2004, 2006, 2009, 2011, 2013, 2015\r\n\r\n;-------------------------------------------------------------------------------\r\n\r\n_gbt_get_freq_from_index: ; a = index, bc = returned freq\r\n\tld\thl,#gbt_frequencies\r\n\tld\tc,a\r\n\tld\tb,#0\r\n\tadd\thl,bc\r\n\tadd\thl,bc\r\n\tld\tc,(hl)\r\n\tinc\thl\r\n\tld\tb,(hl)\r\n\tret\r\n\r\n;-------------------------------------------------------------------------------\r\n;---------------------------------- Channel 1 ----------------------------------\r\n;-------------------------------------------------------------------------------\r\n\r\ngbt_channel_1_handle:: ; de = info\r\n\r\n\tld\ta,(gbt_channels_enabled)\r\n\tand\ta,#0x01\r\n\tjr\tnz,channel1_enabled$\r\n\r\n\t; Channel is disabled. Increment pointer as needed\r\n\r\n\tld\ta,(de)\r\n\tinc\tde\r\n\tbit\t7,a\r\n\tjr\tnz,ch1_more_bytes$\r\n\tbit\t6,a\r\n\tjr\tz,ch1_no_more_bytes_this_channel$\r\n\r\n\tjr\tch1_one_more_byte$\r\n\r\nch1_more_bytes$:\r\n\r\n\tld\ta,(de)\r\n\tinc\tde\r\n\tbit\t7,a\r\n\tjr\tz,ch1_no_more_bytes_this_channel$\r\n\r\nch1_one_more_byte$:\r\n\r\n\tinc\tde\r\n\r\nch1_no_more_bytes_this_channel$:\r\n\r\n\tret\r\n\r\nchannel1_enabled$:\r\n\r\n\t; Channel 1 is enabled\r\n\r\n\tld\ta,(de)\r\n\tinc\tde\r\n\r\n\tbit\t7,a\r\n\tjr\tnz,ch1_has_frequency$\r\n\r\n\t; Not frequency\r\n\r\n\tbit\t6,a\r\n\tjr\tnz,ch1_instr_effects$\r\n\r\n\t; Set volume or NOP\r\n\r\n\tbit\t5,a\r\n\tjr\tnz,ch1_just_set_volume$\r\n\r\n\t; NOP\r\n\r\n\tret\r\n\r\nch1_just_set_volume$:\r\n\r\n\t; Set volume\r\n\r\n\tand\ta,#0x0F\r\n\tswap\ta\r\n\t; Preserve envelope data\r\n\tld\tb,a\t\t\t; save byte\r\n\tld\ta,(gbt_vol+0)\r\n\tand\ta,#0x0F\t\t; mask envelope\r\n\tor\ta,b\r\n\r\n\tld\t(gbt_vol+0),a\r\n\r\n\tjr\trefresh_channel1_regs_trig$\r\n\r\nch1_instr_effects$:\r\n\r\n\t; Set instrument and effect\r\n\r\n\tld\tb,a ; save byte\r\n\r\n\tand\ta,#0x30\r\n\tsla\ta\r\n\tsla\ta\r\n\tld\t(gbt_instr+0),a ; Instrument\r\n\r\n\tld\ta,b ; restore byte\r\n\r\n\tand\ta,#0x0F ; a = effect\r\n\r\n\tcall\tgbt_channel_1_set_effect\r\n\r\n\tand a,a\r\n\tret\tz ; if 0, don't refresh registers\r\n\tjr\trefresh_channel1_regs_notrig$\r\n\r\nch1_has_frequency$:\r\n\r\n\t; Has frequency\r\n\r\n\tand\ta,#0x7F\r\n\tld\t(gbt_arpeggio_freq_index+0*3),a\r\n\t; This destroys hl and a. Returns freq in bc\r\n\tcall\t_gbt_get_freq_from_index\r\n\r\n\tld\ta,c\r\n\tld\t(gbt_freq+0*2+0),a\r\n\tld\ta,b\r\n\tld\t(gbt_freq+0*2+1),a ; Get frequency\r\n\r\n\tld\ta,(de)\r\n\tinc\tde\r\n\r\n\tbit\t7,a\r\n\tjr\tnz,ch1_freq_instr_and_effect$\r\n\r\n\t; Freq + Instr + Volume\r\n\r\n\tld\tb,a ; save byte\r\n\r\n\tand\ta,#0x30\r\n\tsla\ta\r\n\tsla\ta\r\n\tld\t(gbt_instr+0),a ; Instrument\r\n\r\n\tld\ta,b ; restore byte\r\n\r\n\tand\ta,#0x0F ; a = volume\r\n\r\n\tswap\ta\r\n\t; Preserve envelope data\r\n\tld\tb,a\t\t\t; save byte\r\n\tld\ta,(gbt_vol+0)\r\n\tand\ta,#0x0F\t\t; mask envelope\r\n\tor\ta,b\r\n\r\n\tld\t(gbt_vol+0),a\r\n\r\n\tjr\trefresh_channel1_regs_trig$\r\n\r\nch1_freq_instr_and_effect$:\r\n\r\n\t; Freq + Instr + Effect\r\n\r\n\tld\tb,a ; save byte\r\n\r\n\tand\ta,#0x30\r\n\tsla\ta\r\n\tsla\ta\r\n\tld\t(gbt_instr+0),a ; Instrument\r\n\r\n\tld\ta,b ; restore byte\r\n\r\n\tand\ta,#0x0F ; a = effect\r\n\r\n\tcall\tgbt_channel_1_set_effect\r\n\r\n\t;jr\trefresh_channel1_regs_trig$\r\n\r\n\r\n\t; fall through!\r\n\r\n; -----------------\r\n\r\nrefresh_channel1_regs_trig$:\r\n\r\nchannel1_refresh_registers_trig:\r\n\r\n\txor\ta,a\r\n\tld\t(#.NR10),a\r\n\tld\ta,(gbt_instr+0)\r\n\tld\t(#.NR11),a\r\n\tld\ta,(gbt_vol+0)\r\n\tld\t(#.NR12),a\r\n\tld\ta,(gbt_freq+0*2+0)\r\n\tld\t(#.NR13),a\r\n\tld\ta,(gbt_freq+0*2+1)\r\n\tor\ta,#0x80 ; start\r\n\tld\t(#.NR14),a\r\n\r\n\tret\r\n\r\nrefresh_channel1_regs_notrig$:\r\n\r\nchannel1_refresh_registers_notrig:\r\n\r\n\txor\ta,a\r\n\tld\t(#.NR10),a\r\n\tld\ta,(gbt_instr+0)\r\n\tld\t(#.NR11),a\r\n\tld\ta,(gbt_freq+0*2+0)\r\n\tld\t(#.NR13),a\r\n\tld\ta,(gbt_freq+0*2+1)\r\n\tld\t(#.NR14),a\r\n\r\n\tret\r\n\r\n; ------------------\r\n\r\nchannel1_update_effects: ; returns 1 in a if it is needed to update sound registers\r\n\r\n\t; Cut note\r\n\t; --------\r\n\r\n\tld\ta,(gbt_cut_note_tick+0)\r\n\tld\thl,#gbt_ticks_elapsed\r\n\tcp\ta,(hl)\r\n\tjp\tnz,ch1_dont_cut$\r\n\r\n\tdec\ta ; a = 0xFF\r\n\tld\t(gbt_cut_note_tick+0),a ; disable cut note\r\n\r\n\txor\ta,a ; vol = 0\r\n\tld\t(#.NR12),a\r\n\tld\ta,#0x80 ; start\r\n\tld\t(#.NR14),a\r\n\r\nch1_dont_cut$:\r\n\r\n\t; Arpeggio or Sweep\r\n\t; --------\r\n\r\n\tld\ta,(gbt_arpeggio_enabled+0)\r\n\tand\ta,a\r\n\tret\tz ; a is 0, return 0\r\n\r\n\t; Check if Sweep or Arpeggio (4-5 cycles)\r\n\tand a,#1\r\n\tjr z,gbt_ch1_sweep_run$\r\n\r\n\t; If enabled arpeggio, handle it\r\n\r\n\tld\ta,(gbt_arpeggio_tick+0)\r\n\tand\ta,a\r\n\tjr\tnz,ch1_not_tick_0$\r\n\r\n\t; Tick 0 - Set original frequency\r\n\r\n\tld\ta,(gbt_arpeggio_freq_index+0*3+0)\r\n\r\n\tcall\t_gbt_get_freq_from_index\r\n\r\n\tld\ta,c\r\n\tld\t(gbt_freq+0*2+0),a\r\n\tld\ta,b\r\n\tld\t(gbt_freq+0*2+1),a ; Set frequency\r\n\r\n\tld\ta,#1\r\n\tld\t(gbt_arpeggio_tick+0),a\r\n\r\n\tret ; ret 1\r\n\r\nch1_not_tick_0$:\r\n\r\n\tcp\ta,#1\r\n\tjr\tnz,ch1_not_tick_1$\r\n\r\n\t; Tick 1\r\n\r\n\tld\ta,(gbt_arpeggio_freq_index+0*3+1)\r\n\r\n\tcall\t_gbt_get_freq_from_index\r\n\r\n\tld\ta,c\r\n\tld\t(gbt_freq+0*2+0),a\r\n\tld\ta,b\r\n\tld\t(gbt_freq+0*2+1),a ; Set frequency\r\n\r\n\tld\ta,#2\r\n\tld\t(gbt_arpeggio_tick+0),a\r\n\r\n\tdec\ta\r\n\tret ; ret 1\r\n\r\nch1_not_tick_1$:\r\n\r\n\t; Tick 2\r\n\r\n\tld\ta,(gbt_arpeggio_freq_index+0*3+2)\r\n\r\n\tcall\t_gbt_get_freq_from_index\r\n\r\n\tld\ta,c\r\n\tld\t(gbt_freq+0*2+0),a\r\n\tld\ta,b\r\n\tld\t(gbt_freq+0*2+1),a ; Set frequency\r\n\r\n\txor\ta,a\r\n\tld\t(gbt_arpeggio_tick+0),a\r\n\r\n\tinc\ta\r\n\tret ; ret 1\r\n\r\ngbt_ch1_sweep_run$:\r\n\r\n\t; PortA Pitch Sweep\r\n\t; -----------\r\n\tld\thl,#(gbt_freq+0*2+0)\r\n\tld\ta,(gbt_sweep+0)\r\n\tbit 7,a ; bit 7, if nz, sweep up.\r\n\tjr  z,gbt_ch1_sweep_up$\r\n\r\n\t; Sweep down -\r\n\tsub\ta,#0x80\r\n\tld\tb,a\r\n\tld\ta,(hl)\t\t; Get frequency small (gbt_freq+0*2+0)\r\n\tsub\ta,b\t\t\t; subtract b from a\r\n\tld\t(hl+),a\t\t; Set frequency small (gbt_freq+0*2+0)\r\n\tld\ta,#1\r\n\tjr\tc,gbt_ch1_sweep_dec$\r\n\tret\t\t\t\t; ret 1, update without trigger\r\n\t; Sweep down --\r\ngbt_ch1_sweep_dec$:\r\n\tdec\t(hl)\t\t; DEC frequency large (gbt_freq+0*2+1) 3cy\r\n\tld\ta,(hl)\r\n\tinc a\t\t\t; find if decremented past 0 to exactly 255\r\n\tret\tnz\t\t\t; ret/update unless 0\r\n\tld\t(hl-),a\t\t; fix frequency large 0x0\r\n\tld\t(hl),a\t\t; fix frequency small 0x0\r\n\tld\t(gbt_arpeggio_enabled+0),a\t; disable sweep\r\n\tret\t\t\t\t; ret 0, no update\r\n\r\n\t; Sweep up +\r\ngbt_ch1_sweep_up$:\r\n\tadd\ta,(hl)\t\t; add frequency small (gbt_freq+0*2+0)\r\n\tld\t(hl+),a\t\t; Set frequency small (gbt_freq+0*2+0)\r\n\tjr\tc,gbt_ch1_sweep_inc$\r\n\tld\ta,#1\r\n\tret\t\t\t\t; ret 1, update without trigger\r\n\t; Sweep up ++\r\ngbt_ch1_sweep_inc$:\r\n\tinc\t(hl)\t\t; inc frequency large (gbt_freq+0*2+1) 2cy\r\n\tld\ta,(hl-)\r\n\tand\ta,#0x07\t\t; check if wrapped to 0x08 00001000\r\n\tret\tnz\t\t\t; ret/update unless 0\r\n\tld\t(gbt_arpeggio_enabled+0),a\t; disable sweep\r\n\tld\t(#.NR12),a ; vol = 0\r\n\tld\ta,#0x80 ; start\r\n\tld\t(#.NR14),a\r\n\tret \t\t\t; ret 0x80, update without trigger\r\n\r\n; -----------------\r\n\r\n; returns a = 1 if needed to update registers, 0 if not\r\ngbt_channel_1_set_effect: ; a = effect, de = pointer to data.\r\n\r\n\tld\thl,#gbt_ch1_jump_table$\r\n\tld\tc,a\r\n\tld\tb,#0\r\n\tadd\thl,bc\r\n\tadd\thl,bc\r\n\r\n\tld\ta,(hl+)\r\n\tld\th,(hl)\r\n\tld\tl,a\r\n\r\n\tld\ta,(de) ; load args\r\n\tinc\tde\r\n\r\n\tjp\t(hl)\r\n\r\ngbt_ch1_jump_table$:\r\n\t.DW\tgbt_ch1_pan$\r\n\t.DW\tgbt_ch1_arpeggio$\r\n\t.DW\tgbt_ch1_cut_note$\r\n\t.DW\tgbt_ch1234_nop\r\n\t.DW\tgbt_ch1_sweep$\r\n\t.DW\tgbt_ch1234_nop\r\n\t.DW\tgbt_ch1234_nop\r\n\t.DW\tgbt_ch1234_nop\r\n\t.DW\tgbt_ch1234_jump_pattern\r\n\t.DW\tgbt_ch1234_jump_position\r\n\t.DW\tgbt_ch1234_speed\r\n\t.DW\tgbt_ch1234_nop\r\n\t.DW\tgbt_ch1234_nop\r\n\t.DW\tgbt_ch1234_nop\r\n\t.DW\tgbt_ch1234_nop\r\n\t.DW\tgbt_ch1_NRx2_VolEnv$\r\n\r\ngbt_ch1_pan$:\r\n\tand\ta,#0x11\r\n\tld\t(gbt_pan+0),a\r\n\txor\ta,a\r\n\tret ; ret 0 do not update registers, only NR51 at end.\r\n\r\ngbt_ch1_arpeggio$:\r\n\tld\tb,a ; b = params\r\n\r\n\tld\thl,#gbt_arpeggio_freq_index+0*3\r\n\tld\tc,(hl) ; c = base index\r\n\tinc\thl\r\n\r\n\tld\ta,b\r\n\tswap\ta\r\n\tand\ta,#0x0F\r\n\tadd\ta,c\r\n\r\n\tld\t(hl+),a ; save first increment\r\n\r\n\tld\ta,b\r\n\tand\ta,#0x0F\r\n\tadd\ta,c\r\n\r\n\tld\t(hl),a ; save second increment\r\n\r\n\tld\ta,#1\r\n\tld\t(gbt_arpeggio_enabled+0),a\r\n\tld\t(gbt_arpeggio_tick+0),a\r\n\r\n\tret ; ret 1\r\n\r\ngbt_ch1_cut_note$:\r\n\tld\t(gbt_cut_note_tick+0),a\r\n\txor\ta,a ; ret 0\r\n\tret\r\n\r\ngbt_ch1_NRx2_VolEnv$:\t; Raw data into volume, VVVV APPP, bits 4-7 vol\r\n\tld\t(gbt_vol+0),a\t; bit 3 true = add, bits 0-2 wait period \r\n\txor\ta,a\t; ret 0\t\t; 0xF1 = max volume, sub 1 every 1 tick.\r\n\tret\t\t\t\t\t; 0x0A = min volume, add 1 every 2 ticks.\r\n\r\ngbt_ch1_sweep$:\r\n\tld \t(gbt_sweep+0),a\r\n\tld\ta,#2\r\n\tld\t(gbt_arpeggio_enabled+0),a\r\n\txor\ta,a\t; ret 0\r\n\tret\r\n\r\n;-------------------------------------------------------------------------------\r\n;---------------------------------- Channel 2 ----------------------------------\r\n;-------------------------------------------------------------------------------\r\n\r\ngbt_channel_2_handle:: ; de = info\r\n\r\n\tld\ta,(gbt_channels_enabled)\r\n\tand\ta,#0x02\r\n\tjr\tnz,channel2_enabled$\r\n\r\n\t; Channel is disabled. Increment pointer as needed\r\n\r\n\tld\ta,(de)\r\n\tinc\tde\r\n\tbit\t7,a\r\n\tjr\tnz,ch2_more_bytes$\r\n\tbit\t6,a\r\n\tjr\tz,ch2_no_more_bytes_this_channel$\r\n\r\n\tjr\tch2_one_more_byte$\r\n\r\nch2_more_bytes$:\r\n\r\n\tld\ta,(de)\r\n\tinc\tde\r\n\tbit\t7,a\r\n\tjr\tz,ch2_no_more_bytes_this_channel$\r\n\r\nch2_one_more_byte$:\r\n\r\n\tinc\tde\r\n\r\nch2_no_more_bytes_this_channel$:\r\n\r\n\tret\r\n\r\nchannel2_enabled$:\r\n\r\n\t; Channel 2 is enabled\r\n\r\n\tld\ta,(de)\r\n\tinc\tde\r\n\r\n\tbit\t7,a\r\n\tjr\tnz,ch2_has_frequency$\r\n\r\n\t; Not frequency\r\n\r\n\tbit\t6,a\r\n\tjr\tnz,ch2_instr_effects$\r\n\r\n\t; Set volume or NOP\r\n\r\n\tbit\t5,a\r\n\tjr\tnz,ch2_just_set_volume$\r\n\r\n\t; NOP\r\n\r\n\tret\r\n\r\nch2_just_set_volume$:\r\n\r\n\t; Set volume\r\n\r\n\tand\ta,#0x0F\r\n\tswap\ta\r\n\t; Preserve envelope data\r\n\tld\tb,a\t\t\t; save byte\r\n\tld\ta,(gbt_vol+1)\r\n\tand\ta,#0x0F\t\t; mask envelope\r\n\tor\ta,b\r\n\r\n\tld\t(gbt_vol+1),a\r\n\r\n\tjr\trefresh_channel2_regs_trig$\r\n\r\nch2_instr_effects$:\r\n\r\n\t; Set instrument and effect\r\n\r\n\tld\tb,a ; save byte\r\n\r\n\tand\ta,#0x30\r\n\tsla\ta\r\n\tsla\ta\r\n\tld\t(gbt_instr+1),a ; Instrument\r\n\r\n\tld\ta,b ; restore byte\r\n\r\n\tand\ta,#0x0F ; a = effect\r\n\r\n\tcall\tgbt_channel_2_set_effect\r\n\r\n\tand a,a\r\n\tret\tz ; if 0, don't refresh registers\r\n\tjr\trefresh_channel2_regs_notrig$\r\n\r\nch2_has_frequency$:\r\n\r\n\t; Has frequency\r\n\r\n\tand\ta,#0x7F\r\n\tld\t(gbt_arpeggio_freq_index+1*3),a\r\n\t; This destroys hl and a. Returns freq in bc\r\n\tcall\t_gbt_get_freq_from_index\r\n\r\n\tld\ta,c\r\n\tld\t(gbt_freq+1*2+0),a\r\n\tld\ta,b\r\n\tld\t(gbt_freq+1*2+1),a ; Get frequency\r\n\r\n\tld\ta,(de)\r\n\tinc\tde\r\n\r\n\tbit\t7,a\r\n\tjr\tnz,ch2_freq_instr_and_effect$\r\n\r\n\t; Freq + Instr + Volume\r\n\r\n\tld\tb,a ; save byte\r\n\r\n\tand\ta,#0x30\r\n\tsla\ta\r\n\tsla\ta\r\n\tld\t(gbt_instr+1),a ; Instrument\r\n\r\n\tld\ta,b ; restore byte\r\n\r\n\tand\ta,#0x0F ; a = volume\r\n\r\n\tswap\ta\r\n\t; Preserve envelope data\r\n\tld\tb,a\t\t\t; save byte\r\n\tld\ta,(gbt_vol+1)\r\n\tand\ta,#0x0F\t\t; mask envelope\r\n\tor\ta,b\r\n\r\n\tld\t(gbt_vol+1),a\r\n\r\n\tjr\trefresh_channel2_regs_trig$\r\n\r\nch2_freq_instr_and_effect$:\r\n\r\n\t; Freq + Instr + Effect\r\n\r\n\tld\tb,a ; save byte\r\n\r\n\tand\ta,#0x30\r\n\tsla\ta\r\n\tsla\ta\r\n\tld\t(gbt_instr+1),a ; Instrument\r\n\r\n\tld\ta,b ; restore byte\r\n\r\n\tand\ta,#0x0F ; a = effect\r\n\r\n\tcall\tgbt_channel_2_set_effect\r\n\r\n\t;jr\t.refresh_channel2_regs_trig\r\n\r\n\t; fall through!\r\n\r\n; -----------------\r\n\r\nrefresh_channel2_regs_trig$:\r\n\r\nchannel2_refresh_registers_trig:\r\n\r\n\tld\ta,(gbt_instr+1)\r\n\tld\t(#.NR21),a\r\n\tld\ta,(gbt_vol+1)\r\n\tld\t(#.NR22),a\r\n\tld\ta,(gbt_freq+1*2+0)\r\n\tld\t(#.NR23),a\r\n\tld\ta,(gbt_freq+1*2+1)\r\n\tor\ta,#0x80 ; start\r\n\tld\t(#.NR24),a\r\n\r\n\tret\r\n\r\nrefresh_channel2_regs_notrig$:\r\n\r\nchannel2_refresh_registers_notrig:\r\n\r\n\tld\ta,(gbt_instr+1)\r\n\tld\t(#.NR21),a\r\n\tld\ta,(gbt_freq+1*2+0)\r\n\tld\t(#.NR23),a\r\n\tld\ta,(gbt_freq+1*2+1)\r\n\tld\t(#.NR24),a\r\n\r\n\tret\r\n\r\n; ------------------\r\n\r\nchannel2_update_effects: ; returns 1 in a if it is needed to update sound regs\r\n\r\n\t; Cut note\r\n\t; --------\r\n\r\n\tld\ta,(gbt_cut_note_tick+1)\r\n\tld\thl,#gbt_ticks_elapsed\r\n\tcp\ta,(hl)\r\n\tjp\tnz,ch2_dont_cut$\r\n\r\n\tdec\ta ; a = 0xFF\r\n\tld\t(gbt_cut_note_tick+1),a ; disable cut note\r\n\r\n\txor\ta,a ; vol = 0\r\n\tld\t(#.NR22),a\r\n\tld\ta,#0x80 ; start\r\n\tld\t(#.NR24),a\r\n\r\nch2_dont_cut$:\r\n\r\n\t; Arpeggio or Sweep\r\n\t; --------\r\n\r\n\tld\ta,(gbt_arpeggio_enabled+1)\r\n\tand\ta,a\r\n\tret\tz ; a is 0, return 0\r\n\r\n\t; Check if Sweep or Arpeggio (5-6 cycles)\r\n\tand a,#1\r\n\tjr z,gbt_ch2_sweep_run$\r\n\t; If enabled arpeggio, handle it\r\n\r\n\tld\ta,(gbt_arpeggio_tick+1)\r\n\tand\ta,a\r\n\tjr\tnz,ch2_not_tick_0$\r\n\r\n\t; Tick 0 - Set original frequency\r\n\r\n\tld\ta,(gbt_arpeggio_freq_index+1*3+0)\r\n\r\n\tcall\t_gbt_get_freq_from_index\r\n\r\n\tld\ta,c\r\n\tld\t(gbt_freq+1*2+0),a\r\n\tld\ta,b\r\n\tld\t(gbt_freq+1*2+1),a ; Set frequency\r\n\r\n\tld\ta,#1\r\n\tld\t(gbt_arpeggio_tick+1),a\r\n\r\n\tret ; ret 1\r\n\r\nch2_not_tick_0$:\r\n\r\n\tcp\ta,#1\r\n\tjr\tnz,ch2_not_tick_1$\r\n\r\n\t; Tick 1\r\n\r\n\tld\ta,(gbt_arpeggio_freq_index+1*3+1)\r\n\r\n\tcall\t_gbt_get_freq_from_index\r\n\r\n\tld\ta,c\r\n\tld\t(gbt_freq+1*2+0),a\r\n\tld\ta,b\r\n\tld\t(gbt_freq+1*2+1),a ; Set frequency\r\n\r\n\tld\ta,#2\r\n\tld\t(gbt_arpeggio_tick+1),a\r\n\r\n\tdec\ta\r\n\tret ; ret 1\r\n\r\nch2_not_tick_1$:\r\n\r\n\t; Tick 2\r\n\r\n\tld\ta,(gbt_arpeggio_freq_index+1*3+2)\r\n\r\n\tcall\t_gbt_get_freq_from_index\r\n\r\n\tld\ta,c\r\n\tld\t(gbt_freq+1*2+0),a\r\n\tld\ta,b\r\n\tld\t(gbt_freq+1*2+1),a ; Set frequency\r\n\r\n\txor\ta,a\r\n\tld\t(gbt_arpeggio_tick+1),a\r\n\r\n\tinc\ta\r\n\tret ; ret 1\r\n\r\ngbt_ch2_sweep_run$:\r\n\r\n\t; PortA Pitch Sweep\r\n\t; -----------\r\n\tld\thl,#(gbt_freq+1*2+0)\r\n\tld\ta,(gbt_sweep+1)\r\n\tbit 7,a ; bit 7, if nz, sweep up.\r\n\tjr  z,gbt_ch2_sweep_up$\r\n\r\n\t; Sweep down -\r\n\tsub\ta,#0x80\r\n\tld\tb,a\r\n\tld\ta,(hl)\t\t; Get frequency small (gbt_freq+0*2+0)\r\n\tsub\ta,b\t\t\t; subtract b from a\r\n\tld\t(hl+),a\t\t; Set frequency small (gbt_freq+0*2+0)\r\n\tld\ta,#1\r\n\tjr\tc,gbt_ch2_sweep_dec$\r\n\tret\t\t\t\t; ret 1, update without trigger\r\n\t; Sweep down --\r\ngbt_ch2_sweep_dec$:\r\n\tdec\t(hl)\t\t; DEC frequency large (gbt_freq+0*2+1) 3cy\r\n\tld\ta,(hl)\r\n\tinc a\t\t\t; find if decremented past 0 to exactly 255\r\n\tret\tnz\t\t\t; ret/update unless 0\r\n\tld\t(hl-),a\t\t; fix frequency large 0x0\r\n\tld\t(hl),a\t\t; fix frequency small 0x0\r\n\tld\t(gbt_arpeggio_enabled+1),a\t; disable sweep\r\n\tret\t\t\t\t; ret 0, no update\r\n\r\n\t; Sweep up +\r\ngbt_ch2_sweep_up$:\r\n\tadd\ta,(hl)\t\t; add frequency small (gbt_freq+0*2+0)\r\n\tld\t(hl+),a\t\t; Set frequency small (gbt_freq+0*2+0)\r\n\tjr\tc,gbt_ch2_sweep_inc$\r\n\tld\ta,#1\r\n\tret\t\t\t\t; ret 1, update without trigger\r\n\t; Sweep up ++\r\ngbt_ch2_sweep_inc$:\r\n\tinc\t(hl)\t\t; inc frequency large (gbt_freq+0*2+1) 2cy\r\n\tld\ta,(hl-)\r\n\tand\ta,#0x07\t\t; check if wrapped to 0x08 00001000\r\n\tret nz\t\t\t; ret/update unless 0\r\n\tld\t(gbt_arpeggio_enabled+1),a\t; disable sweep\r\n\tld\t(#.NR22),a ; vol = 0\r\n\tld\ta,#0x80 ; start\r\n\tld\t(#.NR24),a\r\n\tret \t\t\t; ret 0x80, update without trigger\r\n\r\n; -----------------\r\n\r\n; returns a = 1 if needed to update registers, 0 if not\r\ngbt_channel_2_set_effect: ; a = effect, de = pointer to data\r\n\r\n\tld\thl,#gbt_ch2_jump_table$\r\n\tld\tc,a\r\n\tld\tb,#0\r\n\tadd\thl,bc\r\n\tadd\thl,bc\r\n\r\n\tld\ta,(hl+)\r\n\tld\th,(hl)\r\n\tld\tl,a\r\n\r\n\tld\ta,(de) ; load args\r\n\tinc\tde\r\n\r\n\tjp\t(hl)\r\n\r\ngbt_ch2_jump_table$:\r\n\t.DW\tgbt_ch2_pan$\r\n\t.DW\tgbt_ch2_arpeggio$\r\n\t.DW\tgbt_ch2_cut_note$\r\n\t.DW\tgbt_ch1234_nop\r\n\t.DW\tgbt_ch2_sweep$\r\n\t.DW\tgbt_ch1234_nop\r\n\t.DW\tgbt_ch1234_nop\r\n\t.DW\tgbt_ch1234_nop\r\n\t.DW\tgbt_ch1234_jump_pattern\r\n\t.DW\tgbt_ch1234_jump_position\r\n\t.DW\tgbt_ch1234_speed\r\n\t.DW\tgbt_ch1234_nop\r\n\t.DW\tgbt_ch1234_nop\r\n\t.DW\tgbt_ch1234_nop\r\n\t.DW\tgbt_ch1234_nop\r\n\t.DW\tgbt_ch2_NRx2_VolEnv$\r\n\r\ngbt_ch2_pan$:\r\n\tand\ta,#0x22\r\n\tld\t(gbt_pan+1),a\r\n\txor\ta,a ; ret 0\r\n\tret ; Should not update registers, only NR51 at end.\r\n\r\ngbt_ch2_arpeggio$:\r\n\tld\tb,a ; b = params\r\n\r\n\tld\thl,#gbt_arpeggio_freq_index+1*3\r\n\tld\tc,(hl) ; c = base index\r\n\tinc\thl\r\n\r\n\tld\ta,b\r\n\tswap\ta\r\n\tand\ta,#0x0F\r\n\tadd\ta,c\r\n\r\n\tld\t(hl+),a ; save first increment\r\n\r\n\tld\ta,b\r\n\tand\ta,#0x0F\r\n\tadd\ta,c\r\n\r\n\tld\t(hl),a ; save second increment\r\n\r\n\tld\ta,#1\r\n\tld\t(gbt_arpeggio_enabled+1),a\r\n\tld\t(gbt_arpeggio_tick+1),a\r\n\r\n\tret ; ret 1\r\n\r\ngbt_ch2_cut_note$:\r\n\tld\t(gbt_cut_note_tick+1),a\r\n\txor\ta,a ; ret 0\r\n\tret\r\n\r\ngbt_ch2_NRx2_VolEnv$:\t; raw volumeEnv, VVVV APPP, bits 7-4 vol\r\n\tld\t(gbt_vol+1),a\t; bit 3 true = add, bits 2-0 wait period \r\n\txor\ta,a\t; ret 0\t\t; 0xF1 = max volume, sub 1 every 1 tick.\r\n\tret\t\t\t\t\t; 0x0A = min volume, add 1 every 2 ticks.\r\n\r\ngbt_ch2_sweep$:\r\n\tld \t(gbt_sweep+1),a\r\n\tld\ta,#2\r\n\tld\t(gbt_arpeggio_enabled+1),a\r\n\txor\ta,a\t; ret 0\r\n\tret\r\n\r\n;-------------------------------------------------------------------------------\r\n;---------------------------------- Channel 3 ----------------------------------\r\n;-------------------------------------------------------------------------------\r\n\r\ngbt_channel_3_handle:: ; de = info\r\n\r\n\tld\ta,(gbt_channels_enabled)\r\n\tand\ta,#0x04\r\n\tjr\tnz,channel3_enabled$\r\n\r\n\t; Channel is disabled. Increment pointer as needed\r\n\r\n\tld\ta,(de)\r\n\tinc\tde\r\n\tbit\t7,a\r\n\tjr\tnz,ch3_more_bytes$\r\n\tbit\t6,a\r\n\tjr\tz,ch3_no_more_bytes_this_channel$\r\n\r\n\tjr\tch3_one_more_byte$\r\n\r\nch3_more_bytes$:\r\n\r\n\tld\ta,(de)\r\n\tinc\tde\r\n\tbit\t7,a\r\n\tjr\tz,ch3_no_more_bytes_this_channel$\r\n\r\nch3_one_more_byte$:\r\n\r\n\tinc\tde\r\n\r\nch3_no_more_bytes_this_channel$:\r\n\r\n\tret\r\n\r\nchannel3_enabled$:\r\n\r\n\t; Channel 3 is enabled\r\n\r\n\tld\ta,(de)\r\n\tinc\tde\r\n\r\n\tbit\t7,a\r\n\tjr\tnz,ch3_has_frequency$\r\n\r\n\t; Not frequency\r\n\r\n\tbit\t6,a\r\n\tjr\tnz,ch3_effects$\r\n\r\n\t; Set volume or NOP\r\n\r\n\tbit\t5,a\r\n\tjr\tnz,ch3_just_set_volume$\r\n\r\n\t; NOP\r\n\r\n\tret\r\n\r\nch3_just_set_volume$:\r\n\r\n\t; Set volume\r\n\r\n\tswap\ta\r\n\tld\t(gbt_vol+2),a\r\n\r\n\tjr\trefresh_channel3_regs_trig$\r\n\r\nch3_effects$:\r\n\r\n\t; Set effect\r\n\r\n\tand\ta,#0x0F ; a = effect\r\n\r\n\tcall\tgbt_channel_3_set_effect\r\n\tand\ta,a\r\n\tret\tz ; if 0, don't refresh registers\r\n\r\n\tjr\trefresh_channel3_regs_notrig$\r\n\r\nch3_has_frequency$:\r\n\r\n\t; Has frequency\r\n\r\n\tand\ta,#0x7F\r\n\tld\t(gbt_arpeggio_freq_index+2*3),a\r\n\t; This destroys hl and a. Returns freq in bc\r\n\tcall\t_gbt_get_freq_from_index\r\n\r\n\tld\ta,c\r\n\tld\t(gbt_freq+2*2+0),a\r\n\tld\ta,b\r\n\tld\t(gbt_freq+2*2+1),a ; Get frequency\r\n\r\n\tld\ta,(de)\r\n\tinc\tde\r\n\r\n\tbit\t7,a\r\n\tjr\tnz,ch3_freq_instr_and_effect$\r\n\r\n\t; Freq + Instr + Volume\r\n\r\n\tld\tb,a ; save byte\r\n\r\n\tand\ta,#0x0F\r\n\tld\t(gbt_instr+2),a ; Instrument\r\n\r\n\tld\ta,b ; restore byte\r\n\r\n\tand\ta,#0x30 ; a = volume\r\n\tsla\ta\r\n\tld\t(gbt_vol+2),a\r\n\r\n\tjr\trefresh_channel3_regs_trig$\r\n\r\nch3_freq_instr_and_effect$:\r\n\r\n\t; Freq + Instr + Effect\r\n\r\n\tld\tb,a ; save byte\r\n\r\n\tand\ta,#0x0F\r\n\tld\t(gbt_instr+2),a ; Instrument\r\n\r\n\tld\ta,b ; restore byte\r\n\r\n\tand\ta,#0x70\r\n\tswap\ta\t; a = effect (only 0-7 allowed here)\r\n\r\n\tcall\tgbt_channel_3_set_effect\r\n\r\n\t;jr\t.refresh_channel3_regs\r\n\r\n\t; fall through!\r\n\r\n; -----------------\r\nrefresh_channel3_regs_trig$:\r\n\r\nchannel3_refresh_registers_trig:\r\n\r\n\txor\ta,a\r\n\tld\t(#.NR30),a ; disable\r\n\r\n\tld\ta,(gbt_channel3_loaded_instrument)\r\n\tld\tb,a\r\n\tld\ta,(gbt_instr+2)\r\n\tcp\ta,b\r\n\tcall\tnz,gbt_channel3_load_instrument ; a = instrument\r\n\r\n\tld\ta,#0x80\r\n\tld\t(#.NR30),a ; enable\r\n\r\n\txor\ta,a\r\n\tld\t(#.NR31),a\r\n\tld\ta,(gbt_vol+2)\r\n\tld\t(#.NR32),a\r\n\tld\ta,(gbt_freq+2*2+0)\r\n\tld\t(#.NR33),a\r\n\tld\ta,(gbt_freq+2*2+1)\r\n\tor\ta,#0x80 ; start\r\n\tld\t(#.NR34),a\r\n\r\n\tret\r\n\r\nrefresh_channel3_regs_notrig$:\r\n\t; Don't Restart Waveform!\r\nchannel3_refresh_registers_notrig:\r\n\r\n\tld\ta,(gbt_freq+2*2+0)\r\n\tld\t(#.NR33),a\r\n\tld\ta,(gbt_freq+2*2+1)\r\n\tld\t(#.NR34),a\r\n\r\n\tret\r\n; ------------------\r\n\r\ngbt_channel3_load_instrument:\r\n\r\n\tld\t(gbt_channel3_loaded_instrument),a\r\n\r\n\tswap\ta ; a = a * 16\r\n\tld\tc,a\r\n\tld\tb,#0\r\n\tld\thl,#gbt_wave\r\n\tadd\thl,bc\r\n\r\n\tld\tc,#0x30\r\n\tld\tb,#16\r\nch3_loop$:\r\n\tld\ta,(hl+)\r\n\tldh\t(c),a\r\n\tinc\tc\r\n\tdec\tb\r\n\tjr\tnz,ch3_loop$\r\n\r\n\tret\r\n\r\n; ------------------\r\n\r\nchannel3_update_effects: ; returns 1 in a if it is needed to update sound regs\r\n\r\n\t; Cut note\r\n\t; --------\r\n\r\n\tld\ta,(gbt_cut_note_tick+2)\r\n\tld\thl,#gbt_ticks_elapsed\r\n\tcp\ta,(hl)\r\n\tjp\tnz,ch3_dont_cut$\r\n\r\n\tdec\ta ; a = 0xFF\r\n\tld\t(gbt_cut_note_tick+2),a ; disable cut note\r\n\r\n\txor\ta,a ; vol = 0\r\n\tld\t(#.NR30),a ; disable\r\n\tld\t(#.NR32),a\r\n\tld\ta,#0x80 ; start\r\n\tld\t(#.NR34),a\r\n\r\nch3_dont_cut$:\r\n\r\n\t; Arpeggio or Sweep\r\n\t; --------\r\n\r\n\tld\ta,(gbt_arpeggio_enabled+2)\r\n\tand\ta,a\r\n\tret\tz ; a is 0, return 0\r\n\r\n\t; Check if Sweep or Arpeggio (5-6 cycles)\r\n\tand a,#1\r\n\tjp z,gbt_ch3_sweep_run$\r\n\r\n\t; If enabled arpeggio, handle it\r\n\r\n\tld\ta,(gbt_arpeggio_tick+2)\r\n\tand\ta,a\r\n\tjr\tnz,ch3_not_tick_0$\r\n\r\n\t; Tick 0 - Set original frequency\r\n\r\n\tld\ta,(gbt_arpeggio_freq_index+2*3+0)\r\n\r\n\tcall\t_gbt_get_freq_from_index\r\n\r\n\tld\ta,c\r\n\tld\t(gbt_freq+2*2+0),a\r\n\tld\ta,b\r\n\tld\t(gbt_freq+2*2+1),a ; Set frequency\r\n\r\n\tld\ta,#1\r\n\tld\t(gbt_arpeggio_tick+2),a\r\n\r\n\tret ; ret 1\r\n\r\nch3_not_tick_0$:\r\n\r\n\tcp\ta,#1\r\n\tjr\tnz,ch3_not_tick_1$\r\n\r\n\t; Tick 1\r\n\r\n\tld\ta,(gbt_arpeggio_freq_index+2*3+1)\r\n\r\n\tcall\t_gbt_get_freq_from_index\r\n\r\n\tld\ta,c\r\n\tld\t(gbt_freq+2*2+0),a\r\n\tld\ta,b\r\n\tld\t(gbt_freq+2*2+1),a ; Set frequency\r\n\r\n\tld\ta,#2\r\n\tld\t(gbt_arpeggio_tick+2),a\r\n\r\n\tdec\ta\r\n\tret ; ret 1\r\n\r\nch3_not_tick_1$:\r\n\r\n\t; Tick 2\r\n\r\n\tld\ta,(gbt_arpeggio_freq_index+2*3+2)\r\n\r\n\tcall\t_gbt_get_freq_from_index\r\n\r\n\tld\ta,c\r\n\tld\t(gbt_freq+2*2+0),a\r\n\tld\ta,b\r\n\tld\t(gbt_freq+2*2+1),a ; Set frequency\r\n\r\n\txor\ta,a\r\n\tld\t(gbt_arpeggio_tick+2),a\r\n\r\n\tinc\ta\r\n\tret ; ret 1\r\n\r\ngbt_ch3_sweep_run$:\r\n\r\n\t; PortA Pitch Sweep\r\n\t; -----------\r\n\tld\thl,#(gbt_freq+2*2+0)\r\n\tld\ta,(gbt_sweep+2)\r\n\tbit 7,a ; bit 7, if nz, sweep up.\r\n\tjr  z,gbt_ch3_sweep_up$\r\n\r\n\t; Sweep down -\r\n\tsub\ta,#0x80\r\n\tld\tb,a\r\n\tld\ta,(hl)\t\t; Get frequency small (gbt_freq+0*2+0)\r\n\tsub\ta,b\t\t\t; subtract b from a\r\n\tld\t(hl+),a\t\t; Set frequency small (gbt_freq+0*2+0)\r\n\tld\ta,#1\r\n\tjr\tc,gbt_ch3_sweep_dec$\r\n\tret\t\t\t\t; ret 1, update without trigger\r\n\t; Sweep down --\r\ngbt_ch3_sweep_dec$:\r\n\tdec\t(hl)\t\t; DEC frequency large (gbt_freq+0*2+1) 3cy\r\n\tld\ta,(hl)\r\n\tinc a\t\t\t; find if decremented past 0 to exactly 255\r\n\tret\tnz\t\t\t; ret/update unless 0\r\n\tld\t(hl-),a\t\t; fix frequency large 0x0\r\n\tld\t(hl),a\t\t; fix frequency small 0x0\r\n\tld\t(gbt_arpeggio_enabled+2),a\t; disable sweep\r\n\tret\t\t\t\t; ret 0, no update\r\n\r\n\t; Sweep up +\r\ngbt_ch3_sweep_up$:\r\n\tadd\ta,(hl)\t\t; add frequency small (gbt_freq+0*2+0)\r\n\tld\t(hl+),a\t\t; Set frequency small (gbt_freq+0*2+0)\r\n\tjr\tc,gbt_ch3_sweep_inc$\r\n\tld\ta,#1\r\n\tret\t\t\t\t; ret 1, update without trigger\r\n\t; Sweep up ++\r\ngbt_ch3_sweep_inc$:\r\n\tinc\t(hl)\t\t; inc frequency large (gbt_freq+0*2+1) 2cy\r\n\tld\ta,(hl-)\r\n\tand\ta,#0x07\t\t; check if wrapped to 0x08 00001000\r\n\tret\tnz\t\t\t; ret/update unless 0\r\n\tld\t(gbt_arpeggio_enabled+2),a\t; disable sweep\r\n\tld\t(#.NR32),a ; vol = 0\r\n\tld\ta,#0x80 ; start\r\n\tld\t(#.NR34),a\r\n\tret \t\t\t; ret 1, update without trigger\r\n\r\n; -----------------\r\n\r\n; returns a = 1 if needed to update registers, 0 if not\r\ngbt_channel_3_set_effect: ; a = effect, de = pointer to data\r\n\r\n\tld\thl,#gbt_ch3_jump_table$\r\n\tld\tc,a\r\n\tld\tb,#0\r\n\tadd\thl,bc\r\n\tadd\thl,bc\r\n\r\n\tld\ta,(hl+)\r\n\tld\th,(hl)\r\n\tld\tl,a\r\n\r\n\tld\ta,(de) ; load args\r\n\tinc\tde\r\n\r\n\tjp\t(hl)\r\n\r\ngbt_ch3_jump_table$:\r\n\t.DW\tgbt_ch3_pan$\r\n\t.DW\tgbt_ch3_arpeggio$\r\n\t.DW\tgbt_ch3_cut_note$\r\n\t.DW\tgbt_ch1234_nop\r\n\t.DW\tgbt_ch3_sweep$\r\n\t.DW\tgbt_ch1234_nop\r\n\t.DW\tgbt_ch1234_nop\r\n\t.DW\tgbt_ch1234_nop\r\n\t.DW\tgbt_ch1234_jump_pattern\r\n\t.DW\tgbt_ch1234_jump_position\r\n\t.DW\tgbt_ch1234_speed\r\n\t.DW\tgbt_ch1234_nop\r\n\t.DW\tgbt_ch1234_nop\r\n\t.DW\tgbt_ch1234_nop\r\n\t.DW\tgbt_ch1234_nop\r\n\t.DW\tgbt_ch1234_nop\r\n\r\ngbt_ch3_pan$:\r\n\tand\ta,#0x44\r\n\tld\t(gbt_pan+2),a\r\n\txor\ta,a ; ret 0\r\n\tret ; do not update registers, only NR51 at end.\r\n\r\ngbt_ch3_arpeggio$:\r\n\tld\tb,a ; b = params\r\n\r\n\tld\thl,#gbt_arpeggio_freq_index+2*3\r\n\tld\tc,(hl) ; c = base index\r\n\tinc\thl\r\n\r\n\tld\ta,b\r\n\tswap\ta\r\n\tand\ta,#0x0F\r\n\tadd\ta,c\r\n\r\n\tld\t(hl+),a ; save first increment\r\n\r\n\tld\ta,b\r\n\tand\ta,#0x0F\r\n\tadd\ta,c\r\n\r\n\tld\t(hl),a ; save second increment\r\n\r\n\tld\ta,#1\r\n\tld\t(gbt_arpeggio_enabled+2),a\r\n\tld\t(gbt_arpeggio_tick+2),a\r\n\r\n\tret ; ret 1\r\n\r\ngbt_ch3_cut_note$:\r\n\tld\t(gbt_cut_note_tick+2),a\r\n\txor\ta,a ; ret 0\r\n\tret\r\n\r\ngbt_ch3_sweep$:\r\n\tld \t(gbt_sweep+2),a\r\n\tld\ta,#2\r\n\tld\t(gbt_arpeggio_enabled+2),a\r\n\txor\ta,a\t; ret 0\r\n\tret\r\n\r\n;-------------------------------------------------------------------------------\r\n;---------------------------------- Channel 4 ----------------------------------\r\n;-------------------------------------------------------------------------------\r\n\r\ngbt_channel_4_handle:: ; de = info\r\n\r\n\tld\ta,(gbt_channels_enabled)\r\n\tand\ta,#0x08\r\n\tjr\tnz,channel4_enabled$\r\n\r\n\t; Channel is disabled. Increment pointer as needed\r\n\r\n\tld\ta,(de)\r\n\tinc\tde\r\n\tbit\t7,a\r\n\tjr\tnz,ch4_more_bytes$\r\n\tbit\t6,a\r\n\tjr\tz,ch4_no_more_bytes_this_channel$\r\n\r\n\tjr\tch4_one_more_byte$\r\n\r\nch4_more_bytes$:\r\n\r\n\tld\ta,(de)\r\n\tinc\tde\r\n\tbit\t7,a\r\n\tjr\tz,ch4_no_more_bytes_this_channel$\r\n\r\nch4_one_more_byte$:\r\n\r\n\tinc\tde\r\n\r\nch4_no_more_bytes_this_channel$:\r\n\r\n\tret\r\n\r\nchannel4_enabled$:\r\n\r\n\t; Channel 4 is enabled\r\n\r\n\tld\ta,(de)\r\n\tinc\tde\r\n\r\n\tbit\t7,a\r\n\tjr\tnz,ch4_has_instrument$\r\n\r\n\t; Not instrument\r\n\r\n\tbit\t6,a\r\n\tjr\tnz,ch4_effects$\r\n\r\n\t; Set volume or NOP\r\n\r\n\tbit\t5,a\r\n\tjr\tnz,ch4_just_set_volume$\r\n\r\n\t; NOP\r\n\r\n\tret\r\n\r\nch4_just_set_volume$:\r\n\r\n\t; Set volume\r\n\r\n\tand\ta,#0x0F\r\n\tswap\ta\r\n\t; Preserve envelope data\r\n\tld\tb,a\t\t\t; save byte\r\n\tld\ta,(gbt_vol+3)\r\n\tand\ta,#0x0F\t\t; mask envelope\r\n\tor\ta,b\r\n\r\n\tld\t(gbt_vol+3),a\r\n\r\n\tjr\trefresh_channel4_regs$\r\n\r\nch4_effects$:\r\n\r\n\t; Set effect\r\n\r\n\tand\ta,#0x0F ; a = effect\r\n\r\n\tcall\tgbt_channel_4_set_effect\r\n\tand\ta,a\r\n\tret\tz ; if 0, don't refresh registers\r\n\r\n\tjr\trefresh_channel4_regs$\r\n\r\nch4_has_instrument$:\r\n\r\n\t; Has instrument raw frequency data\r\n\r\n\tand\ta,#0x7F ; mask out bit 7\r\n\tld\tb,a\r\n\r\n\tld\ta,(de)\t; load next byte\r\n\tinc\tde\r\n\tld\tc,a\r\n\trla\r\n\tand a,#0x80\t; Mask only bit 7\r\n\tor\ta,b\t\t; Append noise bit\r\n\tld\t(gbt_instr+3),a\r\n\tld\ta,c\t\t; restore byte2\r\n\tbit\t7,a\r\n\tjr\tnz,ch4_instr_and_effect$\r\n\r\n\t; Instr + Volume\r\n\r\n\tand\ta,#0x0F ; a = volume\r\n\r\n\tswap\ta\r\n\t; Preserve envelope data\r\n\tld\tb,a\t\t\t; save byte\r\n\tld\ta,(gbt_vol+3)\r\n\tand\ta,#0x0F\t\t; mask envelope\r\n\tor\ta,b\r\n\r\n\tld\t(gbt_vol+3),a\r\n\r\n\tjr\trefresh_channel4_regs$\r\n\r\nch4_instr_and_effect$:\r\n\r\n\t; Instr + Effect\r\n\r\n\tand\ta,#0x0F ; a = effect\r\n\r\n\tcall\tgbt_channel_4_set_effect\r\n\r\n\t;jr\tch4_refresh_channel4_regs$\r\n\r\nrefresh_channel4_regs$:\r\n\r\n\t; fall through!\r\n\r\n; -----------------\r\n\r\nchannel4_refresh_registers:\r\n\r\n\txor\ta,a\r\n\tld\t(#.NR41),a\r\n\tld\ta,(gbt_vol+3)\r\n\tld\t(#.NR42),a\r\n\tld\ta,(gbt_instr+3)\r\n\tld\t(#.NR43),a\r\n\tld\ta,#0x80 ; start\r\n\tld\t(#.NR44),a\r\n\r\n\tret\r\n\r\n; ------------------\r\n\r\nchannel4_update_effects: ; returns 1 in a if it is needed to update sound regs\r\n\r\n\t; Cut note\r\n\t; --------\r\n\r\n\tld\ta,(gbt_cut_note_tick+3)\r\n\tld\thl,#gbt_ticks_elapsed\r\n\tcp\ta,(hl)\r\n\tjp\tnz,ch4_dont_cut$\r\n\r\n\tdec\ta ; a = 0xFF\r\n\tld\t(gbt_cut_note_tick+3),a ; disable cut note\r\n\r\n\txor\ta,a ; vol = 0\r\n\tld\t(#.NR42),a\r\n\tld\ta,#0x80 ; start\r\n\tld\t(#.NR44),a\r\n\r\nch4_dont_cut$:\r\n\r\n\txor\ta,a\r\n\tret ; a is 0, return\r\n\r\n; -----------------\r\n\r\n; returns a = 1 if needed to update registers, 0 if not\r\ngbt_channel_4_set_effect: ; a = effect, de = pointer to data\r\n\r\n\tld\thl,#gbt_ch4_jump_table$\r\n\tld\tc,a\r\n\tld\tb,#0\r\n\tadd\thl,bc\r\n\tadd\thl,bc\r\n\r\n\tld\ta,(hl+)\r\n\tld\th,(hl)\r\n\tld\tl,a\r\n\r\n\tld\ta,(de) ; load args\r\n\tinc\tde\r\n\r\n\tjp\t(hl)\r\n\r\ngbt_ch4_jump_table$:\r\n\t.DW\tgbt_ch4_pan$\r\n\t.DW\tgbt_ch1234_nop ; gbt_ch4_arpeggio\r\n\t.DW\tgbt_ch4_cut_note$\r\n\t.DW\tgbt_ch1234_nop\r\n\t.DW\tgbt_ch1234_nop\r\n\t.DW\tgbt_ch1234_nop\r\n\t.DW\tgbt_ch1234_nop\r\n\t.DW\tgbt_ch1234_nop\r\n\t.DW\tgbt_ch1234_jump_pattern\r\n\t.DW\tgbt_ch1234_jump_position\r\n\t.DW\tgbt_ch1234_speed\r\n\t.DW\tgbt_ch1234_nop\r\n\t.DW\tgbt_ch1234_nop\r\n\t.DW\tgbt_ch1234_nop\r\n\t.DW\tgbt_ch1234_nop\r\n\t.DW\tgbt_ch4_NRx2_VolEnv$\r\n\r\ngbt_ch4_pan$:\r\n\tand\ta,#0x88\r\n\tld\t(gbt_pan+3),a\r\n\txor\ta,a ; ret 0\r\n\tret ; do not update registers, only NR51 at end.\r\n\r\ngbt_ch4_cut_note$:\r\n\tld\t(gbt_cut_note_tick+3),a\r\n\txor\ta,a ; ret 0\r\n\tret\r\n\r\ngbt_ch4_NRx2_VolEnv$:\t; Raw data into volume, VVVV APPP, bits 4-7 vol\r\n\tld\t(gbt_vol+3),a\t; bit 3 true = add, bits 0-2 wait period \r\n\txor\ta,a\t; ret 0\t\t; 0xF1 = max volume, sub 1 every 1 tick.\r\n\tret\t\t\t\t\t; 0x0A = min volume, add 1 every 2 ticks.\r\n\r\n;-------------------------------------------------------------------------------\r\n\r\n; Common effects go here:\r\n\r\ngbt_ch1234_nop:\r\n\txor\ta,a ;ret 0\r\n\tret\r\n\r\ngbt_ch1234_jump_pattern:\r\n\tld\t(gbt_current_pattern),a\r\n\txor\ta,a\r\n\tld\t(gbt_current_step),a\r\n\tld\t(gbt_have_to_stop_next_step),a ; clear stop flag\r\n\tld\ta,#1\r\n\tld\t(gbt_update_pattern_pointers),a\r\n\txor\ta,a ;ret 0\r\n\tret\r\n\r\ngbt_ch1234_jump_position:\r\n\tld\t(gbt_current_step),a\r\n\tld\thl,#gbt_current_pattern\r\n\tinc\t(hl)\r\n\r\n\t; Check to see if jump puts us past end of song\r\n\tld\ta,(hl)\r\n\tcall\tgbt_get_pattern_ptr_banked\r\n\tld\ta,#1 ; tell gbt_player.s to do this next cycle\r\n\tld\t(gbt_update_pattern_pointers),a\r\n\txor\ta,a ;ret 0\r\n\tret\r\n\r\ngbt_ch1234_speed:\r\n\tld\t(gbt_speed),a\r\n\txor\ta,a\r\n\tld\t(gbt_ticks_elapsed),a\r\n\tret ;ret 0\r\n\r\n;-------------------------------------------------------------------------------\r\n\r\ngbt_update_bank1::\r\n\r\n\tld\tde,#gbt_temp_play_data\r\n\r\n\t; each function will return in de the pointer to next byte\r\n\r\n\tcall\tgbt_channel_1_handle\r\n\r\n\tcall\tgbt_channel_2_handle\r\n\r\n\tcall\tgbt_channel_3_handle\r\n\r\n\tcall\tgbt_channel_4_handle\r\n\r\n\t; end of channel handling\r\n\r\n\tld\thl,#gbt_pan\r\n\tld\ta,(hl+)\r\n\tor\ta,(hl)\r\n\tinc\thl\r\n\tor\ta,(hl)\r\n\tinc hl\r\n\tor\ta,(hl)\r\n\tld\t(#.NR51),a ; handle panning...\r\n\r\n\tret\r\n\r\n;-------------------------------------------------------------------------------\r\n\r\ngbt_update_effects_bank1::\r\n\r\n\tcall\tchannel1_update_effects\r\n\tand\ta,a\r\n\tcall\tnz,channel1_refresh_registers_notrig\r\n\r\n\tcall\tchannel2_update_effects\r\n\tand\ta,a\r\n\tcall\tnz,channel2_refresh_registers_notrig\r\n\r\n\tcall\tchannel3_update_effects\r\n\tand\ta,a\r\n\tcall\tnz,channel3_refresh_registers_notrig\r\n\r\n\tcall\tchannel4_update_effects\r\n\tand\ta,a\r\n\tcall\tnz,channel4_refresh_registers\r\n\r\n\tret\r\n\r\n;-------------------------------------------------------------------------------\r\n"
  },
  {
    "path": "Engine/GBT Player Banks/README.md",
    "content": "# Credits\r\n\r\n**Ember:**\r\n\r\n- `Ember Triangle.s` - The usual waveforms, but instrument 9 (Ringy) is replaced with a stuttery triangle wave that goes from 0hx to 8hx and back. I like low-fidelity triangle waves and this has been a long time coming.\r\n\r\n## How to alter GBT Player Banks for Channel 3\r\n\r\n[It is highly recomended you read the music documentation before continuing.](https://gbstudio.dev/docs/music)\r\n\r\nGBT Player can be compiled to use a different set of 8 pre-determined waveforms for Channel 3, compared to the defaults that are mentioned in the music docs. This lets you edit all 8 waveforms for Channel 3 on a per-game basis. These 8 waveforms can not be swapped-out during gameplay.\r\n\r\nAfter using Engine Eject (2.0.0 and above) the file `gbt_player_bank1.s` can be found inside of `assets/engine/src/core`. Lines 40 to 47 contain sets of nibbles that determine the waveform shape for each of Channel 3's instruments.\r\n\r\nEach line contains 32 nibbles joined together in groups of 2. Each nibble represents the amplitude of a sample from 0 to F.\r\n\r\n**Example:**  \r\n```\r\ngbt_wave: ; unofficial edit\r\n\t.DB\t0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ; square wave\r\n\t.DB\t0x79,0xBC,0xDE,0xEF,0xFF,0xEE,0xDC,0xB9,0x75,0x43,0x21,0x10,0x00,0x11,0x23,0x45 ; sine wave\r\n\t.DB\t0xFF,0xEE,0xDD,0xCC,0xBB,0xAA,0x99,0x88,0x77,0x66,0x55,0x44,0x33,0x22,0x11,0x00 ; sawtooth\r\n\t.DB\t0x00,0x11,0x22,0x33,0x44,0x55,0x66,0x77,0x88,0x77,0x66,0x55,0x44,0x33,0x22,0x11 ; triangle\r\n\t.DB 0xFE,0xDC,0xBA,0x98,0x76,0x54,0x32,0x10,0x12,0x34,0x45,0x56,0x78,0x9A,0xBC,0xDE ; double-speed triangle\r\n```\r\n\r\n**Example**: 0xFF represents two samples of maximum amplitude. One set to `F` amplitude, the other set to `F` amplitude.  \r\n**Example**: 0x00 represents two samples of minimum amplitude. One set to `0` amplitude, the other set to `0` amplitude.  \r\n**Example**: 0x0F represents two samples of mixed amplitude. One set to `0` amplitude, the other set to `F` amplitude.  \r\n\r\nSo long as the formatting of the nibbles remain the same, their values can be changed to any 16-bit value to create waveforms other than the GBT Player defaults. Changing the in-game samples here will not update the samples in template.mod, so adjust these samples with this in mind. hUGETracker features a sample-drawing tool that shows the necessary nibbles to create your desired waveform.\r\n\r\nHere's a new waveform that can not be found in GBT Player by default:  \r\n```\r\ngbt_wave: ; unofficial edit\r\n\t.DB\t0x00,0x11,0x22,0x33,0x44,0x55,0x66,0x77,0x88,0x77,0x66,0x55,0x44,0x33,0x22,0x11 ; triangle wave\r\n```\r\n\r\nReplacing one of the instruments with the above code will change the corrosponding instrument to your new waveform.\r\n"
  },
  {
    "path": "Fonts/README.md",
    "content": "# Credits:\n\n**TommysezSoWhat:**\n\n- `d20_ascii.png`: Modified character set to include a D20 outline and single-character representations of the numbers 10-20.\n\n**Chris Maltby:**\n\n- `default ascii.png`: The default character set that comes with GB Studio.\n\n**krümel:**\n\n- `Kirby's Adventure Ability Help`\n- `Love Story and Theremin`\n- `Multiboot Menu (GBA)`\n- `Trolls on Treasure Island`\n- `Zero Wing`\n\n**DigiDuncan:**\n\n- `hex.png`: A debugging tool to help you find the location of special characters on the sheet.\n- `Gothic`: A rough conversion of the MS Gothic font, with some liberties taken for the format. Also included, single characters for 10-20.\n\n**Anima/Animaloser/SodoDev:**\n\n- `modifiedfinalfantasylegends.png`: Modified Final Fantasy Legends font.\n- `thinrpg.png`: Thin font. For easy reading.\n\n**LoftyAu:**\n\n- `spongebob.png`: A Spongebob-esque GB font.\n\n**Paige Ashlynn:**\n\n- `DotGothic8.png`: A slim font adapted from Kokiabe/Fontworks Inc.'s DotGothic16.\n\n**KizulEmeraldfire**\n\n- `ascii_thick.png`: A bold font. (Dark characters on a light background.)\n- `ascii_thick_inverted.png`: A bold font. (Light characters on a dark background.)\n- `ascii_thick_italic.png`: A bold font, italicized... albeit rather lazily. (Dark characters on a light background.)\n- `ascii_thick_italic_inverted.png`: A bold font, italicized... albeit rather lazily. (Light characters on a dark background.)\n\n**MOL:**\n\n- `Commodore 64 ASCII.png`: A rip of the Commodore 64 ASCII files\n- `Commodore 64 ASCII - Dark.png`: A dark version of the Commodore 64 ASCII files\n\n**Santiago Crespo:**\n- `ACM-VGA.png`: A bold font, based on the [Chromatic Research MPACT 2 VGA BIOS font](https://int10h.org/oldschool-pc-fonts/fontlist/font?acm_vga_8x8)\n- `CompaqThin.png`: A thin font, based on a [custom DOS font made by Compaq](https://int10h.org/oldschool-pc-fonts/fontlist/font?compaqthin_8x8)\n\n"
  },
  {
    "path": "LICENSE",
    "content": "MIT License\n\nCopyright (c) 2019 Ember Bland\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n"
  },
  {
    "path": "Music/Action/Boss fight1.mod",
    "content": "version https://git-lfs.github.com/spec/v1\noid sha256:d08be31164c5e73b962ba8c2748c6a5845701a3ca2f1457af2e67f3501cb0c1e\nsize 82160\n"
  },
  {
    "path": "Music/Action/Boss fight2.mod",
    "content": "version https://git-lfs.github.com/spec/v1\noid sha256:08e1f5c1b643b617fc309926403a47f55b0b6dffc5ef2b1f7faf0cc40f1c09e1\nsize 87280\n"
  },
  {
    "path": "Music/Action/Compression.mod",
    "content": "version https://git-lfs.github.com/spec/v1\noid sha256:4946292612932fc1f11133d929fba0db564bb966f362620da468cf0607621a96\nsize 82160\n"
  },
  {
    "path": "Music/Action/Dancing and Infiltrating.mod",
    "content": "version https://git-lfs.github.com/spec/v1\noid sha256:2a45a3981fdde41bbda055d1a07fdca811133d454b432d48fa5b5b0ea9cf3814\nsize 74992\n"
  },
  {
    "path": "Music/Action/Free OST 1 - Backstreets.mod",
    "content": "version https://git-lfs.github.com/spec/v1\noid sha256:aa957d46f07436fade5d5be667c878fee3bc385ffa960c11450e3682ba4d5299\nsize 73968\n"
  },
  {
    "path": "Music/Action/Free OST 1 - Fighting.mod",
    "content": "version https://git-lfs.github.com/spec/v1\noid sha256:602de66e3f12b49928a78c69a12b46fb67cd33c0f39eab723a0abd07117c2ffe\nsize 74992\n"
  },
  {
    "path": "Music/Action/Joyous Takeoff.mod",
    "content": "version https://git-lfs.github.com/spec/v1\noid sha256:74f5abd0476049851469c7c30e98cfa6d90e2694c0d944ba5dccda92cf66eebd\nsize 81136\n"
  },
  {
    "path": "Music/Action/Monty's Overheating Spaceship.mod",
    "content": "version https://git-lfs.github.com/spec/v1\noid sha256:051e0e766076ba29979abbeb9c912eaeedeeef91fbee7a4bfde4345ef89a5554\nsize 77040\n"
  },
  {
    "path": "Music/Action/Serious Ping Pong Matches.mod",
    "content": "version https://git-lfs.github.com/spec/v1\noid sha256:e112bf2c026fc30ddd0f5183cbcf260d6eb33fbcd7ee58bbb984bf2f19fcc0df\nsize 11516\n"
  },
  {
    "path": "Music/Action/Sneaking Around.mod",
    "content": "version https://git-lfs.github.com/spec/v1\noid sha256:e2c180dcc8529aeb897641573c8fa458f7b242582ffc5ee2ad1d12c01cd82674\nsize 72944\n"
  },
  {
    "path": "Music/Action/Sugar Craze.mod",
    "content": "version https://git-lfs.github.com/spec/v1\noid sha256:d1cde65c34a78307f4de76eb821c2a14f2133a95e94d0b499a3624343cd37f2f\nsize 76016\n"
  },
  {
    "path": "Music/Action/Tape It Together.mod",
    "content": "version https://git-lfs.github.com/spec/v1\noid sha256:d1eeb3b20e40b79d0c806caee62fdb95dae0acba1006d351dd407d2e928f5c9d\nsize 7972\n"
  },
  {
    "path": "Music/Action/Tense Boss Battle.mod",
    "content": "version https://git-lfs.github.com/spec/v1\noid sha256:1cdc33dc93acf05ad18274715e920b8d60be633464a215c52960c97affe18aa9\nsize 82160\n"
  },
  {
    "path": "Music/Drumbeats/Backbeat Metal Drumming.mod",
    "content": "version https://git-lfs.github.com/spec/v1\noid sha256:208fec4efed2c5007b2514bd883d1d6a674ac3acedbb36f30f461cd5ba5c0dd4\nsize 69872\n"
  },
  {
    "path": "Music/Drumbeats/Boots Cats.mod",
    "content": "version https://git-lfs.github.com/spec/v1\noid sha256:a66adaeaa731b8d4773ac4cd2d3c23ed30105bc6fdc7859a9df41161009ab816\nsize 69872\n"
  },
  {
    "path": "Music/Drumbeats/Breakbeat with Hats.mod",
    "content": "version https://git-lfs.github.com/spec/v1\noid sha256:4b1f2f10a99a1fbc1736db8915dd9883cdc012a8c844f0367266981b4e178bb5\nsize 69872\n"
  },
  {
    "path": "Music/Drumbeats/Duck Tales Drumbeat.mod",
    "content": "version https://git-lfs.github.com/spec/v1\noid sha256:540c17b8f0e7eba3dc3d2016d98dc093ec2b0bc01f2c80d27d09d7b735c2c23d\nsize 69872\n"
  },
  {
    "path": "Music/Drumbeats/Halftime Metal Drumming.mod",
    "content": "version https://git-lfs.github.com/spec/v1\noid sha256:661b29ffc2ed54f38246c3a03df8eddfe74ee0571afeb60fb59985ee1622ff09\nsize 69872\n"
  },
  {
    "path": "Music/Drumbeats/Kick Kick Kick Crash.mod",
    "content": "version https://git-lfs.github.com/spec/v1\noid sha256:b591d788670ac9e33d2d58543e2df8f2b4b464e5d98a7f26451802c709abdb46\nsize 69872\n"
  },
  {
    "path": "Music/Drumbeats/Kick Kick Snare.mod",
    "content": "version https://git-lfs.github.com/spec/v1\noid sha256:56da221f4ecbf702148b9741798735f38c9c5d37382e1d9b2e86c028fa28ec5b\nsize 69872\n"
  },
  {
    "path": "Music/Drumbeats/Kick Stutter.mod",
    "content": "version https://git-lfs.github.com/spec/v1\noid sha256:4903dd242fc19bf47b4c9417bda8047a015bcc68e82f7b89568f97cf434cfe62\nsize 69872\n"
  },
  {
    "path": "Music/Drumbeats/Messy 90s Uptempo Hiphop.mod",
    "content": "version https://git-lfs.github.com/spec/v1\noid sha256:3325179be3cf95b572af4c10ab9754b5c99ce3aa7447bfb79fd613dbe74307b0\nsize 69872\n"
  },
  {
    "path": "Music/Drumbeats/Supa-Hip Breakbeat.mod",
    "content": "version https://git-lfs.github.com/spec/v1\noid sha256:5345b47de34b4a75fb1505ac66bfbbf7b29d9775aa5221a59a73513a31e10c9e\nsize 69872\n"
  },
  {
    "path": "Music/Drumbeats/Upbeat Metal Drumming.mod",
    "content": "version https://git-lfs.github.com/spec/v1\noid sha256:b3ccf41358acc18b3a99e690bf6fc90ad76e0e4dfc93c50ec603ba41346afa88\nsize 69872\n"
  },
  {
    "path": "Music/Exploration/Determined.mod",
    "content": "version https://git-lfs.github.com/spec/v1\noid sha256:f26dacec33a4598096d154603e656f2a42fe02f9a03102c6284d836c47bf2201\nsize 77040\n"
  },
  {
    "path": "Music/Exploration/Peppy Pop Song.mod",
    "content": "version https://git-lfs.github.com/spec/v1\noid sha256:84cfe8cfcc9c0216b9038e8f40b2aad5b7d134a690fc6deb4356d241349bef01\nsize 82160\n"
  },
  {
    "path": "Music/Exploration/Scrolling Text.mod",
    "content": "version https://git-lfs.github.com/spec/v1\noid sha256:6400445f903c756145157353c6b778edb8f7ce0209b5b7be45ef540fbca34650\nsize 79088\n"
  },
  {
    "path": "Music/Exploration/Twilight Drive.mod",
    "content": "version https://git-lfs.github.com/spec/v1\noid sha256:98376c5ad78d15d70171127b150eace848789e2c32d9cfec3fb1b7a68f66e355\nsize 78064\n"
  },
  {
    "path": "Music/Jingles/Awkward Death.mod",
    "content": "version https://git-lfs.github.com/spec/v1\noid sha256:ed8420034b62907d0e70e440ef333faddb700d80363a2ee5e974b836d13ab072\nsize 72944\n"
  },
  {
    "path": "Music/Jingles/Battle Encounter.mod",
    "content": "version https://git-lfs.github.com/spec/v1\noid sha256:5966293203fab049a675e54dddf6271352e8e0123406f8e53c7b90134178fac7\nsize 69872\n"
  },
  {
    "path": "Music/Jingles/Battle Motif.mod",
    "content": "version https://git-lfs.github.com/spec/v1\noid sha256:d402e1f6778804558cf315874160d7a66ffd73c35b25b2740fdb3a7687ee4b66\nsize 73968\n"
  },
  {
    "path": "Music/Jingles/Excited Suspense.mod",
    "content": "version https://git-lfs.github.com/spec/v1\noid sha256:30cd67a56d592c1f33c9c6fc01e8bf780baeebba98e88f8a6c2f54f2aa333102\nsize 69872\n"
  },
  {
    "path": "Music/Jingles/Falling Asleep.mod",
    "content": "version https://git-lfs.github.com/spec/v1\noid sha256:b106e161292cb638a0ff3425c10702f853f70f634eccf56aed2e2da6bb87567f\nsize 69872\n"
  },
  {
    "path": "Music/Jingles/Nursery Rhyme with pauses.mod",
    "content": "version https://git-lfs.github.com/spec/v1\noid sha256:c2c1b751150d6c842fca1c2a9ec465fa0d5f36f197eac4b6f72038fe7de10348\nsize 76016\n"
  },
  {
    "path": "Music/Jingles/Out of Energy Game Over.mod",
    "content": "version https://git-lfs.github.com/spec/v1\noid sha256:a1e197301d636c2dc60a2978ad2d0af394c3f98770bad84dff12cbe52289b03d\nsize 69872\n"
  },
  {
    "path": "Music/Jingles/Pitfall Death.mod",
    "content": "version https://git-lfs.github.com/spec/v1\noid sha256:1deeac81f9f6993701f47bce3105b79277f051fa7f602d19fb7e34909f29a911\nsize 69872\n"
  },
  {
    "path": "Music/Jingles/Radical Intro.mod",
    "content": "version https://git-lfs.github.com/spec/v1\noid sha256:4c7830fd24e04e46361da7fbda92d579ab17d5a506ffa4e14ed849c1bbdd73ec\nsize 70896\n"
  },
  {
    "path": "Music/Jingles/Radical Victory.mod",
    "content": "version https://git-lfs.github.com/spec/v1\noid sha256:02b2b7b91feeab55bed9874bfbc2bac68683c60da03583a090f9bc187fc605ff\nsize 69872\n"
  },
  {
    "path": "Music/Jingles/Rascal's Ditty.mod",
    "content": "version https://git-lfs.github.com/spec/v1\noid sha256:104dce932a6e236b5ec0b9f12f03b4945aab41dbc3b472260b70ab28cbde7e7e\nsize 78064\n"
  },
  {
    "path": "Music/Jingles/Short Lullaby with Key Modulation.mod",
    "content": "version https://git-lfs.github.com/spec/v1\noid sha256:3fc87c55c261dd7aa73bb64f43244b27aa2a9f78d40c4e06d7f80378a03679ca\nsize 74992\n"
  },
  {
    "path": "Music/Jingles/Short SML2-Style Jingle.mod",
    "content": "version https://git-lfs.github.com/spec/v1\noid sha256:c0b75ff5210183100f120bee790daf31ff7651b5b3b35318afe37a332addb0b3\nsize 70896\n"
  },
  {
    "path": "Music/Jingles/Silly Death.mod",
    "content": "version https://git-lfs.github.com/spec/v1\noid sha256:3ce62c85756300125faa2d19dfa2c3e7c9dc2114d0e8dccf1fb7f598ef0e81f9\nsize 69872\n"
  },
  {
    "path": "Music/Jingles/Slow death.mod",
    "content": "version https://git-lfs.github.com/spec/v1\noid sha256:02790e392331c5ffa6543c8ed788688a525c13641974c2a6d4f36d51e3d6d539\nsize 69872\n"
  },
  {
    "path": "Music/Jingles/Swing into Victory.mod",
    "content": "version https://git-lfs.github.com/spec/v1\noid sha256:cfe6f756382e9ccc4caea6a59cf74a168bb62b39f0a9b7e2a89f6b6b4120c09d\nsize 69872\n"
  },
  {
    "path": "Music/Jingles/The Sad Truth.mod",
    "content": "version https://git-lfs.github.com/spec/v1\noid sha256:eb6be515ddbb38cabea188f0b49bd4b3c885eacad93a2ad788393777622b17c1\nsize 69872\n"
  },
  {
    "path": "Music/Jingles/Victory Fanfare.mod",
    "content": "version https://git-lfs.github.com/spec/v1\noid sha256:8b31e90949094b57e97e7e4acb135b1bf9807fb07fc6132ff322a1e975591f5e\nsize 69872\n"
  },
  {
    "path": "Music/Jingles/Victory Lap.mod",
    "content": "version https://git-lfs.github.com/spec/v1\noid sha256:1e9a3f4930c1a476fce7ad864e71c5bb259b57bf5e2956f20f30a217efe97b56\nsize 71920\n"
  },
  {
    "path": "Music/Menu Themes/Free OST 1 - Character Select.mod",
    "content": "version https://git-lfs.github.com/spec/v1\noid sha256:f3a0482f6c0edb63faeddd02da9fe503729757bf06135640212ac38281deaa66\nsize 78064\n"
  },
  {
    "path": "Music/Menu Themes/Free OST 1 - Ending Theme.mod",
    "content": "version https://git-lfs.github.com/spec/v1\noid sha256:e2b41e1f5123fcc569bf00cb52cfe8f66615f66b9529dea76669f46ef8ed6af8\nsize 82160\n"
  },
  {
    "path": "Music/Menu Themes/Free OST 1 - Fanfare.mod",
    "content": "version https://git-lfs.github.com/spec/v1\noid sha256:8c6aecbf3c4ffb22aa9dd23d6cf10bcfac2bb8ecbccc0d86671a700e10e1a79f\nsize 73968\n"
  },
  {
    "path": "Music/Menu Themes/MBR Settings.mod",
    "content": "version https://git-lfs.github.com/spec/v1\noid sha256:7763cc258d2a7f4cfb32687377337e7cd295f9f15c52499fb66ce492bde2fbe9\nsize 5228\n"
  },
  {
    "path": "Music/National Anthems/France Intro.mod",
    "content": "version https://git-lfs.github.com/spec/v1\noid sha256:987c556425958f9cc753e612b838a7c95327777310a8ac66ec5d2d910552609e\nsize 70896\n"
  },
  {
    "path": "Music/National Anthems/Germany Intro.mod",
    "content": "version https://git-lfs.github.com/spec/v1\noid sha256:3e2baf77e00ab2b44c206f4d7f88fc6cdccd370f50774032d2e23ff186598c93\nsize 70896\n"
  },
  {
    "path": "Music/National Anthems/Italy Intro.mod",
    "content": "version https://git-lfs.github.com/spec/v1\noid sha256:ec975e00337901a37c19870139bbe266d2ad7ab146958ec6f43e163ea334710c\nsize 70896\n"
  },
  {
    "path": "Music/National Anthems/United Kingdom Intro.mod",
    "content": "version https://git-lfs.github.com/spec/v1\noid sha256:54aa56460895b352ab13bbdd521303ceff21697411305db3a20dc8d3d0b0855d\nsize 70896\n"
  },
  {
    "path": "Music/National Anthems/United States of America Intro.mod",
    "content": "version https://git-lfs.github.com/spec/v1\noid sha256:d3713cfead15af00bb61b3b007116658dc17791692a25f9a84cf567bc864f42e\nsize 71920\n"
  },
  {
    "path": "Music/Overworld/Darkstone.mod",
    "content": "version https://git-lfs.github.com/spec/v1\noid sha256:a0d14531ae6348ec2a149b2284ee970b9e4f428ad3ed0c23fd4d00faf0498779\nsize 7484\n"
  },
  {
    "path": "Music/Overworld/Darkstone_Remix.mod",
    "content": "version https://git-lfs.github.com/spec/v1\noid sha256:a3266c7b9712faa744f978f8b4725475c9071b2869089abe968d6f02d4f07243\nsize 58378\n"
  },
  {
    "path": "Music/Overworld/FridgeMusic.mod",
    "content": "version https://git-lfs.github.com/spec/v1\noid sha256:622038cad3ba4cff57321e3ce5593970b50867833c439e76a07ee14dc2f8b26b\nsize 76016\n"
  },
  {
    "path": "Music/Overworld/Great Melody 01.mod",
    "content": "version https://git-lfs.github.com/spec/v1\noid sha256:eba3f04324341bcec77bd029dde555d10da58984eab16276e508ecf0b0365275\nsize 84208\n"
  },
  {
    "path": "Music/Overworld/Great Melody02.mod",
    "content": "version https://git-lfs.github.com/spec/v1\noid sha256:da0d6614a843de5a835bf408bdb8185093db5dfc34b788005106ecdb59662335\nsize 83184\n"
  },
  {
    "path": "Music/Overworld/In the Town.mod",
    "content": "version https://git-lfs.github.com/spec/v1\noid sha256:969d06ba38461e7e62703cfe17efcd88b90c7e70d85739fedee2227c71e8d148\nsize 73968\n"
  },
  {
    "path": "Music/Overworld/Little Tune 11.mod",
    "content": "version https://git-lfs.github.com/spec/v1\noid sha256:020edc3fb0ee71e0424eaf3f8b03bb98c51a0c56da9580c81bac18a5dbec06f3\nsize 76016\n"
  },
  {
    "path": "Music/Overworld/ParkMusic.mod",
    "content": "version https://git-lfs.github.com/spec/v1\noid sha256:f46e1fa9f3f0702c675646d90b79cea5ec39b6a7d7b819ebbca91feed547809d\nsize 79088\n"
  },
  {
    "path": "Music/Overworld/Peppy Regal Overworld.mod",
    "content": "version https://git-lfs.github.com/spec/v1\noid sha256:8ff0a9ce1f59a43f6feeecd3e96be73e97b6a8c4953295356e11b694db2ff06c\nsize 71920\n"
  },
  {
    "path": "Music/Overworld/The Gang's All Here.mod",
    "content": "version https://git-lfs.github.com/spec/v1\noid sha256:0cf7ffe889b381600f64cc7d46c1dcd3792e3950e548fc06c51641e56fa8d848\nsize 6216\n"
  },
  {
    "path": "Music/Overworld/Villains of Hiphop.mod",
    "content": "version https://git-lfs.github.com/spec/v1\noid sha256:9c1ff061cae4abd01a168a5a2d3e3b6d8d6b819d825706837c9ee1f25ede9402\nsize 88304\n"
  },
  {
    "path": "Music/Overworld/my_streets2.mod",
    "content": "version https://git-lfs.github.com/spec/v1\noid sha256:837e48ac9257445609dbfad4ecd6be95c6e7ea6083d754f4f842fffff183b0c1\nsize 103394\n"
  },
  {
    "path": "Music/Readme.md",
    "content": "Join the GB Studio discord to answer your music questions: https://discord.gg/2hYeJ4m\n\nMusic Docs: https://www.gbstudio.dev/docs/music/\n\n# Credits\n\n**krümel (crumb)#0723:**\n\n**Action**\n- Boss Fight 1: Fast, upbeat, hectic\n- Boss Fight 2: Cool, steady backbeat, tense\n- Boss Fight 3: Tense, collected\n- Sneaking Around: Short, low-key stealth tune\n- Free OST 1 Fighting\n- Free OST 1 Backstreets\n- Joyous Takeoff\n- Dancing and Infiltrating\n- Sugar Craze\n- Monty's Overheating Spaceship\n\n**Cutscenes**\n- Detective Intro - short silence at start (Little Tune 3)\n- Peppy Pop Song - length of 1:24, doesn't loop (Ending1)\n- Determined\n- Twilight Drive\n- Free OST 1 Fanfare\n- Free OST 1 Ending Theme\n\n**Menu Themes**\n- Free OST 1 Character Select\n\n**Overworld**\n- Peppy Regal Overworld\n- Great Melody01\n- Great Melody02\n- Little Tune 11\n- In the Town\n- Villains of Hiphop\n\n**Jingles**\n- Awkward Death\n- Battle Encounter\n- Battle Motif\n- Excited Suspense\n- Falling Asleep\n- Game Over Loop\n- Nursery Rhyme with pauses\n- Out of Energy Game Over\n- Pitfall Death\n- Radical Intro\n- Radical Victory\n- Short Lullaby with Key Modulation\n- Short SML2-Style Jingle\n- Silly Death\n- Slow death\n- Swing into Victory\n- The Sad Truth\n- Victory Fanfare\n- Victory Lap\n- Rascal's Ditty\n\n**Drumbeats**\n- Messy 90s Uptempo Hiphop\n- Kick Kick Snare\n- Backbeat Metal Drumming\n- Boots Cats\n- Duck Tales Drumbeat\n- Kick Kick Kick Crash\n- Halftime Metal Drumming\n- Supa-Hip Breakbeat\n- Backbeat with Hats\n- Upbeat Metal Drumming\n- Kick Stutter\n\n**National Anthems**\n- France Intro - Opening 4 bars of France's national anthem\n- Germany Intro - Opening 4 bars of Germany's national anthem\n- Italy Intro - Opening 4 bars of Italy's national anthem\n- United Kingdom Intro - Opening 4 bars of UK's national anthem\n- United States Intro - Opening 8 bars of US's national anthem\n\n**SFX**\n- Alarm Clock\n- Alarm System\n- Clock\n- Clock2\n- EuroCop\n- Explosion1\n- Missle Alert\n- Nokia Tune\n- Phone Ring\n- Pickup_Coin\n- Powerup\n- Powerup2\n- Powerup3\n- Squeal Door\n- Vibration Alarm\n\n**Ember#1765 / DeerTears:**\n\n**Action**\n- Compression - A drum-heavy hiphop song played a little too fast.\n- Tape It Together - Dungeon Spelunking Music\n- Serious Ping Pong Matches\n\n**Cutscenes**\n- Scrolling Text - 6/8 Fanfare with a chorus in 11/8\n- Short Hauntings\n\n**Menu Themes**\n- MBR Settings\n\n**SFX**\n- fast wind gust\n- harsh wind gust\n- menu no thanks\n- nuh-uh\n- odd open inventory\n- old telephone 1\n- racecar zoom\n- smb3okay\n\n**Overworld**\n- Darkstone - Delay-heavy song for caves, featured in the game 6rooms\n- The Gang's All Here - The intro part is out of key but it's otherwise a lighthearted song for walking in the park\n\n**Tomas Danko:**\n\nhttp://www.danko.se/\n\nShared under the Attribution 4.0 CC Licence.\n\n- FridgeMusic - Slow, unsteady but relaxed\n- Park Music - Upbeat version of Fridgemusic, very catchy\n\n**Tronimal:**\n\n**Overworld**\n- Darkstone Remix\n\n**Galaxy Stargraph**\n\n- my_streets2"
  },
  {
    "path": "Music/SFX/Alarm Clock.mod",
    "content": "version https://git-lfs.github.com/spec/v1\noid sha256:d7b9c2ff93fc3140d6c8a5ddbc47493cbb638e7a174634f11e759265b4537464\nsize 69872\n"
  },
  {
    "path": "Music/SFX/Alarm System.mod",
    "content": "version https://git-lfs.github.com/spec/v1\noid sha256:341f1fdbf494b7f9dd39b62794de76d51b0cff2d61f4b5ef6ebe0c6cac71be45\nsize 69872\n"
  },
  {
    "path": "Music/SFX/Clock.mod",
    "content": "version https://git-lfs.github.com/spec/v1\noid sha256:47db62062bb71672a51561b0523b050876d4de4964eab8dc289e59c608deb8dc\nsize 69872\n"
  },
  {
    "path": "Music/SFX/Clock2.mod",
    "content": "version https://git-lfs.github.com/spec/v1\noid sha256:653657a3a310ccf70450d2d323515bd2bb169945367d6261725d7304593f6eb3\nsize 69872\n"
  },
  {
    "path": "Music/SFX/EuroCop.mod",
    "content": "version https://git-lfs.github.com/spec/v1\noid sha256:91576f9b456b13603d1273338769c79057047e69ab2183ee7532f2f51e240fe0\nsize 69872\n"
  },
  {
    "path": "Music/SFX/Explosion1.mod",
    "content": "version https://git-lfs.github.com/spec/v1\noid sha256:ac40143e72394a35884c4a75013486224929ac5008485a8fcf58ff88101e3d18\nsize 69872\n"
  },
  {
    "path": "Music/SFX/Missile Alert.mod",
    "content": "version https://git-lfs.github.com/spec/v1\noid sha256:fef8f5711ca42227a978326286f9de4eb8f2c5aafb4948bfde50cffe9052620d\nsize 69872\n"
  },
  {
    "path": "Music/SFX/Nokia Tune.mod",
    "content": "version https://git-lfs.github.com/spec/v1\noid sha256:213e50140d44f15df061ff3e1339dda47b174fb14dbdb3ee7038b7f2caeb63dd\nsize 69872\n"
  },
  {
    "path": "Music/SFX/Phone Ring.mod",
    "content": "version https://git-lfs.github.com/spec/v1\noid sha256:cb4437bab8516f117ab9eb15f272365c9022a80519b56bcc02409a56a40222c0\nsize 69872\n"
  },
  {
    "path": "Music/SFX/Pickup_Coin.mod",
    "content": "version https://git-lfs.github.com/spec/v1\noid sha256:66e9ba04e07cb213c13de64308250307fad66a81377378a9be705ddf3ed1d462\nsize 69872\n"
  },
  {
    "path": "Music/SFX/Powerup.mod",
    "content": "version https://git-lfs.github.com/spec/v1\noid sha256:9b121820b8baea095891d73ebd120c9c0ed3cd320b5d77f84da9606e1f3f912b\nsize 69872\n"
  },
  {
    "path": "Music/SFX/Powerup2.mod",
    "content": "version https://git-lfs.github.com/spec/v1\noid sha256:1544d2cf096a2be91c3461a8b8c6679cda9e5a84bbfc235631d2906d9d0d018a\nsize 69872\n"
  },
  {
    "path": "Music/SFX/Powerup3.mod",
    "content": "version https://git-lfs.github.com/spec/v1\noid sha256:82eb90a77965a583a13dfe468de39f6be966bcf8aec9877cb5173c760df7047f\nsize 69872\n"
  },
  {
    "path": "Music/SFX/Readme.md",
    "content": "# Credits:\n\n**Ember#1765 / DeerTears:**\n\n- fast wind gust.mod\n- harsh wind gust.mod\n- menu no thanks.mod\n- nuh-uh.mod\n- odd open inventory.mod\n- old telephone 1.mod\n- racecar zoom.mod\n- smb3okay.mod\n"
  },
  {
    "path": "Music/SFX/Squeal Door.mod",
    "content": "version https://git-lfs.github.com/spec/v1\noid sha256:d642d01bde056b9dde96f2db0892c870367143a973b77aaede4da5aad0d62598\nsize 69872\n"
  },
  {
    "path": "Music/SFX/Vibration Alarm.mod",
    "content": "version https://git-lfs.github.com/spec/v1\noid sha256:273b092cb200ef7db676ee1201fe51cc4784688bdeacbf0f4b1862749b188a0c\nsize 69872\n"
  },
  {
    "path": "Music/SFX/fast wind gust.mod",
    "content": "version https://git-lfs.github.com/spec/v1\noid sha256:2564a4027e797db9e137d9652b5176f0fe7a62d52050e62f34fa79128d6f6604\nsize 69872\n"
  },
  {
    "path": "Music/SFX/harsh wind gust.mod",
    "content": "version https://git-lfs.github.com/spec/v1\noid sha256:7a675746f33b888ffe2e0a2ff14b263e9024ae799d582c6b8b9ddbf7fbc43f11\nsize 69872\n"
  },
  {
    "path": "Music/SFX/menu no thanks.mod",
    "content": "version https://git-lfs.github.com/spec/v1\noid sha256:3ad05a0df0f623b6c010df4ee88ded0ef45a3befcacdeb36f83c3a83a17b3655\nsize 69872\n"
  },
  {
    "path": "Music/SFX/nuh-uh.mod",
    "content": "version https://git-lfs.github.com/spec/v1\noid sha256:bc821f64e788366e75e772cf5d7c301e5d7ab8a0dbe856775c205f5c3bb004ca\nsize 69872\n"
  },
  {
    "path": "Music/SFX/odd open inventory.mod",
    "content": "version https://git-lfs.github.com/spec/v1\noid sha256:66c8de97f55b06cb43d1311d27dc8eb5139786b6f1e1369c13ff900d7777ae91\nsize 2108\n"
  },
  {
    "path": "Music/SFX/old telephone 1.mod",
    "content": "version https://git-lfs.github.com/spec/v1\noid sha256:cb2548ef582331d2e3a5ad82fee78e55815b9efd940bbe9b30356a3f599c60d4\nsize 2108\n"
  },
  {
    "path": "Music/SFX/racecar zoom.mod",
    "content": "version https://git-lfs.github.com/spec/v1\noid sha256:725acda9ff7dbdb6112375f71579b4614185ed555a5c6afc51696e0ecb05818c\nsize 69872\n"
  },
  {
    "path": "Music/SFX/smb3okay.mod",
    "content": "version https://git-lfs.github.com/spec/v1\noid sha256:2637e719b28dd0d2738a19595be9edef3d13c0b177f5293dafe29979a9f0c55b\nsize 69872\n"
  },
  {
    "path": "Music/Spooky/Detective Intro.mod",
    "content": "version https://git-lfs.github.com/spec/v1\noid sha256:a7f78cafc7ea94e0cc34adc372a441b8e1dce0da3bcb8f1ebc6d1835803ceeea\nsize 77040\n"
  },
  {
    "path": "Music/Spooky/Short Hauntings.mod",
    "content": "version https://git-lfs.github.com/spec/v1\noid sha256:05fb02ac54fa87a1cb2bd361c4601792e6598c66ba6b08634f18a8e6044f243f\nsize 71920\n"
  },
  {
    "path": "README.md",
    "content": "![alt text](https://github.com/DeerTears/GB-Studio-Community-Assets/blob/master/titlecard_july11_2019.png \"GB Studio Community Assets Titlecard\")\n\nAll assets must be original and usable in GB Studio. **Please do not upload content that you did not make.**\n\nNo attribution is required! All assets can be freely distributed and used commercially. If you're submitting your own work to this repo, you must be okay with it being used commercially and potentially redistributed without credit. Read the LICENCE file for more details.\n\n# Downloading .mod music?\n\n**Do not download the entire repository!** Instead, [click here to download a music-only .zip folder](https://github.com/DeerTears/GB-Studio-Community-Assets/releases/tag/v1.0) of this repository. Github changes line-endings when zipping a full repository, and this mismatch causes GBT Player to crash on compile. You can prevent this GBT Player crash by downloading the music release separately from the rest of the repository.\n\n# How-To Credit\n\nTo help track our contributors, a README.md file exists for each folder. These README files contain the names of every asset creator, followed by a list of the assets they've made for that particular folder. If you use an asset from the repository, please read-up on who made the asset you've downloaded and pay it forward by including the asset-maker's name in your game's credits. :)\n\n# How-To Contribute\n\n[Read the CONTRIBUTING.MD file](https://github.com/DeerTears/GB-Studio-Community-Assets/blob/master/CONTRIBUTING.md)\n\nIf you need additional help having your assets added to the repository, or you're experiencing difficulties downloading/using any assets from this repository, [join the GB Studio Discord](https://discord.gg/2hYeJ4m).\n\n# Other Links and Community Hubs\n\n- [GB Studio Download](https://chrismaltby.itch.io/gb-studio)\n- [GB Studio Documentation](https://www.gbstudio.dev/docs)\n- [GB Studio Discord](https://discord.com/invite/dYeyUem)\n- [GB Studio Plugin Database](https://docs.google.com/spreadsheets/d/1d2F5hSEMt6nkacw-qVnYlT3IPHqmCCaLFhRboC5xxc0/edit#gid=0)\n- [GB Studio Central - News, Interviews, Guides](https://gbstudiocentral.com/)\n- [r/gbstudio](https://www.reddit.com/r/gbstudio/)\n- [Other Gameboy/GB Studio Community Links](https://github.com/DeerTears/GB-Studio-Community-Assets/blob/master/COMMUNITY_LINKS.md)\n\n# Thanks\n\nI'd like to thank Paige who has worked hard to maintain the repository and help me out with Github LFS. You can check her out on [Paige's Cohost](https://cohost.org/MxAshlynn).\n\nEmber here. I really appreciate how the GB Studio community has come together for this repository. If you would like to support purely the organizational work I've done by maintaining this repository, consider [buying me a coffee](https://ko-fi.com/goodnightgirl). There is no reward provided in supporting me, everyone is welcome to contribute or make suggestions of how to improve the repository.\n\n[![ko-fi](https://ko-fi.com/img/githubbutton_sm.svg)](https://ko-fi.com/R6R5EPWKI)\n\nHappy developing!\n"
  },
  {
    "path": "Scripts/Camera/Screenscroll/screenscroll_scene_init.txt",
    "content": "{\r\n    \"script\": [\r\n        {\r\n            \"id\": \"b7afdf6b-72a5-4f4e-9bd2-a057d047364e\",\r\n            \"command\": \"EVENT_CAMERA_MOVE_TO\",\r\n            \"args\": {\r\n                \"x\": 0,\r\n                \"y\": 0,\r\n                \"speed\": \"0\"\r\n            }\r\n        },\r\n        {\r\n            \"id\": \"445484e7-6f06-469a-a2c6-7c02d432b2e8\",\r\n            \"command\": \"EVENT_SET_VALUE\",\r\n            \"args\": {\r\n                \"variable\": \"0\",\r\n                \"value\": {\r\n                    \"type\": \"number\",\r\n                    \"value\": 0\r\n                }\r\n            }\r\n        },\r\n        {\r\n            \"id\": \"d4997ea8-b49d-446e-a6ad-26467fc06ee5\",\r\n            \"command\": \"EVENT_END\"\r\n        }\r\n    ],\r\n    \"__type\": \"script\"\r\n}"
  },
  {
    "path": "Scripts/Camera/Screenscroll/screenscroll_trigger.txt",
    "content": "{\r\n    \"script\": [\r\n        {\r\n            \"id\": \"90830cb2-a146-4193-ac7b-857432bece89\",\r\n            \"command\": \"EVENT_SWITCH\",\r\n            \"args\": {\r\n                \"variable\": \"0\",\r\n                \"choices\": 2,\r\n                \"__collapseCase0\": false,\r\n                \"value0\": 0,\r\n                \"__collapseCase1\": false,\r\n                \"value1\": 1,\r\n                \"__collapseCase2\": false,\r\n                \"value2\": 3,\r\n                \"__collapseCase3\": false,\r\n                \"value3\": 4,\r\n                \"__collapseCase4\": false,\r\n                \"value4\": 5,\r\n                \"__collapseCase5\": false,\r\n                \"value5\": 6,\r\n                \"__collapseCase6\": false,\r\n                \"value6\": 7,\r\n                \"__collapseCase7\": false,\r\n                \"value7\": 8,\r\n                \"__collapseCase8\": false,\r\n                \"value8\": 9,\r\n                \"__collapseCase9\": false,\r\n                \"value9\": 10,\r\n                \"__collapseCase10\": false,\r\n                \"value10\": 11,\r\n                \"__collapseCase11\": false,\r\n                \"value11\": 12,\r\n                \"__collapseCase12\": false,\r\n                \"value12\": 13,\r\n                \"__collapseCase13\": false,\r\n                \"value13\": 14,\r\n                \"__collapseCase14\": false,\r\n                \"value14\": 15,\r\n                \"__collapseCase15\": false,\r\n                \"value15\": 16,\r\n                \"__collapseElse\": false,\r\n                \"__disableElse\": true\r\n            },\r\n            \"children\": {\r\n                \"true0\": [\r\n                    {\r\n                        \"id\": \"5244b31e-5e2c-4496-b8f4-c341980c2d7e\",\r\n                        \"command\": \"EVENT_CAMERA_MOVE_TO\",\r\n                        \"args\": {\r\n                            \"x\": 20,\r\n                            \"y\": 0,\r\n                            \"speed\": \"1\"\r\n                        }\r\n                    },\r\n                    {\r\n                        \"id\": \"5dc26bd3-39d8-4cec-90f6-dbc6a9ef424e\",\r\n                        \"command\": \"EVENT_ACTOR_MOVE_RELATIVE\",\r\n                        \"args\": {\r\n                            \"actorId\": \"$self$\",\r\n                            \"x\": 3,\r\n                            \"y\": 0,\r\n                            \"moveType\": \"horizontal\",\r\n                            \"useCollisions\": false\r\n                        }\r\n                    },\r\n                    {\r\n                        \"id\": \"b8a77252-627b-426f-99ab-842c51b3703c\",\r\n                        \"command\": \"EVENT_SET_VALUE\",\r\n                        \"args\": {\r\n                            \"variable\": \"0\",\r\n                            \"value\": {\r\n                                \"type\": \"number\",\r\n                                \"value\": 1\r\n                            }\r\n                        }\r\n                    },\r\n                    {\r\n                        \"id\": \"800c5026-715a-4d12-8b34-28708469b8a6\",\r\n                        \"command\": \"EVENT_END\"\r\n                    }\r\n                ],\r\n                \"true1\": [\r\n                    {\r\n                        \"id\": \"0b60118b-be04-4e3e-b272-18738cab40ea\",\r\n                        \"command\": \"EVENT_CAMERA_MOVE_TO\",\r\n                        \"args\": {\r\n                            \"x\": 0,\r\n                            \"y\": 0,\r\n                            \"speed\": \"1\"\r\n                        }\r\n                    },\r\n                    {\r\n                        \"id\": \"63da2fde-fa19-4234-ac2d-8aee81fabb69\",\r\n                        \"command\": \"EVENT_ACTOR_MOVE_RELATIVE\",\r\n                        \"args\": {\r\n                            \"actorId\": \"$self$\",\r\n                            \"x\": -3,\r\n                            \"y\": 0,\r\n                            \"moveType\": \"horizontal\",\r\n                            \"useCollisions\": false\r\n                        }\r\n                    },\r\n                    {\r\n                        \"id\": \"056269fc-05b1-4ee1-ba7b-bc4c79207bea\",\r\n                        \"command\": \"EVENT_SET_VALUE\",\r\n                        \"args\": {\r\n                            \"variable\": \"0\",\r\n                            \"value\": {\r\n                                \"type\": \"number\",\r\n                                \"value\": 0\r\n                            }\r\n                        }\r\n                    },\r\n                    {\r\n                        \"id\": \"b3e31b0a-8388-4f85-986f-bf59d154c26b\",\r\n                        \"command\": \"EVENT_END\"\r\n                    }\r\n                ],\r\n                \"true2\": [\r\n                    {\r\n                        \"id\": \"c3232516-1404-4713-8d1a-7d58b9990190\",\r\n                        \"command\": \"EVENT_END\"\r\n                    }\r\n                ],\r\n                \"true3\": [\r\n                    {\r\n                        \"id\": \"d934a39a-91b7-43e0-8a8f-4248dc39fcb4\",\r\n                        \"command\": \"EVENT_END\"\r\n                    }\r\n                ],\r\n                \"true4\": [\r\n                    {\r\n                        \"id\": \"d9df4982-e720-499f-bd8f-f7a107bf6afc\",\r\n                        \"command\": \"EVENT_END\"\r\n                    }\r\n                ],\r\n                \"true5\": [\r\n                    {\r\n                        \"id\": \"005923b0-d8b7-4d25-b386-f86b3fa3ef8e\",\r\n                        \"command\": \"EVENT_END\"\r\n                    }\r\n                ],\r\n                \"true6\": [\r\n                    {\r\n                        \"id\": \"1862e8d4-806f-4583-b060-bc5d53a9d717\",\r\n                        \"command\": \"EVENT_END\"\r\n                    }\r\n                ],\r\n                \"true7\": [\r\n                    {\r\n                        \"id\": \"367db6d7-c6d2-4699-ab15-922338d6e61a\",\r\n                        \"command\": \"EVENT_END\"\r\n                    }\r\n                ],\r\n                \"true8\": [\r\n                    {\r\n                        \"id\": \"3749aca3-cc5c-41eb-9330-c13336568bf2\",\r\n                        \"command\": \"EVENT_END\"\r\n                    }\r\n                ],\r\n                \"true9\": [\r\n                    {\r\n                        \"id\": \"66b1a4dd-202c-4742-8b59-01cdaabde330\",\r\n                        \"command\": \"EVENT_END\"\r\n                    }\r\n                ],\r\n                \"true10\": [\r\n                    {\r\n                        \"id\": \"b85fc047-543f-4393-8ec6-2f5d12d8125d\",\r\n                        \"command\": \"EVENT_END\"\r\n                    }\r\n                ],\r\n                \"true11\": [\r\n                    {\r\n                        \"id\": \"7ba53ec6-6b16-4d76-bc44-8474d52144f5\",\r\n                        \"command\": \"EVENT_END\"\r\n                    }\r\n                ],\r\n                \"true12\": [\r\n                    {\r\n                        \"id\": \"478cfa0b-43aa-4fce-9e52-fcbff625cdfd\",\r\n                        \"command\": \"EVENT_END\"\r\n                    }\r\n                ],\r\n                \"true13\": [\r\n                    {\r\n                        \"id\": \"43ecbd1c-61f6-4070-8c31-877e8a4f5aa5\",\r\n                        \"command\": \"EVENT_END\"\r\n                    }\r\n                ],\r\n                \"true14\": [\r\n                    {\r\n                        \"id\": \"2dd09603-5312-4ff9-b34f-e558b0f07a18\",\r\n                        \"command\": \"EVENT_END\"\r\n                    }\r\n                ],\r\n                \"true15\": [\r\n                    {\r\n                        \"id\": \"1bf2a839-9d45-4485-848a-c55dcc34c4d5\",\r\n                        \"command\": \"EVENT_END\"\r\n                    }\r\n                ],\r\n                \"false\": [\r\n                    {\r\n                        \"id\": \"a3b34a96-5b48-4c7e-bcee-f71101f3d35d\",\r\n                        \"command\": \"EVENT_END\"\r\n                    }\r\n                ]\r\n            }\r\n        },\r\n        {\r\n            \"id\": \"c983710d-39a9-4728-b325-eed7ce8df3d7\",\r\n            \"command\": \"EVENT_END\"\r\n        }\r\n    ],\r\n    \"__type\": \"script\"\r\n}"
  },
  {
    "path": "Scripts/Camera/break camera from player.txt",
    "content": "{\r\n    \"script\": [\r\n        {\r\n            \"id\": \"b7afdf6b-72a5-4f4e-9bd2-a057d047364e\",\r\n            \"command\": \"EVENT_CAMERA_MOVE_TO\",\r\n            \"args\": {\r\n                \"x\": 0,\r\n                \"y\": 0,\r\n                \"speed\": \"0\"\r\n            }\r\n        },\r\n        \r\n        {\r\n            \"id\": \"d4997ea8-b49d-446e-a6ad-26467fc06ee5\",\r\n            \"command\": \"EVENT_END\"\r\n        }\r\n    ],\r\n    \"__type\": \"script\"\r\n}"
  },
  {
    "path": "Sprites/Animated/README.md",
    "content": "# Animated Non-Actor Sprites\n\nBy TommySezSoWhat\n- `d20_anim.png`: Rolling D20 animation.\n- `music_notes.png`: Scrolling music notes, using the note graphic from the default music emote.\n\nBy Nath on the GB Studio Discord\n- `selection_box.png`: Marching ants animation in a box\n\nBy krümel on the GB Studio Discord:\nKnight_walk(4frames).png\n- `Animal`\n- `Card`\n- `Crosshair`\n- `Dice`\n- `krümel's People`\n\nBy Kalyen\n- `Fairy_wing_r.png`\n- `Fairy_wing_l.png`: Flapping wings\n\nBy DeerTears\n- `large_coffee.png`\n- `small_coffee.png`\n\nBy GumpyFunction\n- `ChristmasCop_animated.png`\n- `Hooded_Figure_animated.png `\n- `Knight_animated.png`\n- `Knight_walk(4frames).png`\n- `Old_Orc_animated.png`\n- `Orc_1.png`\n- `Orc_2.png`\n- `Orc_3.png`\n- `Orc_animated.png`\n- `Orc_walk(4frames).png `\n- `Skeleton_Body(idle).png`\n- `Spinning_Skeleton_Head(5frames).png`\n- `Bat-Orc_animated.png`\n- `Cat_idle.png`\n- `Crow_flying.png`\n- `Crow_idle.png`\n- `Mimic_walk(4frames).png`\n\nBy godai78\n- `kosmonaut.png`\n- `kosmonaut_eva.png`\n- `kosmonaut_girl.png`\n"
  },
  {
    "path": "Sprites/Static/Cats/README.md",
    "content": "# Cat Sprites\n\nA set of 7 static cat sprites based on the cat sprite from the GB Studio demo.\n\n- Smudgie: `t_cat_calico_static.png`\n- Nicky: `t_cat_fat_tuxedo_static.png`\n- Bertie: `t_cat_grey_tuxedo_static.png`\n- Jett: `t_cat_short_black_static.png`\n- Einstein: `t_cat_short_tuxedo_static.png`\n- Knuckles: `t_cat_tuxedo_static.png`\n- Snobol: `t_cat_white_static.png`\n"
  },
  {
    "path": "Sprites/Static/README.md",
    "content": "# Static Sprites\n\nBy Kalyen\n- `Log_1.png`\n- `Portrait_girl_1.png`: Portrait for use in dialog boxes.\n"
  },
  {
    "path": "Tilesets/Credits.md",
    "content": "Old Halls by AFI - Created by AFI#8956 on the community Discord, uploaded by DeerTears. Distributed with permission.  \nFree Furniture by yoanqwp - Created by yoanqwp#8156 on the community Discord, uploaded by DigiDuncan. Distributed with permission.  \nArcade cabinets by godai78 - Free tiles with arcade machines uploaded by author.\n"
  },
  {
    "path": "UI/README.md",
    "content": "# Credits:\n\n## Cursors\n\n**Chris Maltby:**\n\n- `default cursor.png`\n\n**AstraLee:**\n\n- `SkyrimCursor.png` - \"Designed similar to the UI of Skyrim. Recommend for use with inverted fonts.\"\n\n**Armanlone:**\n\n- `fleur_de_lis_cursor.png` - \"Cursor designed based on the fleur de lis and Hollow Knight borders. Recommended for dark frames and white fonts.\"\n\n## Emotes\n\n**Chris Maltby:**\n\n- `default emotes.png`\n\n\n**Gram:**\n\n- `grams-emotes.png`: \"Redid the standard emote bubbles to be a more rounded. A little change but they looks much better. Free to use.\"\n\n## Frames\n\n**Chris Maltby:**\n\n- `default frame.png`\n\n**TommySezSoWhat:**\n\n- `simple_frame.png` - \"Very simple single-line frame with iffy anti-aliases at the corners.\"\n\n**AstraLee:**\n\n- `SkyrimFrame.png` - \"Designed similar to the UI of Skyrim. Recommend for use with inverted fonts.\"\n\n**Armanlone:**\n\n- `fleur_de_lis_frame.png` - \"Dark background frame with four fleur de lis on each corner.\"\n"
  }
]