qr code

BIT-101

Bill Gates touched my MacBook Pro

M8 FM Wavetable Modulation


[ music , dirtywave m8 ]

OK, what the hell is that subject?

I’m going to talk about a sound design technique I figured out on the Dirtywave M8 hardware tracker device that can make some cool evolving sounds.

Most of what I’m talking about here won’t make a whole lot of sense if you don’t have an M8 device (or the headless version you can set up yourself). But even if you don’t, you might find it interesting.

Update 4/7/25

I just realized a simpler way of doing this and updated the post with it. I left the original post as-is because I think it’s good for understanding, and might be the best way to do things in some cases. But make sure you read to the end for the simpler way.

FM Synthesis

So the M8 has an FM synthesis module, which is very powerful for a small handheld device like this. But we’re not going to talk about FM sysnthesis at all here. The important thing is that the FM synthesizer has four oscillators. In FM synthesis, you’d have some of those oscillators modulate other oscillators. But we’re just going to use one of them and ignore the rest. Also, classic FM synthesis generally sticks with sine waves, but the M8 has a bunch of different waves you can choose, including a whole crap ton of wavetables. This is kind of insane, but can be very powerful. Each oscillator has a feedback parameter, which usually feeds the signal back into itself. But if you’re using a wavetable, the feedback parameter is used to index a particular shape in the chosen wavetable.

Setting up the Wavetable

OK, so the M8 comes with 61 wavetables built in. They are numbered (in hexadecimal) from 09 to 45. The M8 manual even shows all the waves in each table. Here’s the first eight:

a page of small wave forms

OK, it doesn’t show all the waves, but it does show one out of four for each table. This is good enough because the missing ones are just interpolated between the shown ones. As you can see, each wave has a hex value from 00 to FF

Here’s a close up:

a closeup of a page of small wave forms

Say we wanted the wave in the center there, number 34. Looking at the top of that column, I see that’s in table 35

I’ve set up an FM synth instrument in a phrase on the M8. I’ve chosen algorithm 0B which just outputs each oscillator separately - no FM synthesis. And I set levels of the first three oscillators (A to C) to 0 and cranked up the final one (D) to AF just to make the wave’s amplitude as visible as possible without clipping. I set oscillator D’s wave to W35 to get the right table, and set the feedback to 34 to get the right wave in that table. It’s playing a D#5 note, and as you can see, it looks pretty close to wave 34 shown in the manual. Hurrah! First step accomplished.

instrument page showing the settings and resulting wave form

Side note: it’s unlikely you’ll often want to do sound design by choosing interesting wave shapes. Though there are examples of just that out there. But I’m just walking through this in order to understand deeply how this all works. Bear with me.

Modulating a Wave

OK. We have a single wave playing. Now we want to modulate it. i.e. make it move between different shapes, which will change the way the tone sounds. Well, we can just modulate the feedback parameter.

Here, I’ve added a modulator for oscillator D, 1 > FBK. This means modulator 1 will affect feedback.

instrument page showing the settings and resulting wave form

But you’ll notice that the waveform is no longer what we originally had. In fact, it matches wave 00 of table 35. And if you could hear the tone playing, you’d notice it has changed.

a closeup of the first couple of waves in a table

So what’s happening here? Well, in order to modulate something we need two values to modulate between - the start point and the end point. The value we enter in the oscillator’s settings is the end point. The start point is what’s shown in the MOD1 field just below and to the far left. It’s 00. If you move MOD1 up to FF, that will make the minimum and maximum values of the modulation the same, and we’ll be back to where we started, including having the right sound back.

instrument page showing the settings and resulting wave form

So we need to set MOD1 to the minimum, or start value of the modulation. This is where it gets a bit complicated. And a video will help a lot.

I’m starting with the same set up as the last screenshot. Then I move MOD1 down to 00. Now we’re back to showing wave 00.

Then I go into the Mods screen and set up an LFO to control MOD 1. It’s going from the default 00 to FF with a triangle wave, and I slowed it down a bit.

