Jump to content
IGNORED

[RELEASE] RASTER Music Tracker, v1.34.00


VinsCool

Recommended Posts

On 12/29/2021 at 1:39 PM, _The Doctor__ said:

rmt greetinx should be sent out to all the crews that used to make music for the 8 bit... I bet they'd be inspired, all of our ears will be blessed!

And antigreetinx and fuckinx to all those asses who are using a sector editor... HTT BIG Atari 8 bit demo.

Beautiful work.

 

  • Haha 2
Link to comment
Share on other sites

Not before I manage to finish up the driver changes I am currently working on ;)

It is true I let this cover sleep for way too long, and the more aggressive timing changes I recently have introduced + better control on filter pulses will definitely benefit this time!

 

I mean, I also have a reliable way to produce sawtooth wave, 16-bit sound (including a new surprise feature you guys will enjoy for sure!) and a much more robust setup for all of this stuff.

 

So I will consider making Electric City the goal end for the bigger RMT driver patch update, maybe ;)

 

  • Like 4
Link to comment
Share on other sites

I'm almost done with the newer and better Patch16-2 RMT driver now :)

This is probably my best attempt to date, featuring numerous improvements and new features since my last driver patch (currently bundled with RMT 1.31)

I think this is also the heaviest amount of changes done to the RMT driver to date, at this point, it's becoming its own thing now.

 

Here's a test tune making use of the very aggressive approach my driver patch is making use of now, featuring not 1 but 4 complete 16-bit tables used cyclically in a simple loop I made.

Test 8 (2xVBI, NTSC - Patch16-2 Test)

Here a handful of binaries I converted for my tests, Mono, Stereo, PAL and NTSC are mismatched here, but they all should run properly on most systems.

The point of that test was the robustness of my newer design, as well as the performance.

I'm very pleased so far, and as far as I could tell everything works perfectly :D 

 

Also, I wanted to mention I've finally fixed the timing for all my AUDCTL manipulations, now everything is frame perfect, and also channel perfect.

What I mean by "channel perfect" is that the order of priority no longer matters!

My aggressive code will handle all 4 (8) channels at once, regardless of which one had set a specific bit, all channels will immediately and unconditionally pick up the proper branches each rmtplay subroutine calls, without any delay!

This was a lot of work and thought put into this, but I have to say I am getting incredibly satisfied of what I have been able to do and also prove with all of this :3

 

I am pretty much close to consider the Patch16-2 version of my driver hack final, but there are some more optimisations and testing I want to do.

I also need to finish cleaning up the code and adapting the last few FEATURES to my new code, so optimisations could be done very easily for programmers who may want to use my driver patch in their code.

I am sorry for the last version, I am aware my beginner level code was a mess, but I promise this time it will not be so bad! I've really put a lot of my free time into it, and did my best to not break everything this time!

 

 

Test 8 (patch16-2 edit).obx Sketch 58 (patch16-2 edit).obx Sketch 53 (patch16-2 edit).obx Spring - Phasebass (patch16-2 edit).obx Sketch 63 (patch16-2 edit).obx Sketch 32 (patch16-2 edit).obx Enderdude - Agent X 2 (patch16-2 edit).obx PG - Chipster Harmony (patch16-2 edit).obx Raster - Paul the Penguin (patch16-2 edit).obx Raster - imsure (patch16-2 edit).obx Fugue in C Major (Stereo edit).obx pinky xmas edition overworld 1 (stereo edit).obx

  • Like 6
Link to comment
Share on other sites

A dumb experiment making use of the "secret" feature I was talking about the other day ?

 

Can you guess what I did do here to make this kind of fluid manipulation possible?

I can say for sure, this was an idea I had for a while now, and I'm glad I was actually able to make it work tonight, takes a bit of code and cycles burning doing several checks, but that was well worth the results :D

Obviously this will be included with the driver patch update I will be posting very soon now!

 

a dumb experiment.obx

Edited by VinsCool
Linked the video
  • Like 5
Link to comment
Share on other sites

Okay, here's another one I've actually put some more efforts into, so enjoy... or don't :D 

This is the results of my new experimental BASS16 code and features I have been adding into it, but there's still plenty of improvements that could be done.

 

 

Here's the binary: Another Dumb Experiment.obx

One thing I can say for sure, is during the time I actually made the tune, RMT's sound output was exactly what ended into the binary export, this is very much what it should always be!

