Mod Archive Forums Mod Archive Forums
Advanced search  

News:

Please note: Your main modarchive.org account will not work here, you must create a forum account to post on the forums.

Show Posts

This section allows you to view all posts made by this member. Note that you can only see posts made in areas you currently have access to.

Messages - DZ-Jay

Pages: [1] 2 3 4 5
1
Players / Re: Understanding effects processing
« on: June 23, 2024, 18:07:57 »
I noticed that all my patterns were out of tune with respect to each other!

It turns out that each instrument sample in the original module was tuned differently, so the notes in the patterns reflected the scaling of the sample to the appropriate tone rather than true notes.

No worries, I re-tuned everything, and now it sounds much better.  Attached is the latest version of my track.

Progress on the track is slow because I still need to code the patterns mostly by hand -- especially now that I have to re-tune the notes by ear.

The good news is that the tracker and the effects seem to work as intended.  Woo-hoo!  This makes all that hard work in the past several months worth it. :)

       -dZ.

2
Players / Re: Arpeggio processing ...
« on: June 10, 2024, 13:35:29 »
Arpeggio effect can only process upwards, there is no way to do it backwards, your arp chord must start with the lowest note.

Thanks, I figured as much.  Luckily, I have an ace up my sleeve:  my instrument definition (which are tones instead of samples) supports an envelope, vibrato, and a 4-step arpeggio. :)

In any case, it is not a big problem to start with the lowest note.

    -dZ.

3
Players / Re: Arpeggio processing ...
« on: June 09, 2024, 16:46:39 »
Still tracking, but I have a question on the arpeggio effect (0xy):  Is there a way to offset backwards?  I mean, if I have a chord where the root is C-5, but the other two semi-tones are A-4 and F-4.

I suppose I could re-arrange the not with the note at A-4 and offsets for F-4 and C-5 ... but I was wondering if it could be done differently.

    -dZ.

4
Players / Re: Understanding effects processing
« on: June 02, 2024, 20:10:38 »
Trackin', baby!!! Yes, sirree!

I took a break from working on the tracker and spent some time this week-end working with the tracker -- that is, I've been tracking a song to test the music player with all channels and effects.

Since I am not a musician, I searched my ancient archives of modules from when I ran an FTP server back in the 1990s (yeah, baby!) and found a suitable XM module that met my special criteria:
  • It is in XM format.
  • Employs numerous channels.
  • Uses samples that could be substituted by synthesized tones.
  • Uses a wide variety of effects on more than one track at a time.
And more importantly,
  • It is a cool track that I like.

I first whipped up a quick-and-(not-so)-dirty script to export the patterns from the XM track into ASCII text files.  I then used the output as the basis for creating patterns for my tracker -- which uses a number of macros to encode the ASCII patterns to my data format.

Of course, there are a few things that I need to adjust by hand since the frequency and amplitude ranges in my platform are different from what XM supports; but overall, it's a pretty easy transformation.  I expect to automate this even more in the future, using look-up tables and specialized mapping functions to make the adjustments directly.

Anyway, attached find my first try at re-creating an XM track on the Intellivision Music Tracker 2.0.  It is far from complete -- I've only translated a few channels of a couple of patterns.  (I also remixed it a bit with a more disco intro.)

The good news is that it all seems to work well, and all effects execute as expected.

I will continue working on this module and using it as my "test-track" as I continue developing my tracker, and will post more progress in the future.

     Cheers!
    -dZ.

5
Players / Re: Understanding effects processing
« on: May 18, 2024, 17:39:02 »
It's been slow but steady, and I have some progress to report.

The note delay (EDx) turned out to be more difficult than expected, mostly because of the resource constraints of the platform.

After much toil and many false starts, eventually I gave up on continuing to process the previous note during the delay, and decided to just not update the channel until the delay concludes.  This means that the channel state is left as is -- with whatever tone and volume it had at the moment the new note is read -- while the delay counts down to zero, at which point we trigger the new note.

It's not ideal, but serviceable, and saves me a lot of headache in having to make the tracker keep the new note event details in memory, while retaining the old one's as well and process it as if it were still active.  (I have up to 6 channels to support, and a full duplicate of the buffer for each of them is quite a big chunk of the memory available on the Intellivision.)

