HoustonTracker 2 Manual
The latest version of this document can be found online at
HoustonTracker 2 is a software sequencer that enables you to create music on Texas Instruments graphing calculators. It uses the machines' communication
output multi-channel 1-bit music. Its interface is inspired by popular trackers such as LSDJ, Famitracker, and Milkytracker.
HT2 supports several models of the Z80-based line of TI calculators. It is mainly targetted at older, obsolete models like the TI-82, but also works on newer
machines up to and including the TI-84 Plus SE. For a complete list of supported models, see section 1.3. Supported Calculators
• 3 tone channels
• 1 non-interrupting drum channel
• up to 128 note patterns
• up to 64 drum/fx patterns
• sequence length up to 255 pattern rows
• 16-bit frequency precision
• 8-bit speed precision, can be configured per step
• various effects, including:
- L/C/R stereo hard-panning for tone and drum channels
- 8bit duty cycle control
- duty cycle sweep
• 2 user definable samples
• up to 8 savestates
• edit during playback
The following table gives an overview over which TI calculator models are supported by HoustonTracker 2. If your calculator isn't listed in the table,
chances are HT2 doesn't support it.
|TI-73, 73 Explorer
|TI-82 Stats, Stats.fr
|TI-83 (all versions)
|TI-83 Plus (all versions)
|TI-84 Plus/Plus SE
|TI-84 Plus CSE/CE
|TI-89, 92, 92+, V200
Models marked as "not supported" have differences in architecture that would require a major rewrite of HT2. There are no plans to support these models
in the near future, especially not the 84+ Color models.
HoustonTracker 2 is free, open source software. It is released under a "revised" BSD-License. This means you're basically free to use, modify, and
redistribute this software both in binary
as well as source form, as long as you don't pretend that I endorse what you're doing, or try to hold me responsible for any damage done.
The full license terms are as follows:
Copyright (c) 2015, utz^irrlicht project
All rights reserved.
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met:
* Redistributions of source code must retain the above copyright
notice, this list of conditions and the following disclaimer.
* Redistributions in binary form must reproduce the above copyright
notice, this list of conditions and the following disclaimer in the
documentation and/or other materials provided with the distribution.
* Neither the name of IRRLICHT PROJECT nor the
names of its contributors may be used to endorse or promote products
derived from this software without specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR ANY
DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
The following section outlines some basic terms and conventions used in HoustonTracker 2, and in this documentation.
In this document, keypresses are denoted in bold font, surrounded by square brackets. All keypresses in HT2 are sequential, meaning you
never need to press more than one key at the same time.
For example, [ALPHA], [GRAPH], [ENTER] means you should first press the ALPHA key, then the GRAPH key, and finally the ENTER key.
Hexadecimal numbers in this document are prefixed with 0x. So 0x20 = $20 = 20h = 32 decimal.
All numbers in the HoustonTracker 2 user interface itself are hexadecimal, therefore no prefix is used there.
|bit||This humble binary digit is at the core of HT2's inner workings. It can take a value of 0 (off) or 1 (on).|
|byte||Not related to chewing by any means, the byte is an 8-bit number. It can take any value from 0x00 (decimal 0) to 0xFF (255).|
|duty cycle||The relative amount of time each of the two half-periods of a square wave will consume.|
|hi-byte||The left two hexadecimal digits, aka most significant byte of a word.|
|lo-byte||The right two hexadecimal digits, aka least significant byte of a word.|
|nibble||A single hexadecimal digit. It consists of 4 bits, and can therefore take a value from 0x0 to 0xF (15).|
|pattern||A list of events that makes up a part of a tune. These can be notes, drum triggers, or effect commands. All patterns in HT2 are
16 steps long.|
|pitch||The (perceived) frequency of a note.|
|shell||A program that facilitates the execution of machine language programs on your TI calculator, among other things.
You'll need to install one in order to run HT2.|
|song sequence||A matrix containing the order of patterns. Think of it as a storyboard, or the song's masterplan.|
|word||A 16-bit value. Equivalent to two bytes, or four hexadecimal digits.|
- a TI graphing calculator (see 1.3. Supported Calculators
- a suitable PC<->Calc link cable, e.g.
- a 2.5mm (micro-)jack adapter/cable
|You can use a cheap calc-to-calc link cable to make your own 2.5mm adapter.
|The plastic base of many adapters is too thick to fit into
TI's extra narrow socket. If that's the case, you need to carefully scrape off some plastic from the base of the jack until it fits.
In addition to the HT2 executable, you will also need to obtain:
- TI linking software for exchanging data between your PC and your calc (recommended: TiLP
- a so-called "shell" for your calculator. The following table lists the recommended shells for each model. Other shells may work, but haven't been tested.
|HT2 is not compatible with MirageOS.
|If you don't own a TI calc, you can run HT2 on an emulator. The beta version of tilem2 is recommended.
A Win32 installer can be found here, *nix users can obtain the
development version via svn checkout https://tilem.svn.sourceforge.net/svnroot/tilem/trunk tilem. You need to have TiLP installed in any case.
|After installing HoustonTracker 2, your calculator will not be able to perform most of its regular tasks until HT2 is
Do not install HT2 if you need to use your calculator for regular work, such as in school or university.
The following instructions assume that you have TiLP installed on your computer. If you are using another linking program, then you probably
know what to do...
Installing on TI82/82 Parcus
Step 0: If you aren't sure which TI82 version you have, press [MODE], [ALPHA], [LN] to check the ROM version. If it says "19.006", you
have a 82 Parcus, else you have a regular 82. Afterwards, press any key except Enter.
Step 1: Reset your calculator by pressing [2nd], [+], .
Step 2: Switch off your calculator, and connect it to your computer with a link cable.
Step 3: Switch the calculator back on.
Step 4: On your computer, open TiLP. Make sure your calculator and link cable settings are correct - if not, press Ctrl+D to reconfigure.
Step 5: Put your calculator into transmission mode by pressing [2nd], [X,T,Θ], [▸], [ENTER].
Step 6: In Tilp, go to "File"->"Restore", and select CRASH.82B (regular TI82) resp. CRASH19006.82b (82 Parcus). Doing so will prompt for confirmation on both TiLP and your calc.
Step 7: Assuming all went good, you can now put your calc in transmission mode again, and send ("File"->"Send Files") ht2.82p (regular) resp. ht2p.82p (Parcus).
|If you intend to use a SilverLink cable in conjunction with a TI-82, do not install the official TI connectivity
software on your computer. If you currently have
TI Connect installed, or had it installed in the past, make sure you fully remove all of its components, especially the USB driver that came with it.
Installing on TI83/TI82Stats
Step 1: Reset your calculator by pressing [2nd], [+], .
Step 2: Switch off your calculator, and connect it to your computer with a link cable.
Step 3: Switch the calculator back on.
Step 4: On your computer, open TiLP. Make sure your calculator and link cable settings are correct - if not, press Ctrl+D to reconfigure.
Step 5: In Tilp, go to "File"->"Send Files", and select ION.83G from the Ion package.
Step 6: After Ion has been received by the calculator, press [PRGM], select "ION", and press [ENTER].
Step 7: Press [2nd], [+], , . Select ION and press [ENTER] to delete it. Likewise, delete IONZ.
Step 8: Assuming all went good, you can now send ("File"->"Send Files") ht2.83p.
Installing on TI83 Plus/TI84 Plus
Step 1: Reset your calculator by pressing [2nd]
Step 2: Switch off your calculator, and connect it to your computer with a link cable. This will switch your calc back on.
Step 3: On your computer, open TiLP. Make sure your calculator and link cable settings are correct - if not, press Ctrl+D to reconfigure.
Step 4: In Tilp, go to "File"->"Send Files", and select DoorsCS7.8xk from the DoorsCS package.
Step 5: Assuming all went good, you can now send ("File"->"Send Files") ht2.8xp.
|If you don't have enough free memory because you have a large number of archived apps, you can install
For faster access, you can use TiLP in GUI-less mode. To do so, open a command prompt (cmd.exe on Win or any shell on *nix),
and enter the following command:
tilp [calc-model] [cable-model] [filename]
So, to send HT2 to your TI83 Plus via a SilverLink cable, you would type
tilp ti83+ SilverLink ht2.8xp
Once you've successfully installed HT2, running it is very simple.
Step 1: Press [PRGM]
(TI82/83), resp. [APPS]
(TI83 Plus/84 Plus).
Step 2: Select "CRASH" (TI82), "A" (TI83), resp. "DoorsCS" (Plus models), and press [ENTER]
Step 3: Make sure HoustonTracker 2 is highlighted, and press [ENTER]
again. Unless an error occured, HT2 is now running.
Step 4: Now plug in your audio cable or headphones.
After exiting HT2 with keys [ALPHA],[ON]
, you will be returned to the Shell. Press [MODE]
(CrASH, Ion) resp. [CLEAR]
(DoorsCS) to exit
|On TI83/8x Plus, booting and shutting down HT2 will take up to 10 seconds.
The following section will explain how to get started with HoustonTracker 2 in 10 easy steps.
If you can't be bothered to read the whole manual, and want to get started with HT2 in 5 minutes, then this section is for you.
Start Houston Tracker, and plug in your audio/headphone cable. Check the previous sections
if you can't figure out
how to do that.
|Always plug in headphones after you've started HT2.
Activate AutoInc mode by pressing [MODE]
. Now, let's enter some patterns into the song sequence. To do so, press the following keys: ,,,,,,,
Your main screen should now look like this:
|Always fill all four positions of a sequence row to avoid glitches and unwanted effects.
Move the cursor up to the first position in the sequence again. Now press [2nd]
. This will bring up the pattern screen.
Let's activate RowPlay mode, so we can hear what we're doing. Press [ALPHA],[MODE].
Ok, let's put some notes into this pattern thing. Press [PRGM],[PRGM]
Wow, that's a pretty low note. Let's change the octave by pressing [GRAPH],
. Now we can enter some more notes, for example
by pressing [PRGM],[PRMG],[SIN],[SIN],[TAN],[TAN]
to hear what we've got so far.
Hmmm, sounds pretty boring, right? So let's spice things up with some drums. Press [2nd]
to go back to the main screen.
Now move the cursor all the way to the right, and press [2nd]
again. This will bring up the FX pattern screen.
Congratulations, you've just composed your first "song" in HoustonTracker 2!
||ALPHA mode function
||Exit HT2. The current tune will be preserved in memory. You can only exit when music isn't playing. On TI83/8x Plus, this will take a few moments.
||Load a song. Will prompt for a save slot number (0..7). Needs to be CONFirmed.
In ALPHA mode, save the current song. Will prompt for a save slot number (0..7). Needs to be CONFirmed.
||Clears the current tune. Needs to be CONFirmed.
In ALPHA mode, prompt for a save slot number (0..7) and deletes it. Needs to be CONFirmed.
||Confirm action. (Cancel action with key .)
||Toggle between sequence and pattern view. When used on sequence view, it will display the pattern selected by the cursor.
||ALPHA MODE ON
||ALPHA MODE OFF
||Toggle ALPHA mode on and off.
TIP: When music is playing, you can hold down this key to pause the playback.
||Toggle automatic cursor increment on/off (off by default).
In ALPHA mode, toggle playing notes while editing (off by default). Beware that RowPlay may ignore effect settings under certain circumstances.
||JUMP TO START
||Move cursor up. In ALPHA mode, jump to row 00 of the sequence.
||JUMP TO END
||Move cursor down. In ALPHA mode, jump to the last rows in the sequence.
||Move cursor left. In ALPHA mode, move one page (10 lines) up in sequence.
On pattern screens, cycle through patterns in ALPHA mode.
||Move cursor right. In ALPHA mode, move one page (10 lines) down in sequence.
On pattern screens, cycle through patterns in ALPHA mode.
||Start playing from row 00, or stop playback if player is running.
||PLAY CURR/ PAUSE
||Start playing from the current position in sequence, or hold down to pause playback while player is running.
||Depending on context, either input 0 at cursor, delete a note, or cancel action.
On the Sequence screen and with ALPHA mode active, remove the currently selected pattern from the sequence.
||Input 1..9 at cursor.
||Input hex digit A or note A at cursor, depending on the context. While setting notes and being in ALPHA mode, input an A#.
||Input hex digit B or note B at cursor, depending on the context.
||Input hex digit C or note C at cursor, depending on the context. While setting notes and being in ALPHA mode, input a C#.
||Input hex digit D or note D at cursor, depending on the context. While setting notes and being in ALPHA mode, input a D#.
||Input hex digit E or note E at cursor, depending on the context.
||Input hex digit F or note F at cursor, depending on the context. While setting notes and being in ALPHA mode, input an F#.
||Input note G at cursor. While setting notes and being in ALPHA mode, input a G#.
This key does nothing in sequence/fx ptn view.
||Mute/unmute channel 1. In ALPHA mode, unmute all channels.
||Mute/unmute channel 2. In ALPHA mode, mute/unmute drum channel.
||Mute/unmute channel 3. In ALPHA mode, mute all channels.
||SET USR DRUM
||Set the global song speed. Refer to the section on global variables for details on this setting.
In ALPHA mode, set the user drum pointer. Any value between 0x0000 and 0xFFFF is permitted. However,
it is recommended to stick with values in the range of 0x0000 - 0x7FFF, as higher values may produce unpredictable results.
||Set the current octave. Only works on note pattern screens. Valid values are 0..6.
||Transpose current pattern up by one half-tone. In ALPHA mode, transpose current pattern down by one half-tone.
Out-of-range notes will be replaced with rests.
||QUICK SET LP
||Set the loop point to the current row in sequence. Only works on sequence screen.
In ALPHA mode, enter a new LP value. Changes will not
take effect until the next player restart.
||QUICK SET BS
||Set Block Start to the current row in sequence. Only works on sequence screen.
In ALPHA mode, enter a new BS value.
||QUICK SET BE
||Set Block End to the current row in sequence. Only works on sequence screen.
In ALPHA mode, enter a new BE value.
||In ALPHA mode, paste selected block over the current and following rows.
The target row must be outside of the selected block.
||Insert a copy of the selected block at the cursor.
In ALPHA mode, delete the selected block.
||Insert a copy of the current row at the cursor.
In ALPHA mode, delete the current row.
||PUT NEXT FREE
||Put the next unused free pattern in sequence at the current position.
In ALPHA mode, clone the current pattern and insert the
clone at the current cursor position.
Modes and Indicators
There are a number of different indicators, which will tell you about various modes and editing settings that are currently applied.
The Alpha mode indicator
comes in the shape of a capital letter A, which is displayed below the diagonal left edge of the
When the A is visible, then Alpha mode is active. The Alpha mode is HT2's version of the SHIFT key on a PC - except that you press it before
another key, not together with the second key.
Many keys in HT2 have a primary and secondary function.
In Alpha mode, the secondary functions will be triggered. You can toggle Alpha mode on and off by pressing - you guessed it - [ALPHA]
. Alpha mode
will be turned off automatically once an Alpha mode action has been performed.
The playback indicators
are located directly below the HT2 logo. The first position tells you if the music player is
currently stopped or running. While stopped, it will display a ■, when running, it will display the capital letter P. Next to this position, you
will find four positions which normally read "123D" (for channel 1, 2, 3, and drums respectively). These positions indicate which channels are currently
muted. Muted channels will display a "-" instead of their channel number/letter.
indicators tell you whether the auto-incrementing and RowPlay functions are currently activated. They
are located in the lower third of the right screen side, just below the the global variables. The AutoInc indicator
displays "A0" when
deactivated (default), and A1 when activated. Auto-incrementing means that after you enter a value or note in HT2, the cursor will automatically advance to the next position.
You can toggle AutoInc with key [MODE]
. The RowPlay indicator
tells you whether RowPlay mode is currently active. If so, it will display the
capital letter P. When entering a note, HT2 will
automatically play the current pattern position (including all channels that are not muted). You can toggle RowPlay by pressing [ALPHA], [MODE]
|RowPlay mode can't reliably detect all effect settings that apply to the current position, so depending on the
it may not reflect how the position will actually sound when the whole song is played back.
Below the AutoInc/RowPlay indicators, there is the general purpose message area
. Here, various important messages will be
displayed, such as occuring errors, or requests for the user to confirm an action. Confirming is done with key [.]
, cancelling is done with key
The loop point
defines what row in the sequence the player will loop back to after it has reached the end of the song.
will set the loop point to the row currently highlighted by the cursor. To set it to another row, press [ALPHA], [x²]
then enter a 2-digit hex number.
The global song speed
can be changed by pressing [TRACE]
, followed by a 2-digit hex number. The number refers to
the number of ticks one row will last. So generally speaking, a higher number means lower speed.
Any number in the range of 0x01 - 0x3F will set the number of ticks directly. Adding 0x40 to the value will reduce the length of the first tick by ¾,
adding 0x80 will reduce it by ½, and adding 0xc0 will reduce it by ¼. Thus, setting the speed to 0x08 will result in a row length of 8 ticks,
0xc8 will result in a row length of 7¾ ticks, 0x88 will result in a row length of 7½ ticks, and 0x48 will result in a row length of 7¼ ticks.
Note that reducing the length of the first tick will have a noticable impact on various effects including 2xx/3xx (pitch slides), 8xx (execute note table), and
Cxx (note cut).
0x00 (aka the "drone mode") is an exception. It is the slowest possible setting, equivalent to a row length of 256 ticks (minus a fraction of a tick when adding
To set the user drum pointer
, press [ALPHA], [TRACE]
, followed by a 4-digit hex number.
See the section on drums
details about the user drum pointer.
|Changes to the global variables are not effective until you restart the player.
The sequence screen is where you build the general structure of your song. It consists of four editable columns, each containing a list of patterns.
Each column represents a different channel. To toggle between the main (sequence) screen and the pattern screens, select a pattern in the sequence
with the cursor, then press [2nd]
The first 3 columns represent the 3 tone channels, ie. they contain note patterns
. The last channel represents the drum channel and
effects settings, ie. it contains fx patterns
The tone channels differ somewhat in sound and features. Channel 1
features the A0x effect
, which adds noise and/or glitchy
sounds to the regular tone. Channel 2
is somewhat louder than the other channels, and features a SID-style duty cycle sweep effect.
features hi-speed pitch slides. All channels support a variable duty cycle.
Moving around on the sequence screen
Keys [▴], [▾], [◂], and [▸] move the cursor around on the sequence screen.
Pressing [ALPHA], [◂] resp. [ALPHA], [▸] will move the cursor up/down by 10 rows.
Pressing [ALPHA], [▴] will move the cursor to the start of the sequence. Likewise, pressing [ALPHA], [▾] mode will move
the cursor to the end of the sequence.
Editing the sequence
Use keys 
, and [COS]
) to enter pattern numbers. You can have a maximum of 128 note patterns, and 64 fx patterns, so the
highest pattern numbers are 0x7F and 0x3F respectively. Note patterns are shared across all 3 tone channels, so you can use any note pattern on any channel.
If you try to enter an invalid pattern number, HT2 will automatically replace it with an arbitrary valid one.
|Note patterns and fx patterns use a different numbering, e.g. note pattern 01 is
different from fx pattern 01.
To automatically put the first unused pattern at the current sequence position, press [+]
. To clone the pattern at the current position (copy it's
contents to a new, unused pattern), press [ALPHA], [+]
To delete the pattern number at the current position, press [ALPHA], 
You can press [-]
to copy the current row. This will insert the copy at the current position.
to delete the current row.
|Always fill all four sequence positions in a given row. Pressing play on a sequence row that has empty positions will
have undesired side effects.
HT2 uses two block markers, block start (BS) and block end (BE) to select a section of sequence data for copying, pasting, and cutting.
Block operations work only on the whole sequence, not on individual channels.
To set the block start to the current row in the sequence, press [LN]. Likewise, to set the block end to the current row, press [STO►].
Pressing these keys in [ALPHA] mode will allow you to set the BS/BE positions manually.
To copy the marked block and insert it at the current cursor position, press [×]. Pressing [ALPHA], [×] will
paste the block over the following sequence rows. Note that you cannot insert/paste a block into itself, so the target must always be outside the selected
Press [ALPHA], [÷] to delete the selected block and move the following sequence data up.
All note patterns have a fixed length of 16 steps, which are organized in two columns à 8 steps.
Notes can be entered with keys [MATH]
(F), and [TAN]
(G). Sharp notes (black keys) can be reached with [ALPHA]
+ note key.
In order to hear notes while you're entering them, you can toggle RowPlay
by pressing [ALPHA], [MODE]
. A "P" will be displayed
next to the AutoInc indicator to let you know that RowPlay is active. Note that RowPlay is somewhat
limited. Among other things, it may ignore current effect settings. Also, it will fail if the pattern you're editing is not on the current step in the song
To change the current octave, press [GRAPH]
, then enter a number between 0 and 6. You can also edit octaves manually in the pattern.
|You can cycle through note patterns with [ALPHA], [◂] and [ALPHA], [▸].
Like with note patterns, fx patterns are organized in two columns à 8 steps. Each step consists of four hex digits.
The first digit
sets the drum sound to be used on that step. A value of 0 means no drum. Refer to the following section
to learn more about drums in HT2.
The second digit
sets the effect command. A value of 0 means no effect. Finally, the last two digits
set the effect parameters.
Refer to section 126.96.36.199
to learn all about effects.
There are 15 different drums to chose from (0x1..0xF). Some of the drums use the TI-OS as sample data, so their sound may vary across
different calculator models.
Drums can be played in different modes, which affects the way they sound. Use command Cxx to change the drum mode, with xx = 0x00..0x4f. There are 80
different drum modes, though not all of them are particularly useful.
Setting a non-zero value for the lower nibble
of the parameter causes the drum data to be manipulated in various ways. Refer to
for details about this functionality.
The upper nibble
of the parameter
defines the behaviour of the drum data pointer. The effects are as follows:
|0||C00||Increment pointer, ie. use the "standard" drum set.|
|1||C1x||Decrement pointer, ie. use the "alternative" drum set. Generally speaking, these drums are less useful than the standard set.
Also, some drums will produce unpredictable results, namely drum 0, 1, C, and D.|
|2||C2x||Increment and loop pointer. Even less useful than mode 1, and suffers from the same problems. Also, this mode causes a slight
global pitch shift.|
|3||C3x||Decrement and loop pointer. Like mode 2, with different sounds.|
|4||C4x||Don't move pointer. Instead of drums, in this mode triggering a drum will play a fixed, most likely out-of-tune frequency.
This mode causes a slight
global pitch shift.|
Drum 0xE and 0xF are special cases.
0xF is the user drum pointer, which can be configured individually. To change it, press [ALPHA], [TRACE]
The user drum
can be set to any value between $0000 and $FFFF. However, if you want to play it safe you should keep the pointer in range 0x0000 - 0x7FFF. This is because
the user drum
is actually a pointer to ROM/RAM. Pointing the user drum to RAM (0x8000 and up) will give unpredictable results, as the RAM contents change frequently.
0xE is the user defined sample. This feature is a bit quirky in use. In order to create a custom sample, go to FX pattern 0x20. Now, instead of entering
the usual drum triggers, fx commands, and fx parameters, you enter your sample data. You can use more than one pattern, so after you've filled up FX pattern
0x20, go to 0x21.
The data is in 1-bit PWM format, meaning each byte denotes a phase length.
Think of it as the amount of time taken until the beeper output will toggle again. The values are inverse, ie. a lower value denotes a longer phase.
Yes, it's a bit confusing... As an example, this is what drum sample 1 (the kick drum) looks like:
0x80, 0x80, 0x70, 0x70, 0x60, 0x60, 0x50, 0x50, 0x40, 0x40, 0x40, 0x30, 0x30, 0x30, 0x30, 0x20, 0x20, 0x20, 0x20, 0x20,
0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x8, 0x8, 0x8, 0x8, 0x8, 0x8, 0x8, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x2, 0x2, 0x2, 0x2, 0x2, 0x2, 0x2, 0x2, 0x2,
This will give you a waveform looking like this:
|The last byte of the sample must be 0.
|You can even define a second drum sample, which you can then trigger in drum mode C1x/C3x. This sample also starts at
FX pattern 0x20, but needs to be written backwards,
so the second byte of the sample is on the last position (FX parameter of the last row) of FX pattern 0x1F, third byte is just before that (drum/FX command
of the last row),
and so forth.
||Set panning for all channels. To determine how the panning will be set, you need to look at the individual bits of the effect parameter, starting
at the rightmost one (aka bit 0).
bit 0 set: pan channel 1 right (add 0x01 to parameter)
bit 1 set: pan channel 1 left (add 0x02 to parameter)
bit 0,1 reset: pan channel 1 center (don't add anything to parameter)
bit 2 set: pan channel 2 right (add 0x04 to parameter)
bit 3 set: pan channel 2 left (add 0x08 to parameter)
bit 2,3 reset: pan channel 2 center (don't add anything to parameter)
bit 4 set: pan channel 3 right (add 0x10 to parameter)
bit 5 set: pan channel 3 left (add 0x20 to parameter)
bit 4,5 reset: pan channel 3 center (don't add anything to parameter)
bit 6 set: pan drums right (add 0x40 to parameter)
bit 7 set: pan drums left (add 0x80 to parameter)
bit 6,7 reset: pan drums center (don't add anything to parameter)
|100||00000000||0x00 + 0x00 + 0x00 + 0x00 = 0x00||pan all channels to center|
|155||01010101||0x01 + 0x04 + 0x10 + 0x40 = 0x55||pan all channels right|
|112||00010010||0x02 + 0x00 + 0x10 + 0x00 = 0x12||pan ch1 left, ch2 center, ch3 right, drums center|
If you're having trouble figuring out the right values, you can use this online tool by garvalf to calculate the parameters.
||PITCH SLIDE UP CH3
||Cause a (rather fast) upward pitch slide on channel 3.
xx defines the speed of the slide, lower values mean slower slides. xx can be any value, but beware that the pitch counter will eventually wrap.
200 switches off the effect.
||PITCH SLIDE DOWN CH3
||Cause a very fast downward pitch slide on channel 3. Using this will disable effect 9xx.
xx defines the speed of the slide, higher values mean slower slides. xx can be any value, but beware that the pitch counter will eventually wrap, after which the pitch will start to slide upwards.
300 switches off the effect.
||DUTY CYCLE/ NOISE CH1
||Set the duty cycle for channel 2, and toggle noise mode.
xx <= 0x80 - set duty cycle and disable noise mode (equivalent to additionally setting A00 command)
xx > 0x80 - set duty cycle and enable noise mode (equivalent to additionally setting A01 command).
||DUTY CYCLE/ SWEEP CH2
||Set the duty cycle for channel 2, or enable duty cycle sweep.
xx <= 0x80 - set duty cycle and disable duty cycle sweep. A value of 0x80 produces the default 50:50 wave. Very low/high values will cause glitches.
xx > 0x80 - enable SID-style duty cycle sweep.
||DUTY CYCLE CH3
||Set the duty cycle for channel 3.
xx can be any value, but very low/high values will cause glitches. A value of 0x80 produces the default 50:50 wave.
||AUTO CHORD CH2
||Add a chord effect to channel 2.
The chord created varies depending on the note used, and is not necessarily harmonic.
xx can be any value, 700 turns off the effect. HINT: Try 780 with channel 2 duty cycle sweep enabled.
||EXEC NOTE TABLE CH3
||Execute a given pattern as a note table for channel 3. This effect operates on a per-tick basis. Execution starts after the first tick.
xx is the pattern to be executed as note table. If the current tempo is greater than 0x10, table execution will continue at the following
To disable the effect, set xx to a value greater than 0x7F.
Using this effect will disable the Cxx (note cut ch1) effect.
||Add a nasty glitch effect to channel 3. Using this will disable effect 3xx.
xx can be any value, 900 turns off the effect.
||ADD SFX CH1
||Add a sound effect to channel 1.
A00 deactivates the effect. Additionally, setting 4xx to a value <= 0x80 will deactivate the A01 effect.
A01 adds noise or glitchy sounds to channel 1. The actual outcome depends on the current pitch of ch1. To some extend, it's also influenced by the
currently active drum sound. It works best with high notes, especially A-5 and A-6.
A02 adds slight random inaccuracies to the pitch of channel 1. It has little effect by itself, but can be used to produce a phasing effect in
conjunction with other channels
set to the same note as ch1. The effect does not work equally well on all pitches, namely it won't do anything on C notes.
||LOOP SECTION/ BREAK PTN
||xy = 0 - break pattern immediately and jump to the next position in the sequence. B00 is ignored on the first line of a pattern.
xy > 0 - jump back y rows in the pattern, repeating the section x times.
The Bxy effect should not be nested (ie. don't put a Bxy loop within another Bxy loop), because doing so will lead to an infinite loop. Beware, HT2 does
not do checks against this.
||NOTE CUT CH1
||Cut the note on channel 1 after xx ticks. Using this effect can make the sound output slightly more noisy.
Use C00 to disable the effect.
Using this effect will disable the 8xx (exec note table ch3) effect.
||Set the drum mode, where xx is 0x00..0x4F. Refer to the drums section for details.
||Various extended effects. Using this effect causes a slightly longer than normal delay when triggered, leading to additional transition noise.
Exx with xx < 0x40 - execute up to 5 effects stored at the start of effects pattern xx at once. Effects Bxx and Exx will be ignored.
E80 - reset all effects and restore global variables to their defaults.
E81 - as above, but does not reset speed.
E82 - as above, but does not reset speed and duty cycles.
E83 - as above, but does not reset speed, duty cycles, and panning settings.
||Set the current speed. This command temporarily overrides the global speed setting, but does not permanently change it. For details on how the
speed setting works, refer to the section on global variables.
TIP: When entering this effect while the player is running, make sure to enter the parameter first, and then the F command.
To save your current work in progress, press [ALPHA], [Y=]
. The letters "SA" will appear in the message area.
Now, enter the number of the save slot you want to save (0..7), and confirm by pressing [.]
. (If you got here by accident, press 
If the save was successful, error code E0 will be displayed in the message area. If the save was unsuccessful due to insufficient memory, error code
E2 will be displayed instead. Note that you may run out of memory rather quickly. You will always be able to maintain at least two save slots, however.
|Any data after the first unfilled position (--) in the sequence is not saved.
To load a previously saved tune, simply press [Y=]. The letters "LD" will appear in the message area.
Now, enter the number of the save slot you want to load (0..7), and confirm by pressing [.]. (If you got here by accident, press 
The tune in question will be loaded, or error code E5 will be printed if the selected save slot was empty.
Deleting a save slot
In case you run out of memory, or want to get rid of one of your save slots for other reasons, you can specify a save slot to be deleted.
In order to do so, press [ALPHA], [WINDOW]. The letters "DS" will appear in the message area.
Now, enter the number
of the save slot you want to delete (0..7), and confirm by pressing [.]. (If you got here by accident, press  to cancel.)
And that's all you need to know about deleting save slots!
Creating a backup of your HT2 songs is trivial: Simply send the HT2 PRGM file to your computer or another calc of the same model.
The program file contains all the save slots as well as the currently loaded song.
You can use the ht2util
savestate manager to extract/insert save slots into your HT2 PRGM file.
If a major error happens, HT2 will attempt to detect it, and print an error code in the message area. An special error message will also be displayed if
saving a backup of the current song was successful.
The following table lists all possible error codes:
||Saving backup was successful, no error occured.
||Block End is set before Block Start, or the row where the block should be inserted/pasted to is within the selected block.
||There is not enough RAM to perform the desired action (usually saving).
||An invalid pattern number was set in the song sequence.
||Invalid loop point. Row to loop to is empty.
||FILE I/O ERR
||Loading song failed. Save slot is empty or corrupt.
||Wrong savestate version, or savestate corrupt.
||NO FREE PTN
||Could not find a free pattern.
||BLOCK TOO LARGE
||The selected block is too large to be inserted.
Small errors (like trying to set an inexistent note or an invalid pattern number) will be simply ignored by HT2.
is a PC-based savestate manager application for HoustonTracker 2. It allows you to export and import songs from/to the savestate block of your
HT2 binary, among other things.
Even though ht2util comes bundled with HT2 releases, it is maintained seperately. Check the
for the latest version.
ht2util works as a stand-alone application, no installation is required.
Linux users can compile the program from source by running "make" in the /ht2util-gui directory. ht2util depends on wxWidgets 2.8 or higher, so install that first if
necessary. Most Linux distros provide a native wxWidgets implementation in their repositories.
Always start by loading a HT2 program file. This can be a blank ht2.8*p, or one you've backed up from your calculator. Once the file has loaded successfully,
the contents of its savestate table will be displayed in the left panel.
a savestate, use "File->Insert savestate...", or drag one or more files from the right-hand (filebrowser) panel to the left-hand
(savestate) panel. If the savestate was extracted from an older version of HT2, ht2util will offer to automatically upgrade the it. This will always work
with stable HT2 releases (except for some effects/settings that can not be upgraded automatically), but might, in rare cases, cause some problems with beta
one or more savestates, mark the desired state(s) in the savestate panel, then use "File->Delete savestate" or simply press "Delete".
one or more savestates, mark the desired state(s) in the savestate panel and then use "File->Extract savestate..." to save it with a ".ht2s" extension.
You can also simply drag the desired savestate(s) from the savestate panel to the filebrowser panel; this will save the state(s) with a generic filename.
Furthermore, you can decompress and export savestates to .asm, however this is not particularly useful yet unless you're working with the HT2 source.
|ht2util does not automatically update effect commands yet. If you've imported a savestate from an older version of
HT2, you will need to adjust those manually. Refer to the changelog to see which commands need to be updated.
... TylerBarnes, Tronimal, garvalf, Flashbob, giako9000, nonfinite, and Imaginary for beta testing
... Jankenpopp and unexpectedbowtie for figuring out the install process under non-standard configurations
... extra thanks to garvalf for preparing the HT2 cheatsheet
... Shiru, introspec, and Alone Coder for their expertise and advice
... Brandon Wilson, Lionel Debroux, and everybody who has been hacking/documenting TI calcs
The TI-82 image that was used as the basis of the keymap
was authored by Martin Olsson, and is released under
/Creative Commons BY-SA
The latest version of the HT2 source code can always be found at
HoustonTracker 2 is developed under Linux. If you're running Linux or another *nix derivate, building HT2 is a matter of simply running the build script,
provided you have a few basic tools installed. If you're developing on Windows or another non-Posix compliant system, you'll need to provide your own build
script or build from hand.
• The Pasmo
assembler must be installed and present in your search path (unless you want to adapt the
sources for another assembler).
• Optionally, you may want to install an TI calculator emulator. For *nix systems, using the development version of
Building with the Build Script (*nix only)
It's as simple as opening a terminal, navigating to the folder containing HT2, and typing
where [model] is one of
|82||build for TI-82|
|8p||build for TI-82 Parcus|
|83||build for TI-83, TI-82 Stats|
|8x||build for TI-83 Plus, TI-84 Plus etc.|
|8xs||build "small" version for TI-83 Plus, TI-84 Plus etc.|
|all||build all targets.|
Optionally, you can rebuild the note table before
running the build script. In order to do so, run the tablegen.sh
shell script. This will allow you to change HT2's base tuning.
In order to have the build script automatically run your builds in tilem2, uncomment the lines in compile.sh that look like this:
tilem2 -a -r "/path/to/your/romfiles/xyz.rom" -m [model] [buildfile]
Building by Hand
The following steps are required to build HT2 by hand:
1. Assemble the sources with the following command:
pasmo --equ MODEL=[model] --alocal main.asm main.bin
where [model] can be either 1 (TI-82 build), 2 (TI-83 build), 3 (Plus models build), or 4 (TI-82 Parcus build).
2. Pack the resulting main.bin into a TI executable (82p, 83p, 8xp) using a packer of your choice (bin8x, oysterpac.pl, etc...).
Work Area Data Format
The work area is where HT2 stores the currently loaded song. It begins at label "musicData", and is 5125 bytes in size. The actual address in memory
depends on the version of HT2.
|+1||word||user drum pointer|
|+4||1 KB||pattern sequence list. 1 byte per pattern. Order is ch1, ch2, ch3, fx. Empty positions contain 0xff.|
|+1028||byte||one 0xFF byte to mark the end of the sequence list.|
|+1029||2 KB||note patterns. Each note pattern has an uncompressed length of 16 bytes. Empty positions contain 0x00.|
|+3077||2 KB||FX patterns. Each fx pattern has an uncompressed length of 32 bytes. Empty positions contain 0x00.|
Compressed Savestate Format
HT2 uses a very simple compression scheme to store song data backups. They are set up as follows:
|+1||word||user drum pointer|
|+4||?||pattern sequence list. 1 byte per pattern. Order is ch1, ch2, ch3, fx.|
|?||byte||one 0xFF byte to mark the end of the sequence list.|
if byte at offset >= 0xE0, then the following [byte - 0xDF] patterns are empty.
else, if byte at offset >= 0xD0, then the following [byte - 0xCF] rows are empty.
else, if byte at offset < 0xD0, it's a regular note value.
|?||byte||one 0xFF byte to mark the end of the note pattern area.|
FX patterns are preceded by their pattern number. A pattern number of 0xFF signals that the savestate contains no FX patterns.
If bit 7 of the pattern number is set, it's the last pattern to be loaded. Setting bit 7 is optional if the last saved FX pattern is 0x3F.
Start and end addresses of backup savestates are stored in the savestate lookup table.
The following section describes how the multi-channel synthesis is achieved in HT2, and how the effects are produced.
Sound mixing in HT2 is achieved through a 1-bit synthesis technique called Pulse Interleaving.
Typically, a 1-bit DAC can only output one single square wave frequency. What Pulse Interleaving does is interlace the multiple software channels
at a rapid rate. Due to their own hardware latency, common output devices such as speakers or headphones cannot fully adjust their speaker cones at this rate.
Therefore the cones will be left in a floating state between full extension and full contraction. This is how the
different volume levels needed to mix HT2's four software channels are achieved.
The average time taken to interlace one sample of all 4 channels is (1/16300)s, meaning channel states are swapped
at a rate of about 65200 Hz. The exact timings depend on various factors such as actual tone frequencies, effect and drum settings, hardware model,
and battery state.
Once per interlacing cycle, a 16-bit constant (the "frequency base value") is added to a 16-bit counter. The hi-byte of the counter is then compared
against a threshold value. If the threshold constant is greater than the hi-byte of the add counter,
the output state will be high (1), otherwise it will be low (0).
The threshold value determines the duty cycle ratio. When the threshold is 0x80, the output state will be high 50% of the time, and low for the
other 50%. When the threshold is, say, 0x40, the ratio will be 25%:75%.
The 9xx effect (glitch channel 3) is achieved by constantly rotating the hi-byte of the base frequency value.
Similarly, the A01 effect (noise/glitch channel 1) is achieved by rotating the hi-byte of the add counter. This may or may not generate enough pseudo-randomness to
produce a noise-like effect, depending on the frequency base value.
The D01 effect (duty cycle sweep) is achieved by incrementing the threshold value once every interlacing cycle. As it is an 8-bit value, it will wrap to
0 once it reaches 0xFF.
The pitch slides are achieved by adding a constant to the frequency base value once per interlacing cycle.
Drums are generated from values in either ROM or RAM. The values read will be interpreted as 8-bit counters, which are decremented once per interlacing cycle.
When the counter reaches 0, the output state of the drum channel is toggled, and the next value is read from ROM/RAM. When a 0-byte is read,
the output stops.
Drums 0x1, 0xC, and 0xD are hard-coded in RAM. The "user drum sample" (drum 0xE) is effectively a pointer to FX pattern 0x20. The "user drum pointer"
(drum 0xF) is a simple user-definable pointer which can point to either RAM or ROM. All other drums point to ROM, which explains why they sound different
depending on what calculator model is used.
The "drum mode" effect (Cxx) will do two things. The upper nibble of the effect parameter determines the direction of the ROM/RAM pointer used to retrieve the
counter values. If the upper nibble is 0, the pointer will move forward. If 1, it will move backward. If 2 or 3, only the lo-byte of the pointer will be
in/decremented, which means the pointer stays on the same 256-byte memory page. If 4, the pointer will not be moved at all.
The lower nibble of the effect parameter will determine how the values are modified after they are read from memory. The manipulations are as follows:
| value ||effect|
|0x1||transform into binary coded decimal|
|0x2||multiply by 2|
|0x3||divide by 2|
|0x5||use lo-byte of pointer as value|
|0x6||add lo-byte of pointer|
|0x7||add hi-byte of pointer|
|0x8||subtract hi-byte of pointer|
|0x9||subtract lo-byte of pointer|
|0xA||logical AND with hi-byte of pointer|
|0xB||logical AND with lo-byte of pointer|
|0xC||logical OR with hi-byte of pointer|
|0xD||logical OR with lo-byte of pointer|
|0xE||exclusive OR with hi-byte of pointer|
|0xF||exclusive OR with lo-byte of pointer|
In some drum modes, the drum channel will produce sound even if a 0-byte is encountered in the data. This is due to the fact that the modifications
are applied before checking if the value read from memory is 0.
I'm getting weird errors when trying to install/run TiLP on Vista/7/8/10.
Check the improved Win32 readme
, it has
solutions for the most common problems. If that doesn't help, stop by at the
and we'll help sort things out.
TiLP refuses to run on my Windows XP.
Windows XP is no longer supported in TiLP2 1.17. You'll need to use an older version.
TiLP fails to fetch the GTK+ installer.
You need to install the GTK+ package
Afterwards, make sure you uncheck the GTK+ installation box in the TiLP installer.
My TI-82 isn't auto-detected.
That's ok, just configure the Device Settings manually and you should be good to go.
#1 = install driver for graylink
- boot computer and do not plug your link device
- If your graylink cable is PL2303TA based, you need
this specific usb-serial driver
(others will not work)
- plug your link device then check in your device Manager to see if everything is ok, set the COM port to 1, 2, 3 or 4... more than 4 will not work.
- unplug your link device,
- reboot computer
#2 = Install TILP2
- do not plug the link device
- first install GTK+ 2.12.9-win32
- then install TiLP
(be sure to uncheck GTK+ installation box, because you
already did it)
- plug the link device
- open TILP, then 'control+D' and set your connection parameters:
cable -> graylink
port -> the COM port you just set in #1
calc -> your calc model (TI82)
- then 'OK'
Try to send some program from your TI (in link mode), TILP should automatically ask you to save the file somewhere,
which means linking finally works ;)
Thanks to jankenpopp for coming up with the solution to this problem.
An easy way to install TiLP is by using MacPorts
. After you have set up MacPorts, you can install
TiLP with the command
[sudo] port install tilp2
Thanks to unexpectedbowtie for coming up with this solution!
Alternatively, you can use the official
linking software. However, TI-Connect does not fully support the TI82, so you won't be able to upload HT2 on that model.
Alternatively, you can of course run Linux in a virtual machine, and use TiLP from there.
Are you using a SilverLink USB cable?
Sorry, that won't work with TI-Connect.
Are you using a serial or parallel cable?
TI-Connect has problems with CrASH's file naming conventions. One work-around is to
- install an emulator to emulate a TI82, using the same ROM version that your calculator runs
- install CrASH and HT2 on the emulator
- dump a TI82 backup file (.82b) from the emulator
You can now upload the .82b file you created to your real TI82, using TI-Connect.