The end of this year will represent 20 years from when the first line of Impulse Tracker code was written. This was a significant project for me; and I intend to finally release the full source code to all of IT -- core program, all sound drivers (including WAV and MID) and even the rarely used network code -- later this year. In total, there's over 230k lines of assembler code. Keep in mind that this was all written in an era with 8.3 filenames, where source control meant copying all of the files to a separate disk and labelling it. There was no syntax highlighting in source code editors, let alone auto-complete or documentation links!

There's some stuff I need to do before I can release it; the source code currently holds the names, emails and notes of all contributors and mentions of some people's names that I'm not sure would want to be mentioned. Some of the peripheral C source utilities I think I've lost forever. There's almost no digital documentation - I actually kept a separate physical notebook where all screens were first laid out on grid paper, data structures and algorithms were penned down, and tasks and todo-s were tallied.

But before that happens, I'm going to write a bit about how Impulse Tracker came about; and take a little indulgent trip down memory lane.

Early days of Programming

In the early 80s, computers weren't cheap; and my parents didn't have a huge amount of disposable income. It was only due to the great magnanimity of one of my uncle's did we get our first computer to use -- an Apple II if I remember correctly. I think I was about 5 years old at the time; and for the first few months, my only interactions with it were to play games (I played Ultima II, III, and others). Soon after this, I learnt how to hex edit save game files from my cousin. I learnt that 0x63 meant 99 attribute points in a game, even though I didn't yet know how to convert hex to decimal.

My father had a very different approach to computers. From the first day we received it, he started  tinkering on BASIC programming -- back when BASIC code had to be prefixed by line numbers! I remember a program he wrote where we could enter our birthdate, and it would 'instantly' tell me how many years, months and days old we were. In retrospect, these things seem trivial when you have modern languages with Date/Calendar classes and what not; but at the time, I was fascinated just that this could be done; and before too long, I was also writing BASIC programs. I wrote all kinds of small, useless things, but I was hooked.

Fast forward a few years, and we now had a PC with an 8088 processor. All 4.77Mhz worth. I'm 10 or 11 years old, and incredibly excited to use and program on the new computer. But it didn't have a BASIC interpreter built in. I'd also 'discovered' that BASIC had its limits too. The graphics code I had tried would always run slower than other programs out there, and there were things it seemed like I just couldn't do. I'd done some research and had heard of C. It was time to learn something new.

There was no internet for me back then -- the wealth of knowledge available now would certainly have made the learning process so much quicker (albeit with plenty more distractions). I remember my mother had to make a family trip overseas and asked if there was anything I would like her to bring back. She came back with 3x C programming books and Turbo C compiler.

And I studied these books religiously.

One of the books had a section on assembly language programming. It taught me how to use DOS's debug command to inspect and write assembler, to switch the computer into a graphics mode, and to fill the screen with a solid colour -- at a fraction of the time and space of the equivalent C code. The speed and size of this code seemed like magic.

Early days of Music

As a member of a family with ambitious plans for their children, I started learning music at the tender young age of 4. Discipline was rigorous, and by the age of 13, I had completed associate and licenciate diplomas in violin, and finished my grade 8 in piano.

And I hated it.

But then when the constant grind cycle of exams stopped, so did the pressure and stress. Somehow, I found enjoyment and satisfaction in writing music. Like all things, my first attempts just weren't very good. But I loved it.

Future Crew - Unreal, Second Reality and Scream Tracker 3

Fast forward a few years and that same cousin who had shown me how to hex edit save game files now had a 386 and something new to show me. I'm not sure how he got hold of Unreal and Second Reality; but I remember the impact it had on me when I saw it. This was the first time I had heard anything other than beeps coming from a computer and the graphics far far surpassed anything I had seen before.

I wanted to be as good as Future Crew! Skaven and Purple Motion became my music heroes. And I wanted to be as smart as Psi.

Not long after it was released, I found Scream Tracker 3 on a BBS. This became almost an addiction for me and I spent as much time as I was allowed each day writing music on it. ST3 had its flaws, and I lost some work due to the save bug that overwrote entire files, and intermittent crashing. But they were things I learnt to work around.

When Scream Tracker 3.21 was released, and there was a declaration that no further versions would follow, I was disappointed. I loved using ST3, but by then, Fast Tracker 2 already had noticeable feature advantages, but I just didn't appreciate the FT2 interface. With Scream Tracker no longer being improved, I decided I would create the version of ST3 that I wanted.