Anyway, it seems to work well in practice, to some extent.

The full roster of available effects on the Intellivision Music Tracker so far are:
Code: [Select]
--------------------------------                ------
Standard Effects                                Status
--------------------------------                ------
$00: 0   Arpeggio                               Done
$01: 1   Portamento Up                          Done
$02: 2   Portamento Down                        Done
$03: 3   Portamento To Note                     Done
$04: 4   Vibrato                                Done
$05: 5   Portamento To Note + Volume Slide      Done
$06: 6   Vibrato + Volume Slide                 Done
$07: 7   Tremolo                                Done
$08: 8   ---
$09: 9   ---
$0A: A   Volume Slide                           Done
$0B: B   Jump To Order
$0C: C   Set Note Volume
$0D: D   Pattern Break
$0E: E   E Sub-Commands (Dispatcher)            Done
$0F: F   Set Song Speed                         Done
$10: G   Set Global Volume                      Done (Controls volume attenuation only.)
$11: H   Global Volume Slide                    Done (Controls volume attenuation only.)
$12: I   ---
$13: J   ---
$14: K   ---
$15: L   Set Envelope Position
$16: M   ---
$17: N   ---
$18: O   ---
$19: P   ---
$1A: Q   ---
$1B: R   Re-trigger Note + Volume Slide
$1C: S   ---
$1D: T   Tremor
$1E: U   ---
$1F: V   ---
$20: W   ---
$21: X   X Sub-Commands
$22: Y   ---
$23: Z   ---

--------------------------------                ------
Standard Effects                                Status
--------------------------------                ------
$00: E0  ---
$01: E1  Fine Portamento Up                     Done
$02: E2  Fine Portamento Down                   Done
$03: E3  ---
$04: E4  Set Vibrato Waveform
$05: E5  ---
$06: E6  Pattern Loop
$07: E7  Set Tremolo Waveform
$08: E8  ---
$09: E9  Re-trigger Note
$0A: EA  Fine Volume Slide Up                   Done
$0B: EB  Fine Volume Slide Down                 Done
$0C: EC  Note Cut
$0D: ED  Note Delay                             Done
$0E: EE  Pattern Delay                          Done
$0F: EF  ---

--------------------------------                ------
"X" Extended Sub-Command Effects
--------------------------------                ------
$00: X0  ---
$01: X1  Extra Fine Portamento Up               Done
$02: X2  Extra Fine Portamento Down             Done

I think I'll take a break from the tracker player and actually do some tracking.  It's time to test this baby and make sure it works as expected. :)

      -dZ.

6
Players / Re: Understanding effects processing
« on: April 06, 2024, 14:28:07 »
Another week, another progress report.

After going off on a tangent foolishly attempting to optimize effects processing, I hit a rather nasty brick wall.  I ended up reverting most of those changes and going back to the way I had it working.

Plus ça change ...

Anyway, I added a few more effects:  The tracker now has dynamic song speed (Fxx) and pattern delay (EEx), among other new tricks.

Below is the latest list of effects and their status:
Code: [Select]
--------------------------------                ------
Standard Effects                                Status
--------------------------------                ------
$00: 0   Arpeggio                               Done
$01: 1   Portamento Up                          Done
$02: 2   Portamento Down                        Done
$03: 3   Portamento To Note                     Done
$04: 4   Vibrato                                Done
$05: 5   Portamento To Note + Volume Slide      Done
$06: 6   Vibrato + Volume Slide                 Done
$07: 7   Tremolo                                Done
$08: 8   ---                                   
$09: 9   ---                                   
$0A: A   Volume Slide                           Done
$0B: B   Jump To Order                         
$0C: C   Set Note Volume                       
$0D: D   Pattern Break                         
$0E: E   E Sub-Commands (Dispatcher)            Done
$0F: F   Set Song Speed                         Done
$10: G   Set Global Volume                      Done (Controls volume attenuation only.)
$11: H   Global Volume Slide                    Done (Controls volume attenuation only.)
$12: I   ---                                   
$13: J   ---                                   
$14: K   ---                                   
$15: L   Set Envelope Position                 
$16: M   ---                                   
$17: N   ---                                   
$18: O   ---                                   
$19: P   ---                                   
$1A: Q   ---                                   
$1B: R   Re-trigger Note + Volume Slide         
$1C: S   ---                                   
$1D: T   Tremor                                 
$1E: U   ---                                   
$1F: V   ---                                   
$20: W   ---                                   
$21: X   X Sub-Commands                         
$22: Y   ---                                   
$23: Z   ---                                   
                                               