Edited by VinsCool
Linked the video
  • Like 6
Link to comment
Share on other sites

Finally, I have some Tracker and Export binaries to test!

This is still unfinished, but pretty much everything works perfectly as far as I could tell.

 

Here's the changes so far, compared to the version I have bundled with RMT 1.31:

 

- Addition of 4 new and improved 16-bit tuning tables, for Distortion 2, A, C and E

- Addition of Sawtooth/Triangle tables and output code. Use with 1.79mhz mode for CH1 and CH3, and use the AUTOFILTER bits to enable the sawtooth output, else it will be Triangle output with the 2 channels using Distortion A

- Added a dumb CMD6 hack for Sawtooth tables pointers. Using positive values will set the waveform forward, or negative will invert it. Can be very useful for modulating cool sounds

- 16-bit mode can be used very easily without having to manually set both channels at once. Simply play notes on respective channels with JOIN CH1+2 + 1.79mhz CH1 or JOIN CH3+4 + 1.79mhz CH3

- Added a failsafe with 16-bit output: playing notes on invalid channels will automatically output no sound

- Added a workaround so 16-bit notes force skipping the next channel, since it is used for the frequency calculations, saves a tremendous amount of cycles over the original BASS16 code, which forced the 16-bit output AFTER all channels were processed

- Added preliminary support for effect commands in 16-bit mode. Vibrato, CMD1, CMD2, Tables of Notes/Freqs will all work as expected, using 16-bit values in calculations. Will need more work, but most things work pretty well so far, except Portamento or FSHIFT

- Re-implemented the Distortion 6 16-bit mode, making use of most of the same code from the new 16-bit method. Except it's much easier to use since it's automatically setting the AUDCTL bits when used in valid channels

- Added a CMD6 hack for Distortion 6, which manipulates the tables pointer based on the XY value, allowing the use of ANY 16-bit tables through Distortion 6! Simply use CMD6 with $XY = Distortion, for example Distortion C will be $0C, Distortion A will be $0A, etc

- Tweaked the CMD7 code to be more efficiently spread between 3 major functions: AUDCTL envelope, Two-Tone Filter Toggle and Volume only output. CMD7 should now be unconditionally functional for any purpose.

- Added missing parameters for the rmt_silence subroutine, so everything is properly reset when used in RMT through the tracker.obx driver, when pressing ESC to reset the registers. Two-Tone Filter and hijacked pointers should all be properly reset as a result

- Reorganised a lot of the RMT data to remove redundancy, however this is still unfinished so the binaries may seem to be quite "fragmented" currently. This will be improved later.

- Re-organised all tuning tables in memory pages from $B000 to $BFFF, but there is a lot of unalocated space as I am still working on a even more ambitious idea for this stuff...

- Added a new experimental feature which aggressively fetch all the AUDCTL bits as early as possible during the rmt_p3 subroutine calls, combining the CMD7 AUDCTL envelopes with Instrument AUDCTL bits all in 1 go, as soon as rmtplay is running

- Added another experimental feature which processes all AUDCTL bits at once, and assign flags for every channels based on "valid" parameters, making the tuning tables pointer hijacking a walk in the park since there is no extra check needed with these flags!

- Added a old_v_audctl variable in zeropage so it can be compared to the current one during the aggressive initialisation, saving tons of cycles if the same value is returned each time.

- Added a check where a AUDCTL value of 0 is also an immediate skip of the aggressive code, writing zeroes in flags, so no redundant checks happen later, making the notes play very quickly, since a 0 is automatically a branching to the no_hijack pointers code.

- Flags are set to verify 16-bit mode, invalid 16-bit mode (ie wrong channel), 1.79mhz mode, Sawtooth (with a failsafe to 1.79mhz code if invalid), BASS16 being immediate with 16-bit flag, or 15khz mode. If nothing passed the checks, it's a flag of 0, avoiding redundancy.

- Added a failsafe to force Sawtooth or BASS16 to be disabled when the volume is 0, unless the AUDCTL bits were manually set (like it was always done, in this case).

- Re-wrote the pointers hijacking code to be drastically more performant and robust, using the flags aggressively loaded in memory beforehand. Cases should no longer fail, or be delayed.