You can see that the wave is cycling through a whole bunch of different shapes. In fact, it’s going through every shape in table 35 from 00 to 34. And playing a bunch of different sounds as it goes through those different shapes.

But say I don’t want to go through ALL of those shapes. Maybe just from wave 24 to 34.

a closeup of four waves in a table

How to get there?

Well, we know that the feedback parameter on the oscillator determines the maximum or end value, and the MOD1 setting below sets the start point, but the start point isn’t simply the wave index in this case. It’s mapped so that 00 is the first wave in the table, and FF is the maximum set on the oscillator. So the value is kind of a percentage from 0 to the maximum, displayed in hexadecimal. You could do the math, and figure it all out that way, but that would be painful. Instead, just do it by eye.

First I’m going to remove the LFO by setting its destination to OFF.

mods page showing LFO turned off.

Then I’m going to back to the instrument page, move MOD1 back up to FF and then slowly decrease it until it looks like wave 24.

mods page showing LFO turned off.

When I get to D4, it looks about the same as wave 24 I think. Again, in real world sound design, you’re probably going to be doing this way more by ear than by eye, so don’t feel bad about winging it.

Now, I’ll turn back on the LFO and see what we get.

OK, it’s modulating, but it does from 24 to 34 in a split second and then just seems to stay at 34 for the rest of the cycle.

By the way, don’t worry about the jumping every few seconds, that’s just the note being retriggered as the phrase loops.

What’s happening now is that the LFO is going from 00 to FF and adding that value to the minimum value from the MOD1 setting. That’s way too much. So it goes past the maximum value and just gets stuck there.

What we want is for the LFO to make MOD1 go from D4 to FF. If we subtract those two, we get 2B in hex. Of course, subtracting hexadecimal numbers is not easy for most humans, so I find it easier to count my way up.

I go into the LFO and set the amount to 00 then count up from D4 to FF. First by the left digit, hitting the up arrow: E4, F4, which gives you 20. Then by the right digit, hitting the right arrow for F5, F6, F7, F8, F9, FA, up to FF. When you’re done, you should have 2B.

When you play this now, it’s just going to cycle in the exact range we want.

I also made the chain a bit longer so there aren’t as many jumps.

In case that’s not completely clear, here’s a diagram that might help.

diagram showing the range of waves mapped to a minimum and maximum

The bottom arrow represents the full range of waves in the table, 00 to FF.

You can see the minimum and maximum we want: 24 and 34.

We set MOD1 so it corresponds with the minimum, and make up the rest in the LFO.

Final Project

For a (somewhat) more real-world example, and to break down the steps…

  1. I chose a different table - 3B.
  2. I turned off the LFO.
  3. Set MOD1 to FF.
  4. Found an end point I liked the sound of - 3C.
  5. Moved MOD1 down till I found a starting point I liked - 6F.
  6. Then set the LFO to the difference of FF and 6F, which is 90.

I did all this by ear, not looking at tables and wave numbers.

This gives a complex, rhythmic sound, even though only a single note is playing.

Of course, instead of a free running triangle LFO, you could use a ramp or some other shape, retriggered, or just use an envelope of your choice.

The main point of this post was just figuring out the start and end points of the modulation and how to set them, which was not at all obvious to me for quite a while.

Also, I’m still a bit of a noob with this device. In fact, I’m using the headless version still, though my real M8 should be arriving this week I hope! Anyway, if there’s anything incorrect in this post, please let me know.

Update

I figured out a simpler way of doing this.

  1. Set the feedback param of the oscillator to FF. This makes the modulation range 00 to FF, which exactly map to the wave indexes, so all values used will map exactly to the wave numbers.
  2. Set MOD1 (or whichever mod you are using) to the minimum value, say 24.
  3. Now set up the LFO with the range you want your modulation to cover. If you want the modulation to go from 24 to 34, set the amount to 10. It will add 10 to the minimum 24, making it range up to 34.

mods page showing LFO turned off. mods page showing LFO turned off.

I think both ways are still valid and result in the same sound, so which one you use is up to you.

« Previous Post

Comments? Best way to shout at me is on Mastodon

Or share this post directly on Mastodon