--------------------------------                ------
Standard Effects                                Status
--------------------------------                ------
$00: E0  ---                                   
$01: E1  Fine Portamento Up                     Done
$02: E2  Fine Portamento Down                   Done
$03: E3  ---                                   
$04: E4  Set Vibrato Waveform                   
$05: E5  ---                                   
$06: E6  Pattern Loop                           
$07: E7  Set Tremolo Waveform                   
$08: E8  ---                                   
$09: E9  Re-trigger Note                       
$0A: EA  Fine Volume Slide Up                   Done
$0B: EB  Fine Volume Slide Down                 Done
$0C: EC  Note Cut                               
$0D: ED  Note Delay                             
$0E: EE  Pattern Delay                          Done
$0F: EF  ---                                   
                                               
--------------------------------                ------
"X" Extended Sub-Command Effects               
--------------------------------                ------
$00: X0  ---                                   
$01: X1  Extra Fine Portamento Up               
$02: X2  Extra Fine Portamento Down             

Aiming for Note Delay (EDx) next and a few of the other "global" control commands like Pattern Loop (E6x), Pattern Break (Dxx), Jump To Order (Bxx), etc.

Here's hoping for a smooth ride!

   -dZ.


P.S. One of these days I will have to start tracking a song for real to make sure it all works ... Someday ...

7
Players / Re: Understanding effects processing
« on: March 17, 2024, 17:23:16 »
Progress, you ask?  Why, yes.  We have some.  :)

I fixed a bug* in which "tick-zero of a row" was confused with "first tick of a note," which caused the tick-zero handling to only be executed when a new note is started.  DOH!

(* The "bug" existed in my head as well, since I wrote the code to work that way because that is how I understood it.  Imagine my shock and surprise when I finally figured out that it was all wrong.)

We now have the following effects supported:
  • 0xy: Arpeggio
  • 1xx: Portamento Up
  • 2xx: Portamento Down
  • 3xx: Portamento To Note
  • 4xy: Vibrato
  • 5xy: Portamento To Note + Volume Slide
  • 6xy: Vibrato + Volume Slide
  • 7xy: Tremolo
  • Axy: Volume Slide
  • E1y: Fine Portamento Up
  • E2y: Fine Portamento Down
  • EAy: Fine Volume Slide Up
  • EBy: Fine Volume Slide Down
  • Gxx: Set Global Volume

That's a pretty nice roster.

All these effects have been tested and work as expected -- well, at least the way I understood them to work, based on my research, reference documents, and the feedback from this forum.

I'm quite happy with the results.  I feel now that I have a rather solid framework that handles ticks and effects correctly, so adding new effects should go smoother in the future -- I mean, what could possibly go wrong?  ;D  (Said the guy that has had to re-write his tracker engine multiple times to fix design flaws ...)

Anyway, my next step is to implement a few more of the low-hanging fruit effects, such as  Set Song Speed (Fxx), Tremor (Txx), etc., and see how it goes.

Stay tuned! (Har! Har! see what I did there?)

     -dZ.


UPDATE: Added Gxx effect.

8
Players / Re: Arpeggio processing ...
« on: March 10, 2024, 16:04:59 »
OK, never mind on this -- it seems to be a quirk of FT2, so I won't bother with it.

I found this in the MilkyTracker documentation, comparing the various implementations (FT2 description in red):