- Channels order also no longer matter! Set AUDCTL bits anywhere, all channels benefit instantly, making sound design a frame perfect setup, which also happened to magically fix most timing problems! No more wobbling, or at the very least, reduced to a minimum.

- Optimised code as much as possible for conditional assembly, and making it easier to squeeze the driver to use as little resources as possible with my additions and changes to the code. Still unfinished, but it's getting there now.

- Despite all the additions and improvements, this driver patch performs MUCH better than the previous attempt I made, sometime with really drastic improvements compared to the older junk code I had made up a few months ago!

 

So yeah, these are big changes, and I am not 100% satisfied, so more should be done in due time, however, this appears to be very functional in its current state, so I think you guys will enjoy this!

In the .zip file I included all Tracker/Export binaries I handmade earlier tonight while testing everything I did so far, and I think it's all good right now for use with the latest RMT 1.31 version :) 

Just drag and drop the "RMT Binaries" folder into the current RMT 1.31 install, and replace the binaries, to benefit from this driver update. XEX and SAP exports should still work correctly, based on the few tests I did tonight.

I've also included a test module I made last night. Try playing it with the updated driver, and see what kind of wizardry I made use of to get those sounds :D 

 

I will update RMT in the near future for more fixes and improvements, such as 16-bit pitch display, UI improvements, bug fixes, etc. But this will be for another day.

I've spent a lot of time to work on this project during the last month, so I hope this was well worth it (because I honestly have had a really great time learning with all of this!)

 

Enjoy!

RMT Binaries p16-2-1.zip

 

Stay tuned for more updates in the upcoming days/weeks :P 

  • Like 11
  • Thanks 1
Link to comment
Share on other sites

10 hours ago, MrFish said:

I like the part that's not syncopated (or less syncopated, at least), starting from 1:15.

 

Not sure, how far VinsCool will get with programming RMT. 

Now, that POKEY features were highly developed (some parts were missing due to the missing overvolume mode in the emulation (real triangle wave, and so on) ),  

The Tracker Features and some automatic trim is missing. 

"Automatic trim" for filter sweep changes with a counter control and automatic register changes for that.

 

Have a look at a SID visualizer:

The upper two channels do a waving "forward and backward" Modulation, never clipping. 

 

 

This gives more variation to the sound, makes it broader and "unclamp" sounds. 

For now, this shaping is only possible to do in a passive way. If the Tracker allows the special control for that...

Every Synth sound will get "softer" with it. 

 

 

....

 

 

on the other hand: I wonder, if it is possible to put the visualizer of Altirra somehow to the playback part of RMT. 

At least one could adjust the wave results with a direct feedback on the screen.

A mixed wave of all channels would be helpfull too. 

Edited by emkay
  • Like 2
Link to comment
Share on other sites

Checking the "16 bit feature" i found that one thing is gone.

Using the 16 bit didn't mute the 1st channel of the combination. 

So it was possible to set volume "pulses" there. 

Of course, the 16 bit value on both channels need to be stable. 

But, it is possible to set any generator to channel one of both and to add some FX.  

Link to comment
Share on other sites

27 minutes ago, VinsCool said:

Hmm this is not right, the channel should be muted, can you post an example of this phenomenon? I probably made a mistake somewhere, and hopefully my even more aggressive revision will fix this error.

I think emkay means the old version didn't mute channel 1. You had to do it manually, but you could also leave it on on a lower volume for effects. It seems that is not possible anymore?

  • Like 1
Link to comment
Share on other sites

26 minutes ago, ivop said:

I think emkay means the old version didn't mute channel 1. You had to do it manually, but you could also leave it on on a lower volume for effects. It seems that is not possible anymore?

Ah-ha! In this case, currently it is not possible anymore, indeed.

I've purposefully coded the 16-bit output to force a #0 in the respective AUDC channels to avoid getting unwanted noise along with proper 16-bit tones.

I do miss the Reverse-16 manipulations, but there is still plenty of room to find a way to get all the things work in perfect harmony (of dissonance? :D )

Considering that I've actually re-created the Distortion 6 16-bit hijack, and even created an effect to effectively force it to output any of the 16-bit tables at the input of CMD6 effects, maybe this could be reconsidered... ?

 

But first I need to fix the dumbass attention span error I made last night, and then had caused me an hour of wasted time tracking down what was meant to be an STA but I somehow wrote STY...