My computer by now was a 386 with 640Kb memory, and I wasn't certain I could make it all fit if I wrote it in C; so I decided I would write it in assembler. I'd seen a number of times where 'written in assembly' was almost an excuse for software that wasn't as polished, or failed in corner cases. Impulse Tracker wasn't going to be like that.

So from day one, I decided that Impulse Tracker was going to be written in assembler, and it was going to be a polished product, It was going to be crash free even in situations where there were 0 bytes of available memory -- I'd suffered too many Scream Tracker crashes in low memory situations and I didn't want to lose another piece of music again.

But I'd never written any audio code before; and I didn't know how any of it really worked. 

Impulse Player

So I started by writing a simple module player in assembly. It took S3M files, and played them on a Sound Blaster 2. It took about 2 weeks to write, but I learnt all I needed to about ports, DMA, interrupt handlers and how to process module formats. I uploaded it to a BBS, forgot about it..

.. and then lost the motivation to pursue Impulse Tracker any further.

It all just seemed like too much work.

Several months later, I was contacted by Kyle, a member of a local demo scene group that had noticed my music. We chat, and we decided we wanted to work on a demo. We never got far with that, but I was now in contact with fellow minded 'technologists.' Before this, I was always working alone, and by and for myself. This was the motivational kick I needed.

So over the Christmas holidays of '94 I began work fervently on Impulse Tracker.

Impulse Tracker Development

Impulse Tracker made rapid progress in January and February of '95. But then I entered university, studying Computer Systems Engineering. And after discovering and enjoying university (college) life, Impulse Tracker took a back seat.

It was only after no progress on it for about 3 months, and consistent encouragement from Darren Hazelton on a daily basis that I resumed work. If it weren't for Darren, Impulse Tracker would never have made it to v1. Darren, I owe you big time. Thank you.

As Impulse Tracker v1 neared completion, I realised I wanted a 'champion' to demonstrate what could be done with the program. And I knew my own music work didn't cut it. In essence, I was looking for my own Skaven or Purple Motion.

I searched around for Australian trackers and discovered that Yannis also lived in Adelaide. And he was a ST3 user. Bingo! I'd never met or spoken to him, but I learnt that we attended the same high school and he was a mere 10 minutes drive away. So one weekend, armed with a disk loaded with an Impulse Tracker beta, I approach the front door to his place.. and knocked....

His father answered the door, but explained Yannis wasn't home. In hasty retreat, and more than a little nervous to explain who the hell I was and what I was doing there, I quickly excused myself.

Damn.

I had known Chris Jarvis since primary school and knew that he'd written some stuff, but I don't think I'd heard any of it at that stage. I dropped by his house and gave him a beta of Impulse Tracker not knowing what he'd create. A couple of days later, he showed me what he'd written. I was ecstatic - In retrospect, I can't believe how lucky I was to have stumbled upon such a musical talent!

His contributions became a much loved staple part of Impulse Tracker releases.

Impulse Tracker 1.0 Release

I'd been working on Impulse Tracker for almost a year, and I'd already started using it to write my own music. I wanted to share it. I was excited. I made a 0.9 version around November '95, and I asked Kyle to help me distribute it; He promptly went to IRC and DCCed it to everyone he could. And over the next few weeks, lycos (or was it altavista at the time? I forget) started showing some search results for "Impulse Tracker". The comments ranged from mildly positive to nonchalant.

Impulse Tracker v1 was released on Christmas Day '95. I thought of it as my gift to Scream Tracker users who wanted something new.

I remember a website: maz-sound.com. It was often linked to and part of the mod-ring. It obviously had some good SEO (even before the term SEO was invented), because I always saw it. I wish archive.org went back further in time, but I believe the review went something like this:

Impulse Tracker
- Scream Tracker ripoff
- No support for 16 bit samples
- Only 16 bit mixing
- No support for samples > 64kb
- No GUS support
- Doesn't support XM

Ouch.

Apart from the first point (which I felt was a feature :)), what he had to say about Impulse Tracker was a primary motivator for a lot of improvements that followed.

to be continued....

I'll write a little bit more about the journey of creating Impulse Tracker probably on a monthly basis, and sometime later this year, I will have a mercurial repository setup with the entire source code.

If you have any questions about it, or would like to hear about any particular aspect, leave a note in the comments below.