https://milkytracker.org/docs/MilkyTracker.html#fx0xy
Quote
Explanation:
Arpeggio quickly alters the note pitch between the base note (C-4) and the semitone offsets x (3 = D#4) and y (7 = G-4). Each pitch is played for the duration of 1 tick. If speed is higher than 3 (meaning there are more than 3 ticks per row), the sequence is looped.

ProTracker 2/3
Base note is played for tick 0, then the semitone offset x for tick 1, then semitone offset y for tick 2.

Fasttracker II
Base note is played for tick 0, then the semitone offset y for tick 1, then semitone offset x for tick 2.


It seems that the intention (and most common implementations) is to cycle through base, base +x, and base + y.

I do have one question, though.  Is it expected that we should skip tick zero of every row, or that we should restart counting the sequence "base, base + x, base + y" on every row?

This would make the arpeggio sound a bit irregular, depending on how many ticks there are in a row.  For instance, if the song speed is 5 ticks per row, the arpeggio would cycle like this:

Tick #semi-tone
0skipped (base)
1base
2base + x
3base + y
4base
0skipped (base)
1base
2base + x
3base + y
......

In contrast, the original way I had implemented it (and the way I thought it should work) was to process the command on every tick and always cycle through the sequence "base, base + x, base + y" for the duration of the note (or until the effect is deactivated).

For those with more experience than me, especially from the musician side of things, how do you think this effect is expected to work?

    -dZ.

9
Players / Arpeggio processing ...
« on: March 10, 2024, 14:12:12 »
I have a question about the Arpeggio (0xy) effect.

All the documentation I read on common implementations of XM (FT2, OpenMPT, MilkyTracker, etc.) state that the effect alternates between 3 semi-tones:
  • Base note
  • Base note + x param
  • Base note + y param

This makes perfect sense to me and it is how I originally implemented it.

However, I am looking at the ported FT2 code and that logic appears to be incorrect.  Unless I am completely misunderstanding something, the code works like this:
  • The effect is processed only on non-zero ticks.
  • It uses the song timer (i.e., the tick counter -- which counts down on every tick from the song speed until zero) to determine the semi-tone offset to use:  a value that cycles through 0, 1, and 2.
  • Those values are used like this:
    • 0: Base note
    • 1: Base note + x param
    • 2: Base note + y param

Essentially, the three offsets are read from a table of 16 entries, using the count-down timer as an index, so the values are read in reverse:

Arpeggio Table:
Code: [Select]
0, 1, 2, 0, 1, 2, 0, 1, 2, 0, 1, 2, 0, 1, 2, 0

What all this means in practice is that the first tick of every row is skipped, and the countdown causes it to process the parameters in reverse.

Therefore, the ultimate product is the something like in the following table.  Consider a song speed of 8 ticks per row. 

Tick #TimerTbl ValueResult
0 (start of row)8 (timer recycled at zero of last row)SkippedBase
17arpTab[7] = 1Base + x param
26arpTab[6] = 0Base
35arpTab[5] = 2Base + y param
44arpTab[4] = 1Base + x param
53arpTab[3] = 0Base
62arpTab[2] = 2Base + y param
71arpTab[1] = 1Base + x param
08 (timer recycled at zero)SkippedBase
17arpTab[7] = 1Base + x param
26arpTab[6] = 0Base
............

Moreover, because the first tick on every row is skipped, when you use a speed number which is a multiple of 3, it will cause the base note to be played twice.

This is sort of weird to me, so perhaps someone with more experience can shed some light on how it should work in practice, or whether this is the expected behaviour.

    -dZ.

10
Players / Re: Question about Volume Slide (Axy)
« on: March 09, 2024, 14:23:34 »
I also, went ahead and added the Fine Volume Slide (EAx, EBx) and Fine Portamento (E1x, E2x) effects, just because they are the same as the regular effects, but played on tick zero only.

I assume you understand that "Fine" commands do it more slowly and gradually?

Yes.  From what I read in some documents, it appears that the only different between the normal and the "fine" commands is that the latter is applied on tick zero only -- i.e., once per row instead of once per tick.

For example, on E1x:
https://wiki.openmpt.org/Manual:_Effect_Reference#Effect_Column_2
Quote
Similar to 1xx, but only applies on the first tick of the row.

https://milkytracker.org/docs/MilkyTracker.html#fxE1x
Quote
Explanation:    
Works similarly to 1xx portamento up, only the slide is a lot finer because the effect is applied only once per row.

Also, the ported source code of FastTracker II shows that the functions that implements commands 1xx and E1x are identical -- with the only difference being when (how often) they are invoked.

Then again, my experience is exceedingly narrow, and limited mostly to what I read online.  Do you suppose that there may be a bit more nuance to it that I am missing?

    -dZ.

Pages: [1] 2 3 4 5