...yeah long story short everything I wrote in my RMT hacking thread yesterday turned out to be spot on to the revised idea, and it does indeed work! If only I hadn't been an idiot and needed sleep I would have been able to show some tests lol

(not to venture on a rambling tangent but I've managed to get things to work as planned, regardless of the error causing memory corruption! lol)

Link to comment
Share on other sites

20 minutes ago, VinsCool said:

But first I need to fix the dumbass attention span error I made last night, and then had caused me an hour of wasted time tracking down what was meant to be an STA but I somehow wrote STY...

LOL, I recently did:

 

lda TERM1

sta SAVE1

lda TERM1+1

sta SAVE1

 

It also took me around an hour to finally find that dumb bug :)

 

On muting the first channel, perhaps you can make it optional? Make muting default for new musicians, but allow non-muting for advanced users.

 

Edited by ivop
darn TAB ENTER saving prematurely
  • Like 1
  • Haha 1
Link to comment
Share on other sites

1 minute ago, ivop said:

LOL, I recently did:

 

lda TERM1

 

That's what happens when I copy and paste snippets of my older revisions into the new one, and don't give a proper second thought before pressing enter in the terminal, dropping the .obx in the RMT Binaries folder, and somehow crash RMT for seemingly no reasons, only to find out making proper export binaries spectacularly failed...

The same hour, I had been doing a loop, but I forgot that I shouldn't BNE right at the moment I load a value into index x... which was then DEX, then BNE... you get it, a very stupid endless loop because I was careless LOL

 

That's when I turned off my pc and went to bed ?, I did not want to break even more things because I was having the attention span of a broccoli.

  • Haha 1
Link to comment
Share on other sites

6 minutes ago, VinsCool said:

the attention span of a broccoli.

Haha. Yeah, sometimes it's better to leave it for a while, and when you come back to it, you find the bug in 5 minutes :)

 

Normally I would have done mwa TERM1 SAVE1, but in sizecoding (which I am currently doing for Lovebyte 2022) I quickly learned it's better to write it out, because later it's easier to spot possible optimization options. But you have to write it out correctly, and not what I did ;)

 

On loops, it has happened to me I ended with BCC innerloop, BCS outerloop. Then changed the innerloop logic, changed BCC to BNE or whatever, and the outerloop crashed surprisingly ;)

Edited by ivop
mwa!
  • Haha 1
Link to comment
Share on other sites

13 minutes ago, ivop said:

On muting the first channel, perhaps you can make it optional? Make muting default for new musicians, but allow non-muting for advanced users.

 

Maybe if the AUDCTL bits are manually set for all distortions, but leave the Distortion 6 BASS16 keep the forced #0 output? That could be a fair compromise, while still getting the full 16-bit output-- just no automatic mute on LSB channels.

  • Like 1
Link to comment
Share on other sites

3 minutes ago, ivop said:

Normally I would have done mwa TERM1 SAVE1, but in sizecoding (which I am currently doing for Lovebyte 2022) I quickly learned it's better to write it out, because later it's easier to spot possible optimization options. But you have to write it out correctly, and not what I did ;)

That's pretty much the approach I am taking right now, trying to get things done as fast as possible but also as tiny as possible.

Surprisingly it was all good on that part, I legitimately wrecked everything in a unrelated part I had done earlier, and somehow forgot to double check, so I felt like a total dumbass trying to debug what I did wrong in the aggressive code I did, only to find out it worked perfectly since the beginning, haha ?

Link to comment
Share on other sites

Okay finally I got the proof of concept I wanted to post last night... literally a 5 minutes fix.

Taking a brand new approach for the pointers handling, and a re-organised set of tables... it looks like it's working exactly like the last binaries I posted here, except it's hopefully even faster code to run, and also more compact.

The binary size may seem the same, but the reason is I filled the memory pages for the tuning tables, so that's actually space that was not there before :D 

 

tracker.obx

  • Like 2
Link to comment
Share on other sites

Coming soon:

- Added support for 16-bit pitch calculations, for Distortion 2, A, C, E (C table 2)
- Added support for Sawtooth pitch calculations, as well as the waveform direction through a very simple subtraction test

 

Also shown here is a WIP driver improvement, which should be a bit faster and compact, thanks to a new technique I am trying for the pointers manipulation.

  • Like 6
Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...
  • Recently Browsing   0 members

    • No registered users viewing this page.
×
×
  • Create New...