{"id":20788925,"url":"https://github.com/tildearrow/bovidtrk","last_synced_at":"2026-03-02T09:02:52.629Z","repository":{"id":104360677,"uuid":"303052931","full_name":"tildearrow/bovidtrk","owner":"tildearrow","description":"GoatTracker taken to the next level","archived":false,"fork":false,"pushed_at":"2020-10-11T07:18:19.000Z","size":647,"stargazers_count":5,"open_issues_count":0,"forks_count":0,"subscribers_count":3,"default_branch":"master","last_synced_at":"2025-04-09T18:11:10.917Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"C","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"gpl-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/tildearrow.png","metadata":{"files":{"readme":"readme.txt","changelog":null,"contributing":null,"funding":null,"license":"copying","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":"authors","dei":null,"publiccode":null,"codemeta":null}},"created_at":"2020-10-11T05:58:34.000Z","updated_at":"2024-05-26T18:38:42.000Z","dependencies_parsed_at":"2023-04-11T11:31:16.526Z","dependency_job_id":null,"html_url":"https://github.com/tildearrow/bovidtrk","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/tildearrow/bovidtrk","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tildearrow%2Fbovidtrk","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tildearrow%2Fbovidtrk/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tildearrow%2Fbovidtrk/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tildearrow%2Fbovidtrk/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/tildearrow","download_url":"https://codeload.github.com/tildearrow/bovidtrk/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tildearrow%2Fbovidtrk/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":29996278,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-03-02T01:47:34.672Z","status":"online","status_checked_at":"2026-03-02T02:00:07.342Z","response_time":60,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2024-11-17T15:18:12.505Z","updated_at":"2026-03-02T09:02:52.614Z","avatar_url":"https://github.com/tildearrow.png","language":"C","funding_links":[],"categories":[],"sub_categories":[],"readme":"GoatTracker v2.75\n-----------------\n\nEditor by Lasse ��rni (loorni@gmail.com)\nHardSID 4U support by T�li S�ndor.\nUses reSID engine by Dag Lem.\nUses reSID distortion / nonlinearity by Antti Lankila.\nUses 6510 crossassembler from Exomizer2 beta by Magnus Lind.\nUses the SDL library.\nGoatTracker icon by Antonio Vera.\nCommand quick reference by Simon Bennett.\nPatches and further development by Stefan A. Haubenthal, Valerio Cannone, Raine M. Ekman,\nTero Lindeman, Henrik Paulini and Groepaz.\nMicrotonal support by Birgit Jauernig.\n\nDistributed under GNU General Public License\n(see the file COPYING for details)\n\nCovert BitOps homepage:\nhttp://covertbitops.c64.org\n\nGoatTracker 2 SourceForge.net page:\nhttp://sourceforge.net/projects/goattracker2\n\n\nTable of contents\n-----------------\n\n1. General information\n1.1 Warnings\n1.2 Compatibility with v1.xx\n\n2. Using GoatTracker\n2.1 Command line options\n2.2 Hardware support\n2.3 Keyboard commands\n2.3.1 General keys\n2.3.2 Pattern edit mode\n2.3.2.1 Protracker note-entry mode\n2.3.2.2 DMC note-entry mode\n2.3.2.3 Janko note-entry mode\n2.3.3 Song edit mode\n2.3.4 Instrument edit mode\n2.3.5 Table edit mode\n2.3.6 Songname edit mode\n2.4 Mouse control\n\n3. Song data\n3.1 Orderlist data\n3.2 Pattern data\n3.3 Instrument data\n3.4 Table data\n3.4.1 Wavetable\n3.4.2 Pulsetable\n3.4.3 Filtertable\n3.4.4 Speedtable\n3.5 Playback details\n3.6 Miscellaneous tips\n3.6.1 Limit-based modulation steps\n3.6.2 Precalculated note-independent \"hifi player\" portamento/vibrato\n3.7 Multispeed tips\n\n4. Using the included utilities\n4.1 INS2SND2.EXE\n4.2 SNGSPLI2.EXE\n4.3 MOD2SNG.EXE\n4.4 GT2RELOC.EXE\n\n5. Using the songs outside the editor\n5.1 Playroutine options\n\n6. File/data formats description\n6.1 GoatTracker v2 song (.SNG) format\n6.1.1 Song header\n6.1.2 Song orderlists\n6.1.3 Instruments\n6.1.4 Tables\n6.1.5 Patterns header\n6.1.6 Patterns\n6.2 GoatTracker v2 instrument (.INS) format\n6.3 Sound effect data format\n\n7. Microtonal Tunings\n\n8. Recompiling\n\n9. Version history\n\n\n1. General information\n----------------------\n\nThis program is a tracker-like C64 music editor running on Win32 or Linux\nplatforms (using the SDL library, see http://www.libsdl.org)\n\nGoatTracker v2 adds more commands and uniform step programming tables for\nwaveform/arpeggio, pulse effects, and filter effects. It is likely much more\ncomplex to learn \u0026 master than v1.xx.\n\nFamiliarity with tracker programs in general, hexadecimal notation, and the\nC64's SID chip are required. Consult the C64 Programmer's Reference Guide\n(http://project64.c64.org) or AAY64 (http://www.the-dreams.de/aay.html) for\nSID chip reference.\n\nFor filesize \u0026 library compatibility reasons, precompiled binaries exist only\nfor Win32 platform.\n\n1.1 Warnings\n------------\n\n1. Always look at the end of this file for changes! Sometimes keyboard commands\n   change etc.\n\n2. Always save your songs in the .SNG-format with F11 key if you plan to\n   continue editing! Packed \u0026 relocated songs (PRG/BIN/SID) can not be loaded\n   back into the editor.\n\n3. Even the reSID emulation is in some cases quite far from the output of a\n   real SID. Especially if filters are in use, consider strongly testing your\n   tune on a C64 or on a HardSID card. (Using filters has always been\n   complicated because every SID tends to sound different.)\n\n4. The editor will stop playing if:\n   - The song restart position is illegal (beyond end of song)\n   - The sequence of orderlist commands is incorrect\n     * In a sequence of both TRANSPOSE \u0026 REPEAT, TRANSPOSE must come first\n     * The last thing before a RST-endmark should be a pattern number\n   - Gateoff timer value is too high compared to song tempo.\n   - The song tries to jump directly onto a table row containing a jump (FF xx),\n     either with instrument pointers or 8XY, 9XY, AXY commands.\n   - The song tries to execute pattern commands 0XY, 8XY or EXY from the\n     wavetable.\n   These all are error conditions, and trying to pack/relocate such song should\n   give an error message.\n\n5. Using delayed wavetable or no wavechange (0x 00, where x is 0-F) in the\n   first step of instrument wavetable is unsupported and may result in missing\n   notes.\n\n6. When using a playroutine with unbuffered SID-writes and encountering ADSR-\n   bugs after packing/relocating, you can try either:\n   1) Set pulse-startpos to nonzero value in the troublesome instruments and\n      change the 1stFrame Wave parameter of some instrument slightly, for\n      example from $09 to $0B, to disable a playroutine optimization. The\n      idea in this is to make the noteinit routine take more CPU cycles.\n   2) Use a playroutine with buffered writes to pack/relocate. You can try\n      the \"standard\" buffering first, and full buffering if that does not\n      help yet.\n   3) Try hardrestart attack parameter $F for alternative SID register write\n      order.\n\n7. From v2.18 onwards, wavetable left side values have changed. Delay can\n   now be maximum 16 frames (values $00-$0F), and waveform register values\n   $00-$0F (inaudible) have been mapped to table values $E0-$EF. For example,\n   testbit + gate would be $E9. You need to manually convert values $08-$0F\n   from your old songs!\n\n8. From v2.2 onwards, a new table (speedtable) has been added. The portamento,\n   vibrato and funktempo commands use it. Old songs will be converted upon\n   loading to use the speedtable. Note the keyboard command SHIFT+RETURN\n   to convert the old style parameters.\n\n9. From v2.4 onwards, pulse modulation speed has 1 bit added accuracy, so\n   you need to double pulsespeeds when composing new songs. Old songs will\n   be converted automatically.\n\n10. From v2.59 onwards, gateoff timer parameter high bit disables hardrestart\n   and bit $40 disables gateoff. Old songs \u0026 instruments will be converted\n   automatically.\n\n11. From v2.62 onwards, realtime calculated portamento/vibrato speeds are\n   supported. This is activated by having the high bit ($80) set in the speed-\n   table left side. Naturally, this means that very high portamento speeds (\u003e=\n   $8000) or vibrato speeds (\u003e= $80) become unavailable, but these should not \n   be very useful anyway.\n   \n12. From v2.68 onwards, SID write order has been tweaked for better stability\n   regarding badlines. This has the consequence, however, that notes with \n   attack 0 \u0026 release 1 may ADSR-bug. In this case, try hardrestart attack \n   parameter $F for alternative SID register write order.\n\n1.2 Compatibility with v1.xx\n----------------------------\n\nGoatTracker v2 can load v1.xx songs and instruments, but it saves only in v2\nformat. Some subtleties (like tricks involving instrument changes) will not\nplay back exactly like in v1.xx.\n\nThe only major feature removal is that of the arpeggio command in v2.\nEverything that this command does can also be done with wavetables, and the\nimport feature converts all arpeggio commands to corresponding wavetable\nprograms.\n\n\n2. Using GoatTracker\n--------------------\n\n2.1 Command line options\n------------------------\n\nStart Goattracker V2 by typing GOATTRK2 in the command prompt, followed by the\nsongname to be loaded at startup (optional) and any command line options you\nmay want. For example \"goattrk2 dojo.sng -s1 -e1\" to set 1x-speed mode and SID\nmodel 8580 and to load \"dojo.sng\" on startup.\n\n-Axx Set hard restart ADSR parameter in hex. DEFAULT=0F00\n-Bxx Set sound buffer length in milliseconds DEFAULT=100\n-Cxx Use CatWeasel MK3 PCI SID (0 = off, 1 = on)\n-Dxx Pattern row display (0 = decimal, 1 = hex, 2 = decimal w/dots, 3 = hex w/dots)\n-Exx Set emulated SID model (0 = 6581 1 = 8580) DEFAULT=6581\n-Fxx Set custom SID clock cycles per second (0 = use PAL/NTSC default)\n-Gxx Set pitch of A-4 in Hz (0 = use default frequencytable, close to 440Hz)\n-Hxx Use HardSID (0 = off, 1 = HardSID ID0 2 = HardSID ID1 etc.)\n-Ixx Set reSID interpolation (0 = off, 1 = on, 2 = distortion, 3 = distortion \u0026 on) DEFAULT=off\n-Jxx Set special note names (2 chars for every note in an octave/cycle, e.g. C-DbD-EbE-F-GbG-AbA-BbB-)\n-Kxx Note-entry mode (0 = PROTRACKER 1 = DMC) DEFAULT=PROTRK.\n-Lxx SID memory location in hex. DEFAULT=D400\n-Mxx Set sound mixing rate DEFAULT=44100\n-Oxx Set pulse optimization/skipping (0 = off, 1 = on) DEFAULT=on\n-Qxx Set equal divisions per octave (12 = default, 8.2019143 = Bohlen-Pierce)\n-Rxx Set realtime command optimization/skipping (0 = off, 1 = on) DEFAULT=on\n-Sxx Set speed multiplier (0 for 25Hz, 1 for 1x, 2 for 2x etc.)\n-Txx Set HardSID interactive mode sound buffer length in milliseconds\n     DEFAULT=20, max.buffering=0\n-Uxx Set HardSID playback mode sound buffer length in milliseconds\n     DEFAULT=400, max.buffering=0\n-Vxx Set finevibrato conversion (0 = off, 1 = on) DEFAULT=on\n-Xxx Set window type (0 = window, 1 = fullscreen) DEFAULT=window\n-Yxx Path to a Scala tuning file .scl\n-Zxx Set random reSID write delay in cycles (0 = off) DEFAULT=off\n-N   Use NTSC timing\n-P   Use PAL timing (DEFAULT)\n-W   Write emulated sound output to a file SIDAUDIO.RAW\n-?   Show command line options\n-??  Standalone online help window\n\nTry the command line options if there are any problems. For example, if you\nexperience choppy audio you can increase audio buffering with -B option. SDL\nseems to have trouble with some soundcards under Windows; you might want to\ntry even a 500ms buffer, or tweak the hardware acceleration level of the\nsoundcard (from Control Panel). Also, reSID interpolation will take remarkably\nmore CPU time and could cause the sound and/or editing to get choppy.\n\nFinevibrato mode is on by default. You can change this behaviour with -V\noption. Note that finevibrato mode only affects the conversion of old style\nvibrato parameters to speedtable format.\n\nPulse optimization -O determines if pulsetable execution will be skipped when\ngetting new notes or a new pattern. By default it is on. Be warned that\nturning it off will increase the rastertime requirements of packed/relocated\nsongs greatly!\n\nRealtime command optimization -R determines if portamento, vibrato \u0026 instrument\nvibrato will be skipped on tick 0 of each pattern row. By default it is on, as\nthis is how tracker programs have operated traditionally. Turning it off makes\nthe commands sound same regardless of tempo but will increase rastertime use.\n\nThe hard restart ADSR parameter will especially affect how rapid passages of\nnotes will sound like. 0000 is probably too hard to be useful, except perhaps\nwith gateoff timer value 1. 0F00 (default) is a lot softer, and 0F01 adds also\na little bit of release to the gateoff phase for even softer sound. 000F makes\nthe note start very pronounced.\n\nHard restart parameter with attack at maximum (F) enables the use of an\nalternative playroutine, where waveform is written before ADSR. This can give\nmore reliable note triggering, especially for very fast releases 0 \u0026 1, but \nmay change the characteristics of the note's decay \u0026 release.\n\nThe dotted pattern display modes (-D2 and -D3) display dots in the instrument\nand command column for zero instrument (no change) or zero command (no command.)\n\n2.2 Hardware support\n--------------------\n\nHardSID support is available with the /H option (use first HardSID = -H1,\nsecond = -H2 etc., return to emulated output = -H0). You must have the HardSID\ndrivers installed to use this feature.\n\nCatWeasel MK3 PCI SID support is available with -C option (-C1 to turn on).\n\nTo use the PC64 cable or a userport RS-232 interface, get the HardSID-DLL-Clone\ndrivers from Daniel Illgen's page\nhttp://dawork.synchronus.de/\n\nTo enable better support of multispeeds and cycle-exact timing on HardSID\n(currently Win32 only), download an enhanced HardSID.dll:\n\nFor HardSID ISA/PCI cards -\nhttp://sourceforge.net/project/showfiles.php?group_id=9266\u0026release_id=61843\n\nFor HardSID 4U -\nhttp://www.hardsid.com\n\nCycle-exact HardSID buffer length is separately configurable for interactive\nmode (-T option) \u0026 playback mode (-U option).\n\nHardSID interactive mode:\nLow latency mode for jamming and accurate GUI display. Interactive mode can\nbe activated during song/pattern playback by enabling jamming (space key).\n\nHardSID playback mode:\nHigh stability mode to avoid interruptions caused by other applications/poor\ndrivers/weaker CPU. GUI display is less accurate in this mode. Set the -U\nparameter to zero to achieve the maximum stability (less accurate GUI).\n\n2.3 Keyboard commands\n---------------------\n\nThis program is mainly operated on keyboard. For a list of keyboard commands\npress F12 (online help) in the tracker or see the table below:\n\nNOTE: SHIFT \u0026 CTRL are interchangeable in the commands. You can also use [ ]\nor ( ) instead of \u003c \u003e.\n\n2.3.1 General keys\n------------------\n\nF1        Play from beginning\nF2        Play from current pos.\nF3        Play one pattern from current pos.\nF4        Stop playing \u0026 silence all sounds\nF5        Go to pattern editor\nF6        Go to song editor\nF7        Go to instrument/table editor\nF8        Go to songname editor\nF9        Pack, relocate \u0026 save PRG,SID etc.\nF10       Load song (Pattern/Song/Songname mode) or instrument (Instrument mode)\nF11       Save song (Pattern/Song/Songname mode) or instrument (Instrument mode)\nF12       Online help screen. Press F12 again to toggle context mode\nSHIFT+F1  Play from beginning /w follow play\nSHIFT+F2  Play from current pos. /w follow play\nSHIFT+F3  Play one pattern from current pos. /w follow play\nSHIFT+F4  Mute current channel\nSHIFT+F5  Decrease speed multiplier\nSHIFT+F6  Increase speed multiplier\nSHIFT+F7  Edit hardrestart ADSR parameter\nSHIFT+F8  Switch between 6581 and 8580 SID models\nSHIFT+F10 Merge-load song\nSHIFT+,.  Move song startposition on all channels and restart last playmode\nTAB       Cycle between editing modes (forwards)\nSHIFT+TAB Cycle between editing modes (backwards)\nINS       Insert row (Press INS/DEL on endmark to change pattern/song length)\nDEL       Delete row\nSHIFT+ESC Optimize musicdata, or clear musicdata \u0026 set default pattern length\nESC       Exit program\n\n2.3.2 Pattern edit mode\n-----------------------\n\n- +         Select instrument\n/ *         Select octave\n\u003c \u003e         Select pattern\nBACKQUOTE   Select channel\n0-9 \u0026 A-F   Enter parameters\nSPACE       Switch between jam/editmode\nRETURN      (also CAPSLOCK) Insert keyoff\n            Enter table (when cursor is over a table-utilizing command)\n            Enter instrument (when cursor is over a nonzero instrument number)\nSHIFT+RET.  Insert keyon\n            Convert portamento/vibrato/funktempo old style parameter to a\n            speedtable entry (when cursor is over the command)\n            Go into an empty table entry (when parameter is zero on a\n            table-utilizing command)\nBACKSPACE   Insert rest\nSHIFT+BKSP. Insert rest and clear commands\nSHIFT+SPACE Play from cursor position\nSHIFT+Q     Transpose halfstep up\nSHIFT+A     Transpose halfstep down\nSHIFT+W     Transpose octave up\nSHIFT+S     Transpose octave down\nSHIFT+O     Shrink pattern (divide size by 2)\nSHIFT+P     Expand pattern (multiply size by 2)\nSHIFT+J     Join pattern with next pattern in orderlist\nSHIFT+K     Split pattern from edit position\nSHIFT+H     Calculate \"hifi\" left/right shifted speedtable entry for\n            portamento or vibrato\nSHIFT+I     Invert selection / whole pattern if no selection\nSHIFT+CRSR UP,DOWN Mark pattern\nSHIFT+CRSR LEFT,RIGHT Select pattern\nSHIFT+L     Mark/unmark entire pattern\nSHIFT+M,N   Choose highlighting step size\nSHIFT+X,C,V Cut,copy,paste pattern\nSHIFT+E,R   Copy,paste commands\nSHIFT+Z     Cycle autoadvance-mode\n\nFor pattern joining to work properly, select the pattern you want to join with\nthe next from the orderlist first (by pressing RETURN on it). Both joining and\nsplitting will rearrange pattern numbers (for example if you split pattern 00,\npattern 01 will be created and old patterns 01-xx will be shifted forward in\nthe pattern order)\n\nSHIFT+SPACE will play from the pattern onwards if playback was previously\nstopped, but if it is pressed while in pattern play mode, it will stay in\nthe current pattern.\n\nThere are 2 modes for note entering:\n\n2.3.2.1 Protracker note-entry mode\n----------------------------------\n\nThis is the default or activated with command line option /K0. There are two\nrows of a piano keyboard:\n\n  Lower octave     Higher octave\n S D  G H  K L    2 3  5 6 7  9 0\nZ X CV B NM , .  Q W ER T Y UI O P\n\nOctave (0-7) is selected with / and * keys on the numeric keypad.\n\nIn this mode there are 2 different autoadvance-modes (the mode can be seen from\nthe color of the jam/editmode indicator)\n\nGREEN - Advance when entering notes \u0026 command-databytes\nRED - Do not advance automatically\n\n2.3.2.2 DMC note-entry mode\n---------------------------\n\nActivated with command line option /K1, there is one row of piano keyboard\n\n W E  T Y U  O P\nA S DF G H JK L\n\nand octave of a note (sets default octave at the same time) is changed with\nnumber keys 0-7.\n\nIn this mode there are 3 different autoadvance-modes:\n\nGREEN - Advance when entering notes, octaves or command-databytes\nYELLOW - Advance when entering notes or command-databytes, not octaves\nRED - Do not advance automatically\n\n2.3.2.3 Janko note-entry mode\n----------------------------------\n\nActivated with command line option /K2. There are two rows of a piano keyboard:\n\n  Lower octave       Higher octave\n S D F G H J K L    2 3 4 5 6 7 8 9 0\nZ X C V B N M , .  Q W E R T Y U I O P\n\nOctave (0-7) is selected with / and * keys on the numeric keypad.\n\nIn this mode there are 2 different autoadvance-modes (the mode can be seen from\nthe color of the jam/editmode indicator)\n\nGREEN - Advance when entering notes \u0026 command-databytes\nRED - Do not advance automatically\n\n2.3.3 Song edit mode\n--------------------\n\n\u003c \u003e         Select subtune\n- +         Insert Transpose down/up command (shown as -/+ in the orderlist)\n0-9 \u0026 A-F   Enter pattern numbers\nSPACE       Set start position for F2 key\nBACKSPACE   Set end position for F2 key\nRETURN      Go to pattern\nSHIFT+R     Insert Repeat command (shown as \"R\" in the order-list)\nSHIFT+CRSR LEFT/RIGHT Mark orderlist\nSHIFT+1,2,3 Swap current channel orderlist with channel 1,2,3\nSHIFT+X,C,V Cut,copy,paste channel orderlist\nSHIFT+L     Mark/unmark entire orderlist\nSHIFT+SPACE Set start position on all channels\nSHIFT+RET.  Go to pattern on all channels\n\nSHIFT+SPACE or SHIFT+BACKSPACE set the start/end mark on all channels to\nthe same position. To clear the endmark, press BACKSPACE again on it or\nat/before the startmark.\n\n2.3.4 Instrument edit mode\n--------------------------\n\n\u003c \u003e         Select instrument\n- +         Select instrument\n/ *         Select octave\nF7          Go to table editor\n0-9 \u0026 A-F   Enter parameters\nSPACE       Play test note\nSHIFT+SPACE Silence test note\nRETURN      Go to table position indicated by wave/pulse/filter/vibratopos.\nSHIFT+N     Edit instrument name\nSHIFT+S     Smart paste an instrument\nSHIFT+U     Unlock/lock table scrolling\nSHIFT+X,C,V Cut,copy,paste instrument\nSHIFT+DEL   (also SHIFT+BACKSPACE) Delete instrument \u0026 tabledata\nSHIFT+RET.  Set tablepointer to empty position or convert old style vibrato\n            parameter\n\nThe test note will be played on the channel you last were on in the pattern\neditor. To hear filtering as intended, be sure to play it on a channel that has\nbeen selected for filtering in the filter parameters.\n\nNote that cut,copy,paste instrument do not touch the tabledata, just for the\ncase you need it in another instrument. If you want to completely get rid of\nan instrument + its associated tabledata, press SHIFT+DEL.\n\nIf wave/pulse/filter/vibrato param. is zero and you press RETURN over\nit, you will move to the first free location in the corresponding table. If\nyou press SHIFT+RETURN, also the instrument parameter will be set accordingly.\n\nIf vibrato parameter is nonzero and you press SHIFT+RETURN over it, it will\nbe interpreted as an old style vibrato parameter (left nybble speed, right\nnybble depth) and converted to a speedtable entry.\n\n\"Smart paste\" will convert instrument numbers in all patterns if you \"move\" an\ninstrument by cut/pasting it.\n\n2.3.5 Table edit mode\n---------------------\n\n\u003c \u003e         Select instrument\n- +         Select instrument\n/ *         Select octave\nBACKQUOTE   Select table\nF7          Go to instrument editor\n0-9 \u0026 A-F   Enter parameters\nSPACE       Play test note\nSHIFT+SPACE Silence test note\nRETURN      Go back to wave/pulse/filterpos. parameter\nSHIFT+Q,A   Transpose speedtable portamento speed halfstep up/down\nSHIFT+W,S   Transpose speedtable portamento speed octave up/down,\n            or multiply/divide pulse/filterspeed by 2\nSHIFT+L     Convert \u003climit,speed\u003e modulation step to \u003ctime,speed\u003e\nSHIFT+N     Negate speed parameter (pulse/filtertable) or relative note\n            (wavetable)\nSHIFT+O     Optimize current table (remove unused entries)\nSHIFT+R     Convert note between absolute/relative in wavetable\nSHIFT+U     Unlock/lock table scrolling\n\nIf you need to insert rows in the beginning of an instrument's wave/pulse/\nfiltertable, press SHIFT+INS instead of just INS: this way table pointers\npointing to the table first row will not move.\n\nFor easier programming of negative modulation speeds in pulse/filtertables, you\ncan first enter a positive speed positive value ($00-$7F) and then press\nSHIFT+N to negate it.\n\nConversion between relative and absolute notes will use the basenote C-0 if\noctave is 0, C-1 if octave is 1 and so on.\n\nWhen table scrolling is unlocked, each table maintains its separate view\nposition. To indicate this mode, a \"U\" letter is visible in the bottom right\npart of the screen. By default table scrolling is locked.\n\n2.3.6 Songname edit mode\n------------------------\n\nUse cursor UP/DOWN to move between song, author \u0026 copyright strings, and\nother keys to edit them.\n\n2.4 Mouse control\n-----------------\n\nBy clicking with the left mouse button, you can select the data to edit.\n\nBy dragging with middle or right mouse button, you can mark orderlist/pattern/\ntabledata.\n\nSome values like octave or subtune/pattern numbers can be incremented with\nthe left mouse button and decremented with the right.\n\nBy holding the middle/right mouse button in the status bar, a menu becomes\nactive. Continue to hold and click with left button to select options.\n\nIn the fileselector, confirm loading or entering a directory by double-\nclicking. Doubleclick outside the selector to cancel.\n\n\n3. Song data\n------------\n\n3.1 Orderlist data\n------------------\n\nA song can consist of up to 32 subtunes. For each subtune's each channel, there\nis an orderlist which determines in what order patterns are to be played. In\naddition to pattern numbers, there can be TRANSPOSE \u0026 REPEAT commands and\nfinally there is a RST (RESTART) endmark followed by restart position. The\nmaximum length of an orderlist is 254 pattern numbers/commands + the endmark.\n\nTRANSPOSE is measured in halftones. Transpose up (shown as +X) can be 0-14\nhalftones and transpose down (shown as -X) can be 1-15. Transpose is\nautomatically reset only when starting the song, not when looping.\n\nA REPEAT command (shown as RX) will repeat the pattern following it 1-16 times.\n\"Repeat 16 times\" is displayed as R0.\n\nThere are some rules for orderlist command order:\n\n- If there are both TRANSPOSE and REPEAT commands before a pattern number,\n  TRANSPOSE must come first.\n\n- The last thing before the RST-endmark must be a pattern number. If you need\n  to reset transpose on song repeat, do it in the beginning of the repeat loop.\n\nIn case of wrong order, the editor will halt playback. This tells that the\nresulting packed/relocated song would play incorrectly.\n\n3.2 Pattern data\n----------------\n\nPatterns are single-channel only for flexibility \u0026 low memory use. They contain\nthe actual notes, instrument changes \u0026 sound commands. A pattern can have\nvariable length, up to 128 rows. There can be 208 different patterns in a song.\n\nThe explanation of a pattern row:\n\n Note name\n |\n | Octave\n | |\n | | Instrument number ($01 - $3F, or $00 for no change)\n | | |\n | | |  Command ($0 - $F)\n | | |  |\n | | |  | Databyte\n | | |  | |\n C-1 00 0 00\n\nThe highest note available in a pattern is G#7. To reach the top three notes\n(A-7 to B-7), you can use transpose.\n\nIn place of a normal note, there can also be one of these special \"notes\":\n\n ... Rest\n --- Key off (clear gatebit mask)\n +++ Key on (set gatebit mask)\n\nThe actual state of the gatebit will be the gatebit mask ANDed with data from\nthe wavetable. A key on cannot set the gatebit if it was explicitly cleared\nat the wavetable.\n\nCommands 1XY-4XY and FXY bear some resemblance to Soundtracker/Protracker/\nFasttracker effect commands. However, they are different in some ways, so\nread their descriptions! Note that there is no \"databyte $00 uses the last\ndatabyte\"-action in the commands.\n\nCommand 0XY: Do nothing. Databyte will always be $00.\n\nCommand 1XY: Portamento up. XY is an index to a 16-bit speed value in the\n             speedtable.\n\nCommand 2XY: Portamento down. XY is an index to a 16-bit speed value in the\n             speedtable.\n\nCommand 3XY: Toneportamento. Raise or lower pitch until target note has been\n             reached. XY is an index to a 16-bit speed value in the\n             speedtable, or $00 for \"tie-note\" effect (move pitch instantly to\n             target note)\n\nCommand 4XY: Vibrato. XY is an index to the speed table, where left side\n             determines how long until the direction changes (speed)\n             and right side determines the amount of pitch change on each tick\n             (depth).\n\nCommand 5XY: Set attack/decay register to value XY.\n\nCommand 6XY: Set sustain/release register to value XY.\n\nCommand 7XY: Set waveform register to value XY. If a wavetable is actively\n             changing the channel's waveform at the same time, will be\n             ineffective.\n\nCommand 8XY: Set wavetable pointer. $00 stops wavetable execution.\n\nCommand 9XY: Set pulsetable pointer. $00 stops pulsetable execution.\n\nCommand AXY: Set filtertable pointer. $00 stops filtertable execution.\n\nCommand BXY: Set filter control. X is resonance and Y is channel bitmask.\n             $00 turns filter off and also stops filtertable execution.\n\nCommand CXY: Set filter cutoff to XY. Can be ineffective if the filtertable is\n             active and also changing the cutoff.\n\nCommand DXY: Set mastervolume to Y, if X is $0. If X is not $0, value XY is\n             copied to the timing mark location, which is playeraddress+$3F.\n\nCommand EXY: Funktempo. XY is an index to the speedtable, tempo will alternate\n             between left side value and right side value on subsequent pattern\n             steps. Sets the funktempo active on all channels, but you can use\n             the next command to override this per-channel.\n\nCommand FXY: Set tempo. Values $03-$7F set tempo on all channels, values $83-\n             $FF only on current channel (subtract $80 to get actual tempo).\n             Tempos $00-$01 recall the funktempo values set by EXY command.\n\nMaster volume is by default the maximum ($F), but it is only reset when loading\na new song or clearing songdata in the editor, not every time playback starts.\nIf you change mastervolume, you have to reset it manually in the beginning of\nyour song.\n\nIf the command is not 1XY-4XY, instrument vibrato will be active.\n\nNote that the one-shot commands 5XY-FXY allow the previous 1XY-4XY command or\ninstrument vibrato to continue \"underneath\" them. In section 3.6 (hints \u0026 tips)\nthere is an example of this.\n\n3.3 Instrument data\n-------------------\n\nYou can use up to 63 different instruments in a song. Each instrument is\ndefined by 9 parameters:\n\nAttack/Decay          $0 is fastest attack or decay, $F is slowest\n\nSustain/Release       Sustain level $0 is silent and $F is the loudest. Release\n                      behaves like Attack \u0026 Decay (F slowest).\n\nWavetable Pos         Wavetable startposition. Value $00 stops the wavetable\n                      execution and is not very useful.\n\nPulsetable Pos        Pulsetable startposition. Value $00 will leave pulse\n                      execution untouched.\n\nFiltertable Pos       Filtertable startposition. Value $00 will leave filter\n                      execution untouched. In most cases it makes sense to have\n                      a filter-controlling instrument only on one channel at a\n                      time.\n\nVibrato Param         Instrument vibrato parameter. An index to the speedtable,\n                      see command 4XY.\n\nVibrato Delay         How many ticks until instrument vibrato starts. Value $00\n                      turns instrument vibrato off.\n\nHR/Gate Timer         How many ticks before note start note fetch, gateoff and\n                      hard restart happen. Can be at most tempo-1. So on tempo 4\n                      highest acceptable value is 3. Bitvalue $80 disables hard\n                      restart and bitvalue $40 disables gateoff.\n\n1stFrame Wave         Waveform used on init frame of the note, usually $09 (gate\n                      + testbit). Values $00, $FE and $FF have special meaning:\n                      leave waveform unchanged and additionally set gate off\n                      ($FE), gate on ($FF), or gate unchanged ($00).\n\nIn case of illegal (too high) gateoff timer values, the song playback is\nstopped.\n\nADSR settings are crucial to getting any sound at all. If all of them are zero\njust a very short \"click\" will be heard. Here is a diagram to help you\nvisualize the Attack, Decay, Sustain \u0026 Release phases:\n\n     V      /\\            |\u003c- gatebit reset (key-off) at this point\n     O     /  \\           |\n     L    /    \\__________|\n     U   /                |\\\n     M  /                 | \\\n     E /                  |  \\\nTIME ----------------------------\u003e\n         A   D      S       R\n\nSome ADSR examples:\n\n  A/D 09 Will produce a sound that starts from full volume right away and fades\n  S/R 00 to silence automatically. By increasing the Decay value, the fade will\n         last longer.\n\n  A/D 00 A sound that goes very fast from full volume to sustain level 8.\n  S/R 8A If you increase the Decay value, it will go to the sustain level\n         slower. After key-off, starts fading out with speed A.\n\n  A/D CC A sound that rises slowly to maximum volume, then decays slowly to the\n  S/R AF sustain level A and after key-off, fades out to silence very slowly.\n\nInstrument legato works as following: When HR/Gate Timer parameter has bit $40\nset, no hard restart or gateoff will be performed. When 1st Frame Wave is also\n$00, no 1st frame waveform will be set and gate flag is untouched. However wave/\npulse/filterpointers and ADSR are initialized normally. You can also use this in\nconjunction with command 8XY to set another wavetable pointer for the note.\n\n3.4 Table data\n--------------\n\nTables control the execution of instruments' waveform/arpeggio changes, pulse\nmodulation, and filter modulation. All the tables are controlled by the left\nside bytes, while the right side byte specifies additional parameters.\n\nNote that you should never jump directly onto a table jump command (FF) either\nwith instrument parameters or pattern commands 8XY, 9XY, AXY. Otherwise,\nresults are undefined.\n\n3.4.1 Wavetable\n---------------\n\nWavetable left side:   00    Leave waveform unchanged\n                       01-0F Delay this step by 1-15 frames\n                       10-DF Waveform values\n                       E0-EF Inaudible waveform values $00-$0F\n                       F0-FE Execute command 0XY-EXY. Right side is parameter.\n                       FF    Jump. Right side tells position ($00 = stop)\n\nWavetable right side:  00-5F Relative notes\n                       60-7F Negative relative notes (lower pitch)\n                       80    Keep frequency unchanged\n                       81-DF Absolute notes C#0 - B-7\n\nShort explanation of waveform bitvalues:\n01 = Gatebit. When on, initiates attack/decay/sustain phase. When off,\n     initiates the release phase.\n02 = Synchronize. Creates weird effects using output of another channel\n04 = Ring modulation. Creates weird effects using output of another channel.\n     Most effective with the triangle waveform.\n08 = Testbit. Silences sound and resets the oscillator.\n10 = Triangle waveform.\n20 = Sawtooth waveform.\n40 = Pulse waveform.\n80 = Noise waveform.\n\nAll waveforms except noise can be combined (for example triangle+pulse), but\nthe effect will be different on 6581 and 8580 SID chips, so use caution.\n\nThe way how the channels work with synchronize/ringmod:\n- When used on channel 1, channel 3's output modulates the sound.\n- When used on channel 2, channel 1's output modulates the sound.\n- When used on channel 3, channel 2's output modulates the sound.\n\nWavetable delay or no wavechange should not be used in the first step of\ninstrument wavetable. Otherwise, missing notes may be caused. On the other\nhand, if you use 8XY command to jump into a wavetable program, those are\nallowed.\n\nUsing wavetable delay or a wavetable step with no frequency change allows\nrealtime commands \u0026 instrument vibrato to be executed together with wave-\ntable. Be warned that this has the potential for large rastertime usage!\n\nYou can execute pattern commands from the wavetable. Right side\nis the command parameter. Note that commands 0XY (do nothing), 8XY (set\nwavetable pointer) and EXY (funktempo) are illegal and should not be used.\nWhen executing a command, no wave/note will be changed on the same frame.\n\nSome examples of wave tables (all examples start on table step 1)\n\n  01: 21 00 Sawtooth waveform on note's original pitch.\n  02: FF 00\n\n  01: 41 00 A flute sound with pulse on the first tick and triangle on all\n  02: 11 00 the rest.\n  03: FF 00\n\n  01: 41 01 A \"koto\" sound that is one halfstep higher on the first tick and\n  02: 40 00 on original pitch the next. Gatebit is also cleared on the second\n  03: FF 00 tick.\n\n  01: 81 D0 A snaredrum sound, using all absolute notes so it does not depend\n  02: 41 AA on which note it's played. Use pulsewidth 800 for best result.\n  03: 41 A4\n  04: 80 D4\n  05: 80 D1\n  06: FF 00\n\n  01: 81 DF A pulse sound on original pitch, preceded with a short noise (like\n  02: 41 00 a hi-hat or something) that has always an absolute pitch of B-7.\n  03: FF 00\n\n  01: 41 00 A 4-note looping arpeggio sound with pulse waveform. Note that\n  02: 00 04 waveform does not change in the looping part.\n  03: 00 07\n  04: 00 0C\n  05: 00 00\n  06: FF 02\n\n  01: 21 00 A delayed minor chord arpeggio with sawtooth waveform. Each step\n  02: 02 03 takes 3 ticks.\n  03: 02 07\n  04: 02 00\n  05: FF 02\n\n  01: 41 00 Use pulse first, but then switch between pulse \u0026 triangle every 5\n  02: 03 80 ticks while frequency remains unchanged (allowing for vibrato \u0026\n  03: 11 80 slides).\n  04: 03 80\n  05: 41 80\n  06: FF 02\n\n  01: 81 CF Short noise in the beginning, sawtooth, after a short delay change\n  02: 21 00 sustain/release (via pattern command 6XY) to $2A.\n  03: 08 00\n  04: F6 2A\n  05: FF 00\n\n\n3.4.2 Pulsetable\n----------------\n\nPulsetable left side:  01-7F Pulse modulation step. Left side indicates time\n                             and right side the speed (signed 8-bit value).\n                       8X-FX Set pulse width. X is the high 4 bits, right\n                             side tells the 8 low bits.\n                       FF    Jump. Right side tells position ($00 = stop)\n\nSome examples of pulse tables (all examples start on table step 1)\n\n  01: 88 00 Set pulse value $800 (middle)\n  02: FF 00 Stop pulse execution\n\n  01: 80 10 Set pulse value $010 (very thin)\n  02: 20 40 For 32 ticks, increase pulse with speed $0040 (64)\n  03: 40 E0 For 64 ticks, decrease pulse with speed $FFE0 (-32)\n  04: 40 20 For 64 ticks, increase pulse with speed $0020 (32)\n  05: FF 03 Jump back to step 03 for a nice loop\n\n3.4.3 Filtertable\n-----------------\n\nFiltertable left side: 00    Set cutoff, indicated by right side\n                       01-7F Filter modulation step. Left side indicates time\n                             and right side the speed (signed 8-bit value)\n                       80-F0 Set filter parameters. Left side high nybble\n                             tells the passband ($90 = lowpass, $A0 = bandpass\n                             etc.) and right side tells resonance/channel\n                             bitmask, as in command BXY.\n                       FF    Jump. Right side tells position ($00 = stop)\n\nIf \"Set filter parameters\" is followed by \"Set cutoff\" directly below, both\nwill be executed on the same frame.\n\nSome examples of filter tables (all examples start on table step 1)\n\n  01: 90 F1 Set lowpass, resonance F, channel bitmask 1 (filter channel 1 only)\n  02: 00 40 Set cutoff to $40\n  03: FF 00 Stop filter execution\n\n  01: 80 00 No passband selected, resonance 0, bitmask 0 (no filtered channels)\n  02: FF 00 Stop filter execution\n\n  01: A0 87 Set bandpass, resonance 8, channel bitmask 7 (filter all channels)\n  02: 00 00 Set cutoff to $00\n  03: 7F 01 Increase cutoff with speed $01 for 127 ticks\n  04: 7F 01 Continue cutoff increase\n  05: 7F FF Then decrease back to starting position (speed $FF = -1)...\n  06: 7F FF\n  07: FF 03 ...and loop back to step 03\n\n  01: C0 F2 Set highpass, resonance F, channel bitmask 2 (filter channel 2)\n  02: 00 F0 Set cutoff to $F0\n  03: 90 F2 On the next frame, change to lowpass...\n  04: 00 50 ...and set cutoff $50\n  05: FF 00 Stop filter execution\n\nNote that the second example could also be achieved simply with pattern command\nB00 (set filter control, and stop filter execution, because parameter was $00)\n\n3.4.4 Speedtable\n----------------\n\nThe speedtable is shared by vibrato, portamento and funktempo. No jump commands\nexist.\n\nFor vibrato:          XX YY Left side tells how long until vibrato direction\n                            changes (speed), right side is the value added to\n                            pitch each tick (depth).\n\nFor portamento:       XX YY A 16-bit value added to pitch each tick. Left side\n                            is the MSB and the right side the LSB.\n\nFor funktempo:        XX YY Two 8-bit tempo values that are alternated on each\n                            pattern row, starting from the left side.\n\nFor both vibrato and portamento, if XX has the high bit ($80) set, note \nindependent vibrato depth / portamento speed calculation is enabled, and YY\nspecifies the divisor (higher value -\u003e lower result and more rastertime taken).\n\nVibrato examples:\n\n  01: 03 40 Vibrato with speed $03 and depth $40. Corresponds to old vibrato\n            parameter $34\n  01: 05 04 Speed $05 and depth $04. Slow shallow vibrato, suitable for bass\n            notes. Not possible to achieve with old parameters.\n  01: 83 04 Speed $03, note-independent depth enabled, depth divisor 4 right-\n            shifts (division by 16).\n\nPortamento examples:\n\n  01: 00 20 Portamento with speed $0020, corresponds to old parameter $08\n            (4 * $08 = $0020).\n  01: 01 00 Portamento with speed $0100, corresponds to old parameter $40\n            (4 * $40 = $0100).\n  01: 4F FF Portamento with speed $4fff, loops the pitch highbyte very fast\n            so that a SEUCK-like \"space\" effect is heard. Not possible to\n            achieve with old parameters.\n  01: 80 01 Note-independent speed enabled, speed divisor 1 rightshift\n            (division by 2).\n\nFunktempo examples:\n\n  01: 09 06 Play tempo $09 on even pattern steps and $06 on odd steps,\n            corresponds to old parameter $96.\n\n  01: 24 18 The same funktempo adjusted for 4x-multispeed. Not possible to\n            achieve with old parameters.\n\nNote that you can enter old style vibrato parameters, portamento speeds and\nfunktempo to patterns \u0026 instruments, and when cursor is over the parameter,\npress SHIFT+RETURN to create a new speedtable entry corresponding to that\nparameter. The parameter will now be overwritten by a speedtable pointer.\n\n\n3.5 Playback details\n--------------------\n\nEach pattern row is divided into as many 50Hz/60Hz \"ticks\" as the tempo\nindicates. Some ticks are reserved for special actions, and to conserve raster-\ntime, certain realtime effects/commands (pulse, vibrato, portamento) are\nskipped at the same time. Let's assume a tempo of 6 and gateoff timer value 2\nand look at what happens on each tick:\n\nTick    Actions\n0       - Initialization of new notes (no audible sound yet)\n        - Orderlist advance if necessary\n        - Pulsetable execution only if no orderlist advance\n        - Wavetable execution\n        - \"One-shot\" commands 5XY-FXY\n\n1       - New notes become audible\n        - Pulsetable execution\n        - Wavetable or realtime pattern commands 1XY-4XY\n\n2,3     - Pulsetable execution\n        - Wavetable or realtime pattern commands 1XY-4XY\n\n4       - New notes fetched from the pattern\n        - Gateoff and hard restart for new notes\n          (2 ticks before first frame, as gateoff timer indicates)\n        - No pulsetable execution\n        - Wavetable or realtime pattern commands 1XY-4XY\n\n5       - Pulsetable execution\n        - Wavetable or realtime pattern commands 1XY-4XY\n\nFiltertable is executed on each tick regardless of what the channels are doing.\nWavetable is never skipped, so arpeggios/drumsounds should always play OK.\n\nWith the commandline parameter /O0 (or by clicking the \"PO\" text on the status\nbar) you can disable pulse skipping. This leads to increased rastertime use but\ncan be good for example with tempo 3 tunes.\n\nLikewise, with the commandline parameter /R0 (or by clicking the \"RO\" text on\nthe status bar) you can disable realtime pattern command skipping on tick 0.\n\n3.6 Miscellaneous tips\n----------------------\n\n- Patterns will take less memory the less there are command changes. When the\n  song is packed/relocated, for example a long vibrato or portamento command\n  needs to be stored only once as long as the parameter stays the same on\n  subsequent pattern rows.\n\n- Using instrument vibrato can make 4XY commands unnecessary and save even\n  more memory. Use realtime calculated note-independent speed (see speedtable\n  section) if you want the vibrato to have the same magnitude regardless of \n  the note.\n\n- In the instrument parameters, there is no option to stop pulse execution\n  directly. So if you have for example a sawtooth instrument, there might be\n  an \"unnecessary\" pulsemodulation going on underneath and wasting rastertime.\n  There are two ways you can stop this:\n  1) Make a short pulseprogram like this and use it in the instrument:\n     01: 80 00 Set pulse $000\n     02: FF 00 Stop pulse execution\n  2) Use pattern command 900 to stop pulse execution\n\n- If you have a realtime command (vibrato/portamento), you can put \"one-shot\"\n  commands 5XY-FXY inbetween and the realtime command will be unaffected. An\n  example:\n\n  C-4 01000\n  --- 00401 Begin vibrato with speedtable index $01\n  --- 00401\n  --- 00401\n  --- 0065A Set sustain/release to $5A. Vibrato executes also on this step!\n  --- 00401 Continue vibrato normally\n  --- 00401\n\n  However, the vibrato would stop immediately if command 0 was encountered.\n\n- Normally tempo 3 is the fastest you can use. However, by using the funktempo\n  command you can get tempo 2. To do this, create a following speedtable entry:\n  02 02, and point your funktempo command to it. You also need to use gateoff\n  timer 1 in all instruments and disable the pulse-optimization skipping.\n\n- For very optimized songdata \u0026 player you can refrain from using any pattern\n  commands and rely on the instruments' step-programming. Even in this case, you\n  can set song startup default tempo with the Attack/Decay parameter of the last\n  instrument (63), if you otherwise leave this instrument unused.\n\n3.6.1 Limit-based modulation steps\n----------------------------------\n\nYou can enter pulse/filter modulation steps in limit-based format, and convert\nthem to time-based with SHIFT+L. For example, you could enter the following in\nthe pulsetable:\n\n  01: 84 00 Set initial pulse to $400\n  02: C0 10 Modulate pulse to $C00 with speed $0010\n  03: 40 10 Modulate pulse back to $400 with speed $0010\n\nNow position the cursor on step 02 and press SHIFT+L twice, to convert both of\nthe modulation steps to usual time-based steps. If necessary, the steps will\nbe expanded to several (if the resulting time parameter is over $7F.)\n\nRemember that the player only understands time-based steps and you always have\nto convert limit-based steps before they play correctly!\n\n3.6.2 Precalculated note-independent \"hifi player\" portamento/vibrato\n---------------------------------------------------------------------\n\nFrom v2.62 onwards, GoatTracker actually supports realtime calculated note \nindependent portamento and vibrato speeds, see speedtable section for this. \nHowever, this makes the player bigger and much slower. You can still also use \nthe old method of manually precalculating needed note-independent speeds with \nthe SHIFT+H function, which this section is about.\n\nThe idea is to take the frequency difference between 2 adjacent notes in\nthe frequency table and manipulate it by bit shifting left (multiply) or\nright (divide).\n\nTo use, you need a portamento or vibrato command in the pattern, and the note\nyou wish to base the calculation on on the current pattern step or before it\n(before it only for toneportamento) The amount of shift is determined by the\ncommand parameter. A number in the left nybble means shift left and right\nnybble right shift. When you press Shift+H while the cursor is on the command,\na speedtable entry is created, and the parameter is replaced with a speedtable\nindex.\n\nSome examples:\n\n  C-3 00110 Take the frequency difference between C-3 \u0026 C#3 and shift it left\n            1 times (multiply by 2.)\n\n  E-4 00000\n  ... 00000\n  G-4 00302 Take the frequency difference between E-4 \u0026 F-4 and shift it right\n            2 times (divide by 4.)\n\n3.7 Multispeed tips\n-------------------\n\n- When making multispeed songs, remember to multiply your tempos and also the\n  gateoff timer values! For example, gateoff timer is normally 2, but in a 2X-\n  speed tune the same gateoff length would be achieved with value 4.\n\n- If you want to keep vibrato the same compared to 1X-speed, you must multiply\n  vibrato speed by the speed multiplier, and divide vibrato depth by the\n  multiplier. Remember also to divide portamento and pulse/filter modulation\n  speeds as necessary.\n\n- When importing a v1.xx multispeed song, you also need to multiply the\n  gateoff timers.\n\n- In the instruments, using Attack 0 might result in a very silent first row of\n  the wavetable. You could try increasing the attack, or adding one or more\n  rows of E9 00 (testbit+gate) to the beginning of the wavetable.\n\n\n4. Using the included utilities\n-------------------------------\n\n4.1 INS2SND2.EXE\n----------------\n\nINS2SND2.EXE converts GoatTracker v1.xx or v2 instruments (.INS-files) into\nsound effects, outputting the data as source code or binary.\n\nUsage: INS2SND \u003cinstrumentfile\u003e \u003csourcecodefile\u003e \u003coptions\u003e\nOptions:\n-b output in binary\n-c output in CovertScript format (deprecated)\n\nDefault output is C64 assembler (DASM) style source code\n\nLook at section 6.3 or run the program without parameters to see the\nlimitations of the sound effect system.\n\n4.2 SNGSPLI2.EXE\n----------------\n\nSNGSPLI2.EXE splits the patterns of a GoatTracker v2 song into smaller pieces\nfor memory use optimization. It is comfortable to compose with large patterns\nbut usually more efficient memory-wise to use small patterns. Remember! Always\nkeep the original song because a pattern-splitted song is much harder to edit\nfurther.\n\nUsage: SNGSPLI2 \u003csource\u003e \u003cdestination\u003e [target len]\n\nFor example, if a pattern is 64 rows long and the target length is 16, it will\nbe split into 4 pieces. A pattern that falls below 2 x target length, will not\nbe split at all.\n\n4.3 MOD2SNG.EXE\n---------------\n\nDedicated exclusively to T.M.R, this program converts the pattern \u0026 orderlist\ndata of 4-channel, 31-instrument MOD-files into GoatTracker .SNG files. You\nmust choose one channel to leave out, and obviously instruments are not\nconverted, except for their names. You can also specify a transpose in\nhalfsteps.\n\nUsage: MOD2SNG \u003cmod\u003e \u003csng\u003e [channel] [transpose]\n       [channel] is the channel to leave out (1-4), default 4\n       [transpose] is the halfstep transpose added to notes, default 0\n\n4.4 GT2RELOC.EXE\n----------------\n\nThis is a standalone version of the packer/relocator. It converts .sng files\ninto .bin, .prg or .sid depending on outfiles extension.\n\nUsage: GT2RELOC \u003csongname\u003e \u003coutfile\u003e [options]\n\nOptions:\n-Axx Set ADSR parameter for hardrestart in hex. DEFAULT=0F00\n-Bx  enable/disable buffered SID writes. DEFAULT=disabled\n-Cx  enable/disable zeropage ghost registers. DEFAULT=disabled\n-Dx  enable/disable sound effect support. DEFAULT=disabled\n-Ex  enable/disable volume change support. DEFAULT=disabled\n-Fxx Set custom SID clock cycles per second (0 = use PAL/NTSC default)\n-Gxx Set pitch of A-4 in Hz (0 = use default frequencytable, close to 440Hz)\n-Hx  enable/disable storing of author info. DEFAULT=disabled\n-Ix  enable/disable optimizations. DEFAULT=enabled\n-Jx  enable/disable full buffering. DEFAULT=disabled\n-Lxx SID memory location in hex. DEFAULT=D400\n-N   Use NTSC timing\n-Oxx Set pulseoptimization/skipping (0 = off, 1 = on) DEFAULT=on\n-P   Use PAL timing (DEFAULT)\n-Rxx Set realtime-effect optimization/skipping (0 = off, 1 = on) DEFAULT=on\n-Sxx Set speed multiplier (0 for 25Hz, 1 for 1x, 2 for 2x etc.) DEFAULT=1\n-Vxx Set finevibrato conversion (0 = off, 1 = on) DEFAULT=on\n-Wxx player memory location highbyte in hex. DEFAULT=1000\n-Zxx zeropage memory location in hex. DEFAULT=FC\n-?   Show options\n\n\n5. Using the songs outside the editor\n-------------------------------------\n\nPress F9 in the editor to enter the packer/relocator. Choose playroutine\noptions, startaddress, zeropage address (need 2 consecutive locations) and file\nformat (PRG/BIN/SID), then type the filename.\n\nIf you use patterns longer than 64 rows, there is the possibility that\nrelocation fails because of too complex patterns. Each pattern row can be 0-4\nbytes packed, and the total amount of bytes per one pattern may not exceed 256.\n\nIf wave/pulse/filtertables overflow past row 255 without a jump command or there\nare other serious errors, you get a warning screen and have to fix the error.\n\nThe relocator optimizes \u0026 removes when saving:\n- Unused patterns\n- Unused instruments\n- Unused table-entries\n- Selfcontained (ie. no jumps to/from outside) duplicate parts of tables\n- Player code not needed in the playback of the song\n\nLook at /examples/example1.prg - example4.prg to get an idea how much these\nplayroutines take rastertime. No promises!\n\nThe basic functions independent of playroutine options are:\n\nInit music:\n\n        LDA #subtunenumber       ;Starting from 0\n        JSR startaddress\n\nPlay one frame of music:\n\n        JSR startaddress+3\n\n5.1 Playroutine options\n-----------------------\n\nBUFFERED SID-WRITES - Instead of writing each SID value as soon as possible,\nwaits for the end of the channel's execution on each frame and then writes the\nregisters in one go. Improves sound stability but takes more memory \u0026 raster-\ntime.\n\nSOUND EFFECT SUPPORT - Adds a sound effect engine for use in games. Implies\nbuffered writes. To use, call in the following way:\n\n        LDA #\u003ceffect        ;Start address of sound effect data\n        LDY #\u003eeffect\n        LDX #channel        ;0, 7 or 14 for channels 1-3\n        JSR startaddress+6\n\nThe sound effects have a hardcoded priority system based on their start\naddresses. A sound higher up in memory (bigger address) will never be\ninterrupted with a sound lower in memory.\n\nVOLUME CHANGE SUPPORT - Adds a routine in the player's jumptable to change the\nmaster volume level. To use, call in the following way:\n\n        LDA #volume        ;0-15\n        JSR startaddress+6 ;(startaddress+9 with sound effect support)\n\nNote that the master volume command (DXY) also modifies this same location,\nso it will clash if you also change the volume manually.\n\nSTORE AUTHOR-INFO - Writes the \"AUTHOR\" string from songname editor to the\nlocation range (startaddress+$20 - startaddress+$3F). Also enables timing mark\nsupport. A timing mark is a mastervolume command (DXY) with parameter $10-$FF.\nThis parameter will be copied into startaddress+$3F when the command is\nencountered in playback.\n\nUSE ZEROPAGE GHOSTREGS - Instead of writing to the SID, a memory range in the\nzeropage is used for holding the SID register data. This can then be copied\nin the main program to the SID, for example to enable the playroutine \u0026 music\ndata to reside under the I/O area. Implies buffered writes. A reverse copy loop\nshould be used after each call to the playroutine:\n\n        LDX #$18\ncopy:   LDA ghostregs,x\n        STA $D400,x\n        DEX\n        BPL copy\n\nThe copy loop can also be unrolled for more speed.\n\nNote that when you use the alternative hardrestart method \u0026 playroutine (hard-\nrestart attack parameter F) the copy loop should not be in reverse order but\nshould be for each channel: wave, frequency, pulsewidth, and ADSR last.\n\nIf you are using both sound effect support and ghostregisters, there exists\na possibility of sound errors in the case that a sound effect has finished,\nand the same channel starts a new pulse-waveform note without setting an\ninitial pulsewidth value (for example, like in the beginning of Sanxion loader\ntune). This is because the ghostregisters are shared between music \u0026 sound\neffect playback, and the sound effect has already overwritten the previous\npulse width.\n\nDISABLE OPTIMIZATIONS - The relocator removes saved playroutine code based on\nwhat effects \u0026 commands the song uses, resulting in a smaller playroutine\naccordingly. If you encounter anomalies in the sound (such as ADSR bugs caused\nby unpredictable timing variation) you can try disabling the optimizations.\nNormally this is not necessary, but is included just in case.\n\nFULL BUFFERING - in some cases, especially with multispeeds, the \"standard\"\nor per-channel buffering is not enough and will still produce ADSR errors.\nThis enables a functionality similar to the ZP ghost regs, where the previous\nframe's SID data is copied to the SID at the beginning of the play call for\nmaximum stability. Will use more rastertime and imply the same problems with \nsound effect playback as the ZP ghost regs, so use only when necessary.\n\n\n6. File/data formats description\n--------------------------------\n\nThe sections in the files appear in the sequential order in which they are\ndescribed.\n\n6.1 GoatTracker v2 song (.SNG) format\n-------------------------------------\n\n6.1.1 Song header\n-----------------\n\nOffset  Size    Description\n+0      4       Identification string GTS5\n+4      32      Song name, padded with zeros\n+36     32      Author name, padded with zeros\n+68     32      Copyright string, padded with zeros\n+100    byte    Number of subtunes\n\n6.1.2 Song orderlists\n---------------------\n\nThe orderlist structure repeats first for channels 1,2,3 of first subtune,\nthen for channels 1,2,3 of second subtune etc., until all subtunes\nhave been gone thru.\n\nOffset  Size    Description\n+0      byte    Length of this channel's orderlist n, not counting restart pos.\n+1      n+1     The orderlist data:\n                Values $00-$CF are pattern numbers\n                Values $D0-$DF are repeat commands\n                Values $E0-$FE are transpose commands\n                Value $FF is the RST endmark, followed by a byte that indicates\n                the restart position\n\n6.1.3 Instruments\n-----------------\n\nOffset  Size    Description\n+0      byte    Amount of instruments n\n\nThen, this structure repeats n times for each instrument. Instrument 0 (the\nempty instrument) is not stored.\n\nOffset  Size    Description\n+0      byte    Attack/Decay\n+1      byte    Sustain/Release\n+2      byte    Wavepointer\n+3      byte    Pulsepointer\n+4      byte    Filterpointer\n+5      byte    Vibrato param. (speedtable pointer)\n+6      byte    Vibraro delay\n+7      byte    Gateoff timer\n+8      byte    Hard restart/1st frame waveform\n+9      16      Instrument name\n\n6.1.4 Tables\n------------\n\nThis structure repeats for each of the 4 tables (wavetable, pulsetable,\nfiltertable, speedtable).\n\nOffset  Size    Description\n+0      byte    Amount n of rows in the table\n+1      n       Left side of the table\n+1+n    n       Right side of the table\n\n6.1.5 Patterns header\n---------------------\n\nOffset  Size    Description\n+0      byte    Number of patterns n\n\n6.1.6 Patterns\n--------------\n\nRepeat n times, starting from pattern number 0.\n\nOffset  Size    Description\n+0      byte    Length of pattern in rows m\n+1      m*4     Groups of 4 bytes for each row of the pattern:\n                1st byte: Notenumber\n                          Values $60-$BC are the notes C-0 - G#7\n                          Value $BD is rest\n                          Value $BE is keyoff\n                          Value $BF is keyon\n                          Value $FF is pattern end\n                2nd byte: Instrument number ($00-$3F)\n                3rd byte: Command ($00-$0F)\n                4th byte: Command databyte\n\n6.2 GoatTracker v2 instrument (.INS) format\n-------------------------------------------\n\nOffset  Size    Description\n+0      4       Identification string GTI5\n+4      byte    Attack/Decay\n+5      byte    Sustain/Release\n+6      byte    Wavepointer\n+7      byte    Pulsepointer\n+8      byte    Filterpointer\n+9      byte    Vibrato param. (speedtable pointer)\n+10     byte    Vibrato delay\n+11     byte    Gateoff timer\n+12     byte    Hard restart/1st frame waveform\n+13     16      Instrument name\n\nAfter the instrument data, this structure repeats for each of the 4 tables\n(wavetable, pulsetable, filtertable, speedtable).\n\nOffset  Size    Description\n+0      byte    Amount n of rows in the table\n+1      n       Left side of the table\n+1+n    n       Right side of the table\n\nNote that the tables are a partial snapshot of the current song the instrument\nwas saved from, so upon loading they have to be relocated to the current free\ntable locations.\n\n6.3 Sound effect data format\n----------------------------\n\nOffset  Size    Description\n+0      byte    Attack/Decay\n+1      byte    Sustain/Release\n+2      byte    Pulse width. This value has nybbles reversed from what it looks\n                like in the editor so a middle pulse $800 will be stored as $08,\n                and the sound effect routine will put this value to both $D402\n                and $D403 registers.\n+3      ?       Wavetable. Contains note/waveform pairs (different order than\n                in instrument wavetable), from which the waveform can be\n                omitted if unchanged, as the value ranges do not overlap:\n                        Value $00 ends the sound effect\n                        Values $01-$81 are waveforms\n                        Values $82-$DF are absolute notes D-0 - B-7\n                Note that a note cannot be omitted to store only waveform\n                changes!\n\nAs you can see, the sound effect format is very simplistic. When converting an\ninstrument to a sound effect with INS2SND2, following things cause an error\nmessage:\n\n- If the resulting sound effect is more than 128 bytes\n- If the instrument's wavetable contains relative notes, absolute notes C-0 or\n  C#0, or waveforms \u003e 129 ($81)\n\nThe instrument's pulsewidth modulation \u0026 filter settings will be completely\ndiscarded.\n\n\n7. Microtonal tunings\n---------------------\n\nMicrotonal tunings can be applied by setting using the following options:\n\n/J sets special note names\n/Q sets equal division per octave\n/Y sets the path to a Scala file\n\nSetting special note names is important for scales/tunings with a number of\nnotes in an octave/cycle that differs from 12. But it can also be used to show\nnote names with flats instead of sharps.\n\nFor each note, 2 chars have to be given, e.g. C-DbD-EbE-F-GbG-AbA-BbB- for note\nnames that show flats instead of sharps. The number of notes can differ from 12\nand should match the number of notes used in an octave/cycle.\n\nSetting the equal division per octave is an easy way to apply tunings e.g. used\nby Easley Blackwood https://www.youtube.com/watch?v=HbuFPpiJL1o or for the\nBohlen-Pierce tuning (Bohlen-Pierce has 8.2019143 notes per octave and 13 notes\nin a duodecime-cycle, so it also needs special note names).\n\nBy loading a tuning from a Scala file, the /Q setting will not be used, and if\nthe Scala file comes with note names inside, the -Jxx setting will not be used.\nScala files have to follow the rules described in \nhttp://www.huygens-fokker.org/scala/scl_format.html and note names can be\napplied by separating the name from the ratio value using whitespace. Example:\n\n! bohlen-p_et.scl\n!\n13-tone equal division of 3/1. Bohlen-Pierce equal approximation                \n 13\n!\n 146.30423    1-\n 292.60846    2-\n 438.91269    3-\n 585.21692    4-\n 731.52115    5-\n 877.82539    6-\n 1024.12962   7-\n 1170.43385   8-\n 1316.73808   9-\n 1463.04231   A-\n 1609.34654   B-\n 1755.65077   C-\n 3/1          0-\n\n\n8. Recompiling\n--------------\n\nTo recompile for Win32, I still have to port it to Windows...\n\nTo recompile for Linux:\n\n```\nmkdir build\ncd build\ncmake ..\nmake\n```\n\nIn both cases you need the SDL development libraries in addition to the SDL\nruntime, see http://www.libsdl.org.\n\n\n9. Version history\n------------------\n\nv2.0Beta  - Original public release\n\nv2.0      - Fixed crash in DMC-note entry mode.\n          - Fixed v1.xx import pulse conversion, a case where pulse startpos\n            was lower than the pulse low limit was not converted right.\n          - Fixed instrument gatetimer becoming zero (can lead to tempo bugs)\n            when cutting an instrument (SHIFT+X)\n          - Fixed order of SID writes to make editor \u0026 C64 playroutine behave\n            as similarly as possible.\n          - Fixed removal of table-entries (when loading an instrument) in\n            case another instrument uses them too.\n          - Fixed toneportamento (3XY) with wavetable delays.\n          - Fixed funktempo in packed/relocated songs.\n          - Fixed behaviour of + \u0026 - keys while editing instrument name.\n          - Fixed pattern editor transpose functions.\n          - Added SHIFT+DEL to delete an instrument + its tabledata.\n          - Added SHIFT+INS to insert rows on table first row without having to\n            adjust tablepointers afterwards.\n          - Added SHIFT+W,S for octave transpose.\n          - Added SHIFT+1,2,3 to swap orderlists between channels.\n          - Added SHIFT+BACKSPACE to clear a whole pattern row.\n          - Added optimized playroutines, that will be used if all instruments\n            have the same gateoff timer \u0026 1st wave parameters.\n          - Added duplicate check for v1.xx pulse conversion.\n          - Added BETACONV-utility for conversion from beta format.\n          - Added reSID interpolation option /I.\n          - Added hexadecimal pattern row display option /D.\n          - Added SID memory location parameter /L.\n          - reSID interpolation is on by default.\n          - Changed appearance of pattern special notes (rest, keyoff/on)\n          - Increased amount of instruments to 63 and changed song dataformat.\n          - v1.xx import converts arpeggios to instruments as long as there is\n            room.\n          - Vibrato depth changed back to same as in v1.xx.\n          - Pulse modulation speeds are doubled.\n          - Upon startup, songdata erase, or importing v1.xx data, gatetimer\n            will be set to 2 * multiplier as opposed to just 2.\n          - Optimized size \u0026 speed of all playroutines (initialization,\n            checking for new note fetch, pulsetable execution).\n          - Wavetable delay or no-wavechange on first step of instrument is\n            definitely unsupported now! Protection to allow this conflicted\n            with 3XY command.\n\nv2.01     - Added under-IO gamemusic playroutine.\n\nv2.02     - Added RETURN when instrument tableparameter (wave/pulse/filter) is\n            0 to get you to the first free table location. SHIFT+RETURN will\n            additionally also set the instrument tableparameter.\n          - Added \"set mastervolume\"-jump to gamemusic routines.\n          - Improved sound effect handling, when an effect is interrupted by\n            another (less silence between sounds).\n\nv2.03     - Added execution of realtime commands \u0026 instrument vibrato during\n            wavetable delay.\n          - Added wavetable right side value $80 to keep frequency unchanged\n            (as a consequence, the note C-0 will cause the same effect).\n          - Added relocator optimizations: all unnecessary data is stripped\n            when packing/relocating.\n          - Playroutines size-optimized.\n          - Explanation of how different gatetimer values can lead to playback\n            going out of sync (section 3.3).\n          - reSID interpolation is no longer on by default :)\n\nv2.04     - Added a questionable 25Hz mode (/S0)\n          - Execution of commands on wavetable delay is completely reworked\n            and more consistent now.\n          - Note C-0 is usable again.\n\nv2.05     - Added instrument legato feature (Hardres/1stwave parameter $00).\n          - ADSR writes moved farther away from wave writes in the standard\n            playroutine noteinit, lessening possibility of ADSR bugs.\n          - Song initialization and pulsetable execution speed/sizeoptimized.\n\nv2.06     - Packer/relocator tolerates up to 256 bytes long patterns now.\n          - Optimized playroutine sizes.\n\nv2.07     - Fixed transpose reset with F2/F3 song start (should not happen).\n          - Fixed varying tempo on channels with F2/F3 song start.\n          - Added warning screen to packer/relocator if table execution\n            overflows.\n          - Added writing of PAL/NTSC and 6581/8580 flags according to PSID V2\n            NG specification.\n          - -mwindows added to linker options for no displaying of DOS prompt\n            window (in win32 version).\n\nv2.08     - Added finevibrato mode (/V command line option).\n          - Optimized playroutine sizes \u0026 speed.\n\nv2.09     - Fixed max.pattern length in Clear Musicdata operation.\n          - Added Minimal playroutine.\n          - First wave value $80 also acts as a proper legato instrument now.\n          - Optimized playroutine sizes \u0026 speed.\n          - SID chip type \u0026 timing (PAL/NTSC) displayed on top row.\n\nv2.1      - Added SHIFT+N for negating pulse/filter modulation speeds.\n          - Added no-funktempo \u0026 no-octave0 optimizations to playroutines (a\n            total of 8 sub-types for each playroutine).\n          - Maximum speed is 16X now.\n          - Separate song/instrument/packed song directories are remembered\n            during session.\n          - Pathname is displayed in the fileselector.\n          - Filters ** and *.* display all files in the fileselector.\n          - Song entered on commandline will be loaded at startup.\n          - Song filename currently being edited is shown in the titlebar.\n          - Currently edited song filename will be used as default in the\n            \"SAVE SONG\" and \"SAVE MUSIC+PLAYROUTINE\" dialogs.\n          - Instrument name will also be used as instrument filename as default\n            in the \"SAVE INSTRUMENT\" dialog.\n          - UPX used for compression of win32 executables.\n          - Included a short reference of waveform bits (manual only).\n          - Configuration file has clearer structure.\n\nv2.11     - Added SHIFT+S for smart instrument paste (converts instrument\n            numbers in all patterns, after cut/pasting an instrument).\n          - Added SHIFT+L which allows to write \u003climit,speed\u003e pulse/filter\n            modulation steps and then convert them to the proper \u003ctime,speed\u003e\n            format.\n\nv2.12     - Playroutine 1 has buffered SID-writes.\n          - Octave 0 is not disabled in routines with sound FX (no matter what\n            the relocator says...)\n\nv2.13     - Standard playroutine now both in unbuffered and buffered flavors.\n\nv2.15     - Added SHIFT+I for inverting current pattern selection / whole\n            pattern.\n\nv2.16     - Fixed octave selection with / * for laptop keyboards.\n          - Empty patterns referenced in the orderlist will be saved when\n            saving a song.\n          - Save dialog will reappear if writing the song/instrument/executable\n            music failed.\n          - Optimized handling of \"packed rests\" in the playroutines.\n          - Added \u003c \u003e for instrument selection in instrument/table edit modes.\n\nv2.17     - Fixed initialization of instrument vibrato.\n          - Playroutines size-optimized.\n\nv2.18     - Wavetable left side values changed. Delay is now $01-$0F and\n            inaudible waveforms (register values $00-$0F) have been mapped to\n            table values $E0-$EF. Old songs using values $08-$0F have to be\n            manually converted!\n\nv2.2      - Added the speedtable for more precise control of vibrato,\n            portamento and funktempo.\n          - Added SHIFT+O to optimize the speedtable (remove unused entries).\n          - Added SHIFT+R to convert between absolute/relative notes in\n            the wavetable.\n          - Added SHIFT+RETURN in pattern/instrument editor to convert old\n            style portamento, vibrato and funktempo parameters to speedtable\n            entries.\n          - SHIFT+R will paste several effect rows if there is data in pattern\n            copybuffer.\n          - Editing during Follow Play is possible.\n          - Song and instrument format modified for 4 tables. Old 3-table\n            data will be loaded but not saved anymore.\n\nv2.21     - Fixed NTSC CIA timer value for SID files.\n          - Shift+E will copy several effect rows if pattern has been marked.\n\nv2.22     - Shift+N will also negate relative wavetable notes.\n          - When converting oldstyle parameters to speedtable entries with\n            SHIFT+RETURN, the speedtable view will shift to the new entry if\n            one was created.\n\nv2.23     - Fixed SHIFT+INS in wavetable (inserts $E9 $00 now as it should).\n          - Added SHIFT+U to unlock table scrolling.\n          - Added SHIFT+F5/F6 to change speed multiplier.\n\nv2.24     - Added SHIFT+F7 to edit the hardrestart ADSR parameter.\n          - Added SHIFT+F8 to switch between 6581 and 8580 SID models.\n\nv2.25     - Added detail to table overflow error message in relocator.\n          - Added stop of playback if a tablepointer gets pointed directly to a\n            jump (would bug in packed/relocated tune).\n          - Added relocator error message for the above case.\n          - Added relocator error message for illegal song restart position.\n          - Not possible to save erroneous packed/relocated songs anymore\n            (now that there is adequate error location).\n          - Added SHIFT+,. to move song startposition on all channels and\n            restart last playmode.\n\nv2.26     - Fixed relocator complaining of FF parameter in speedtable.\n          - To increase stability, in multispeed mode relocator does not use the\n            \"same gatetimer/1st wave\" optimization.\n          - Changed Shift+O to optimize the currently edited table, not just\n            speedtable.\n          - Added an option to optimize everything with the SHIFT+ESC clear\n            function. This clears unused patterns, instruments and table-entries.\n\nv2.27     - Fixed optimize function with different pattern lengths.\n          - Added marking \u0026 copy/pasting orderlist data like patterns \u0026 tables.\n\nv2.28     - Added sort of mouse control.\n          - Sound reinitialization when changing multiplier or other parameters\n            is now faster.\n\nv2.29Beta - Internal reorganization.\n          - New assembler-based relocator that leaves out unused portions of\n            player code.\n          - Instead of choosing a player version, one can choose combinations\n            of player features.\n          - Relocator does not save selfcontained duplicate parts of tables.\n          - Added keys 0-9 \u0026 A-Z in the fileselector to move to the\n            corresponding part of the filelist (if found).\n          - Added SHIFT+H to calculate left/right shifted \"hifi\" speedtable\n            values, according to the frequency of a note.\n\nv2.3      - Fixed songdata optimize function.\n          - Fixed relocator with no-hardrestart instrument in slot 1.\n          - Fixed relocator handling of effect C (Set cutoff).\n\nv2.31     - Fixed effect copy/paste.\n          - Added possibility to disable pulseskipping with /O command line\n            option. Warning: causes huge rastertime increase.\n          - Tempo 2 is allowed. See the tips section (3.6) for details.\n\nv2.32     - Maximum pattern length increased to 128. Do not complain of\n            \"pattern too complex\" errors :)\n          - Optimized playroutine init in case of only 1 subtune.\n\nv2.33     - Fixed a bug where relocator was checking pattern 208 (illegal).\n          - Optimized playroutine in case there is no keyoff/keyon used.\n          - Optimized playroutine in case there are no pattern effects used.\n          - Optimized playroutine channel variables in case there is no\n            transpose, repeat, wavedelay and pattern effects.\n          - If not using the last instrument (63), you can control song\n            startup default tempo by using its Attack/Decay parameter.\n\nv2.34     - Added relocator optimization for using 1 or 2 channels only. To\n            enable, you must use only channels 1 or 1,2 and not be using sound\n            effect support or zeropage ghostregs.\n          - Turning off buffered writes in relocator options works now even\n            if sound effects or zeropage ghostregs are selected (they will be\n            turned off too).\n\nv2.35     - Auto-creation of speedtable entries will always generate a new\n            entry (except for song loading), duplicate values will be optimized\n            by the relocator.\n          - Pressing SHIFT+RETURN over a speedtable-using pattern command while\n            the parameter is zero, goes to the next empty speedtable entry and\n            sets the command parameter to point to that entry.\n\nv2.4      - Added one bit of accuracy to pulse modulation speed. A new song-\n            format (identifier GTS4) reflects this, old songs will be converted\n            upon loading.\n          - Added possibility to execute pattern commands from the wavetable.\n\nv2.41     - Fixed player code assembly errors when using some pattern commands\n            only from the wavetable.\n          - Fixed player code bug with command B when command A is not used.\n          - Fixed SHIFT+O removing table entries pointed to from wavetable\n            pattern commands.\n\nv2.42     - Fixed frequency table size determination.\n          - Changed behaviour of keyoff in pattern editing changed to use\n            releasenote() like the instrument editor.\n          - Added SHIFT+RETURN when parameter is zero to get you into an empty\n            table entry for 8, 9 and A pattern commands as well.\n          - Added adjustment of table views when changing instrument number\n            in unlocked table scrolling mode.\n          - Added RETURN over nonzero instrument number (in patterns) to go\n            editing that instrument.\n\nv2.43     - Added duplicate pattern detection/removal to song optimize.\n          - Added pattern shrink/expand (SHIFT+O,P).\n          - Added pattern join/split (SHIFT+J,K).\n\nv2.44     - Fixed editor playroutine to not execute tick n commands, when a\n            command has already been executed through the wavetable.\n\nv2.45     - Added possibility to disable realtime pattern command optimization\n            at tick 0 (/Rxx command line option or click the \"RO\" text on the\n            statusbar) for tempo-independent portamento \u0026 vibrato.\n          - To make room on the status bar for the realtime optimization\n            status indicator, finevibrato \u0026 pulse optimization indicators have\n            been shortened to \"FV\" and \"PO\".\n\nv2.46     - Added transpose of speedtable portamento speeds (SHIFT+Q,A,W,S)\n            SHIFT+W,S (octave transpose, multiply/divide by 2) also work in\n            pulse \u0026 filtertable.\n          - When editing the wavetable, RETURN \u0026 SHIFT+RETURN work for wave-\n            table executed commands as in patterns (go to table position\n            pointed by command, create new speedtable entries)\n\nv2.47     - Added experimental random delay to write of reSID registers, in\n            order to make potential ADSR-bugging on C64 audible. The\n            amount of delay in cycles can be adjusted with /Z command line\n            option.\n          - SHIFT+L in pulsetable creates repeated \"set tempo\" commands if\n            speed is greater than 127.\n\nv2.48     - Fixed playroutine to use configurable baseaddress again.\n\nv2.49     - Added /G command line option, guard 1stwave/gatetimer parameters.\n            When this is on (default), only silent waveforms can be entered\n            as firstwave (only thing that makes sense) and editing gatetimer\n            of one instrument affects all of them, as otherwise bugs in\n            playback result easily. Use /G0 to turn off.\n\nv2.5      - Fixed \"optimize everything\" removing the tempo setting in\n            instrument 63.\n          - Fixed default tempo of multispeed tunes in packer/relocator.\n\nv2.51     - Fixed packing of empty patterns when not using any effects.\n          - Fixed differing gatetimer value in instruments causing playback\n            going out of sync.\n          - /G command line option no longer has to keep gatetimer values the\n            same.\n          - Added high bit of gatetimer value to control whether wavetable\n            execution starts right on the note init frame. If used, will cause\n            significant rastertime increase.\n\nv2.52     - SHIFT+ENTER in orderlist view takes the next available pattern\n            if pressed on a repeat or transpose command.\n          - Added SHIFT+SPACE in pattern editor to start playback on a specific\n            pattern row.\n\nv2.53     - Fixed F3 to always play the currently visible patterns.\n          - Added BACKSPACE in the orderlist editor to set playback end position.\n            Only effective when starting playback from position, not beginning.\n\nv2.54     - Fixed SHIFT+F3.\n          - Changed SHIFT+, . to update the pattern view.\n          - Changed SHIFT+SPACE to remain in pattern playback mode, if it was\n            active.\n\nv2.55     - Added BACKSPACE in the fileselector to go to the parent dir.\n\nv2.56     - Song filename cleared on songdata erase.\n          - Added /F to set custom SID clock frequency.\n          - Graphics output routines no longer compare text screen buffer to \n            previous to find out if it should be updated.\n            \nv2.57     - Added alternative hardrestart method \u0026 playroutine that is used when\n            HR attack parameter is at maximum (FF00 or F800 for example) - this \n            can in theory give better reliability.\n            \nv2.58     - Cleanup, removal of a few questionable features:\n            * Gatetimer high bit to start wavetable immediately\n            * Guard 1stwave parameter\n            \nv2.59     - Songformat version update (GTS5/GTI5)\n          - Gateoff timer parameter bits control now hardrestart disable ($80)\n            \u0026 gateoff disable ($40).\n          - 1stFrame Wave can be any from $01-$8F, $00 to leave both waveform\n            \u0026 gateflag unchanged, or $FE / $FF to control gateflag but leave\n            waveform unchanged.\n\nv2.6      - Fixed pattern default length selection display when decrementing\n            from a length of 100 or higher.\n          - Fixed mouse selection of pattern when adjusting an adjacent channel.\n          - Fixed help screen instructions.\n          - Changed resolution to 800x600.\n          - Changed all songname rows to be displayed at the same time.\n          - Changed mouse control to allow pattern column selection even when\n            left mouse button is held down.\n          - Changed speed of PageUp/PageDown scrolling to be faster.\n          - Optimized graphics output.\n          - BME library is no longer needed.\n\nv2.61     - Added the backquote key (top-left on keyboard) to select channel\n            in pattern edit mode, and to select table in table edit mode. Use \n            with SHIFT to go backwards.\n          - Added SHIFT+channel number to mute channels in pattern edit mode.\n          \nv2.62     - Added possibility for realtime calculated note independent (hifi)\n            portamento \u0026 vibrato. Warning: has potential for huge rastertime\n            increase.\n            \nv2.63     - Fixed note independent portamento \u0026 vibrato to use the last note\n            set in wavetable for calculations, instead of the last note in\n            patterndata.\n            \nv2.64     - Fixed paste in table (SHIFT+V) working also without SHIFT pressed.\n\nv2.65     - Fixed raw keycodes over 511 interpreted as some other keys in the\n            0-511 range.\n\nv2.66Beta - Initial cycle-exact HardSID support (Win32 only)\n          - Permit running without sound.\n          \nv2.67     - Configurable cycle-exact HardSID buffer length (separate for inter-\n            active and playback mode, see /T and /U command line options)  \n            \nv2.68     - Fixed set tempo -command overwriting frequencytable in 1 or 2\n            channel modes.\n          - Fixed sound uninit crash with multicore processors (?)\n          - SID register write order tweaked to resemble JCH NewPlayer 21.\n          - Unbuffered playroutine optimized \u0026 modified to resemble buffered\n            mode timing more.\n          - New reSID-fp engine (with distortion \u0026 nonlinearity) from Antti\n            Lankila integrated. Activated with /I command line option parameters\n            2 \u0026 3.\n          - Command quick reference by Simon Bennett included.\n          \nv2.69     - Fixed click bug in reSID audio output.\n          - Newest reSID-fp code integrated.\n          - reSID-fp filter parameters adjustable from the configuration file.\n\nv2.70     - Hotfix for the new HardSID UPlay/Uno devices from T�li S�ndor.\n          - Fixed possible crash on some versions of the HardSID dll.\n\nv2.71     - Added keycode fix patch from Valerio Cannone.\n          - Added fullscreen switch patch from Raine M. Ekman (see /X option)\n          - Added context mode to online help patch from Raine M. Ekman.\n          - Added /G command line option for setting A-4 pitch.\n\nv2.72     - Fixed incorrect transpose range determination in the relocator.\n          - Fixed crash in jam mode whan an illegal pattern command was executed\n            from the wavetable.\n            \nv2.73     - Reverted to old playroutine timing.\n          - Added full buffering option (similar to ZP ghostregs) which will\n            buffer everything to ghost regs and dump the previous frame to the\n            SID at the beginning of the play call.\n          - Merge song functionality (SHIFT+F10.)\n          - Help text is written to console on non-Win32 platforms.\n          - gt2reloc utility by Groepaz.\n          \nv2.74     - Fixed track length not properly updated when swapping tracks.\n          - Fixed track length not properly updated if merge-load fails.\n          - Added dotted pattern display modes (-D2 and -D3.)\n\nv2.75     - Added /Q command line option for setting equal divisions per octave\n            that differ from 12.\n          - Added /J command line option for setting different note names.\n          - Added /Y command line option for setting a path to a Scala tuning\n            file.\n          - Added small color changes to the pattern table for better\n            readability.\n          - Added isomorphic key layout.\n          - Removed the BETACONV utility, as it references a very old songformat\n            and also saved in another old format.\n          - Added /w command line option for setting 4 different window sizes.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftildearrow%2Fbovidtrk","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Ftildearrow%2Fbovidtrk","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftildearrow%2Fbovidtrk/lists"}