SID as a drum machine?

Would be curious to know if an interface could be made to turn a SID into a drum machine? WOuld be wicked to have a MIDIbox SID sitting next to a SID drum machine (MIDIbox or other).

I had not realized there were drum machine programs for the C64.

http://c64music.blogspot.com/2005/11/commodore-64-as-drum-machine.html

tm

Yeah, the MBSID with the MBSEQ would be a nice drum machine even for live performance. If you need this only in a studio, you have to build only the basic version (CORE+SID PCBs), the rest is controlled via MIDI. For playing live I recommend to build the fullest version, to change all the parameters on-the-fly… Hope it helped.

A special drum firmware is a nice idea, but who creates the sounds?

There are some percussion patches in the SID preset library, but they don’t sound as good as those we know from the favourite C64 tunes. So, if somebody could try to optimize the drum sounds (it’s not due to a lack of MBSID engine possibilities, but just my personal lack of knowledge on drum sound programming), I could think about the requirements for a firmware variation.

Currently, the only solution is to use a single core for each drum sound, or to sample the sounds, and to play them with a sampler.

But I guess that a special firmware could allow to play drums on 3 oscillators indepently, and to provide the same dynamic allocation like MBFM, which means: 3 oscillators could quickly switch between the sound settings, and therefore play any drum sound without changing the patch, just selected by the note number)

However, first it’s your turn: give me at least 128 drum patches! :slight_smile:

Best Regards, Thorsten.

awesome idea - before weekend i will make 8 BD patches, 8 SD, 4 OH, 4 CH, maybe some rimshots, cymbals, …

unfortunately snare will sound really poor with just 1 osc… i’ll see what i can do… maybe i can modulate the noise at high enough frequency so we get the lower snare harmonics? LFO won’t do though… maybe WT modulation? how fast can that be?

If you could send me some drum patches until this weekend, this would be nice. I just thought about the technical realization, and came to he conclusion, that with some acceptable compromisses I could create a first version very fast (maybe at saturday afternoon :slight_smile:

Here some specs I wrote down:

Project Name: MIDIbox SID-D (MBSID-D)

Key features:

* drum sounds playable from a single MIDI channel (by default channel 10)
* in addition to the MIDI channel, also the note range can be specified, so that multiple MBSID-D modules can be assigned to different note ranges within channel 10
* will use the same patch structure like a normal MBSID - this saves me from creating new, dedicated tools (JSynthLib)
* this means also, that drum sounds can be edited from a normal MBSID control surface via remote
* in addition, MBSID-D should also provide a control surface which should be similar to a common MBSID control surface, just downstripped to the drum parameters. Hardware compatible with Step C (but there are also limitations, see below)
* 4 drum kits per BankStick, each drum kit consists of 30 drum sounds
* only one oscillator per drum voice
* Software Engine will provide following dedicated functions for each voice seperately: 32 step wavetable with 3 tracks, 2 LFOs, 1 EG
* BankStick required! Up to 8 BankSticks (for 32 drum kits!)
* dynamic switching between the patches depending on the MIDI notes being played
* this means that a sequencer has direct access to all 30 drum sounds of a drum kit, but only 3 sounds can be played at the same time at each module. If more than three notes are played, the ‘oldest’ sound will be dropped (exception: grouped percussions) - Re-use MBFM
* the firmware should provide drum groups, e.g. to combine an open HiHat with closed HiHat - grouped percussions should not change the oscillator - Re-use MBFM
* each drum voice uses following parameters of a common MBSID patch structure:

[tt]
CC # | Hex | Description                                  | Range      | Reset
=====+=====+==============================================+=============+======
  1 | 01h | Modulation Wheel                            |  0-127: val |    0
-----±----±---------------------------------------------±------------±-----
  2 | 02h | Velocity Init Value                          |  0-127: val |    0
  3 | 03h | Modulation Wheel Init Value                  |  0-127: val |    0
-----±----±---------------------------------------------±------------±-----
  13 | 0Dh | Velocity Depth                              |  0- 63: neg |  127
    |    | negative depth (0-63) inverts the effect    |    64: off |   
    |    |                                              | 64-127: pos |   
  14 | 0Eh | Modulation Wheel Depth                      |  0- 63: neg |  127
    |    | negative depth (0-63) inverts the effect    |    64: off |   
    |    |                                              | 64-127: pos |   
-----±----±---------------------------------------------±------------±-----
  17 | 11h | Voice Transpose                              |  0- 63: neg |  64
    |    |                                              |    64: off |   
    |    |                                              | 64-127: pos |   
-----±----±---------------------------------------------±------------±-----
  21 | 15h | Voice Finetune                              |  0- 63: neg |  64
    |    |                                              |    64: off |   
    |    |                                              | 64-127: pos |   
-----±----±---------------------------------------------±------------±-----
  25 | 19h | Oscillator Pitchrange in Number of Notes    |    0: off  |    2
    |    | Used by PitchBender and Finetune            | 1-127: val  |   
-----±----±---------------------------------------------±------------±-----
  33 | 21h | Oscillator Waveform                          |            |    4
    |    |  Bit 0: Triangle                            |            |
    |    |  Bit 1: Saw                                |            |
    |    |  Bit 2: Pulse                              |            |
    |    |  Bit 3: Noise (disables all other waveforms)|            |
    |    |  Bit 4: Disable Voice                      |            |
    |    |  Bit 5: Sync (*)                            |            |
    |    |  Bit 6: Ringmodulator (*)                  |            |
    |    | (* not sure, if sync and ringmod makes sense)|            |
-----±----±---------------------------------------------±------------±-----
  37 | 25h | Oscillator Pulsewidth                        |  0- 63: neg |  64
    |    |                                              |    64: off |   
    |    |                                              | 64-127: pos |   
-----±----±---------------------------------------------±------------±-----
  44 | 2Ch | Filter Channel                              |            |    0
    |    |  Bit 0: Filter for Voice off                |            |
  46 | 2Eh | Global Filter CutOff frequency              |  0-127: val |  127
  47 | 2Fh | Global Filter Resonance                      |  0-127: val |    0
-----±----±---------------------------------------------±------------±-----
  49 | 31h | Voice Attack                                |  0-127: val |    0
-----±----±---------------------------------------------±------------±-----
  53 | 35h | Voice Decay                                  |  0-127: val |    0
-----±----±---------------------------------------------±------------±-----
  57 | 39h | Voice Sustain                                |  0-127: val |  127
-----±----±---------------------------------------------±------------±-----
  61 | 3Dh | Voice Release                                |  0-127: val |    0
-----±----±---------------------------------------------±------------±-----
  64 | 40h | LFO1 Rate                                    |      0: off |    0
    |    |                                              |  1-127: val |
  65 | 41h | LFO2 Rate                                    | see above  |    0
-----±----±---------------------------------------------±------------±-----
  72 | 48h | LFO1 Depth                                  |  0- 63: neg |  64
    |    | negative depth (0-63) inverts the waveform  |    64: off |   
    |    |                                              | 64-127: pos |   
  73 | 49h | LFO2 Depth                                  | see above  |  64
-----±----±---------------------------------------------±------------±-----
  78 | 4Eh | ENV1 Depth                                  | see above  |  64 
-----±----±---------------------------------------------±------------±-----
  80 | 50h | LFO1 Mode                                    |            |    3
    |    |  Bit 0: Enable LFO                          |            |
    |    |  Bit 6-4: Waveform                          |            |
    |    |            0: Sine                          |            |
    |    |            1: Triangle                      |            |
    |    |            2: Saw                            |            |
    |    |            3: Pulse                          |            |
    |    |            4: Random                        |            |
    |    |            5: analog input                  |            |
  81 | 51h | LFO2 Mode                                    |            |
-----±----±---------------------------------------------±------------±-----
  86 | 56h | Envelope 1 Curve                            |  0-63: neg |  64
    |    | Note: Curve must be enabled seperately      |      0: lin |
    |    | for Attack/Decay/Release parameter w/ CC#110 | 64-127: pos |
-----±----±---------------------------------------------±------------±-----
  88 | 58h | Envelope 1 Attack                            |  0-127: val |    0
  89 | 59h | Envelope 1 Decay                            |  0-127: val |    0
  90 | 5Ah | Envelope 1 Sustain                          |  0-127: val |    0
  91 | 5Bh | Envelope 1 Release                          |  0-127: val |    0
-----±----±---------------------------------------------±------------±-----
  97 | 61h | Assigned LFOs for Pitch of Voice            |            |    1
    |    |  Bit 0: LFO1 controls Note Pitch on/off    |            |
    |    |  Bit 1: LFO2 controls Note Pitch on/off    |            |
-----±----±---------------------------------------------±------------±-----
101 | 65h | Assigned LFOs for Pulsewidth of Voice        |            |    2
    |    |  Bit 0: LFO1 controls PulseWidth on/off    |            |
    |    |  Bit 1: LFO2 controls PulseWidth on/off    |            |
-----±----±---------------------------------------------±------------±-----
105 | 69h | Assigned Envelopes for Voice                |            |    0
    |    |  Bit 0: ENV1 controls Pitch                |            |
    |    |  Bit 1: -                                  |            |
    |    |  Bit 2: -                                  |            |
    |    |  Bit 3: -                                  |            |
    |    |  Bit 4: ENV1 controls PulseWidth            |            |
    |    |  Bit 5: -                                  |            |
-----±----±---------------------------------------------±------------±-----
108 | 6Ch | Assigned LFOs for Global Filter CutOff Frequency  |        |    4
    |    |  Bit 0: LFO1 controls CutOff on/off        |            |
    |    |  Bit 1: LFO2 controls CutOff on/off        |            |
-----±----±---------------------------------------------±------------±-----
109 | 6Dh | Assigned Envelopes for Global Filter        |            |    0
    |    |  Bit 0: ENV1 controls CutOff                |            |
-----±----±---------------------------------------------±------------±-----
110 | 6Eh | Use curve parameter on ENV1                  |            |    0
    |    |  Bit 0: ENV1, Attack                        |            |
    |    |  Bit 1: ENV1, Decay                        |            |
    |    |  Bit 2: ENV1, Release                      |            |
-----±----±---------------------------------------------±------------±-----
111 | 6Fh | Sound Engine Options                        |            |    0
    |    |  Bit 0-7: reserved                          |            |
-----±----±---------------------------------------------±------------±-----
117 | 75h | Assign Velocity to Controller                |    0: off  |    0
    |    |                                              | 1-127: Ctrl |
118 | 76h | Assign Modulation Wheel to Controller        |    0: off  |    0
    |    |                                              | 2-127: Ctrl |
-----±----±---------------------------------------------±------------±-----
120 | 78h | Voice Wavetable Rate                        |  1-127: val |    0
    |    |                                              |      0: off |   
121 | 79h | Assign Wavetable Parameter #1 to Controller  |      0: off |    0
    |    |                                              | 1-127: Ctrl |
122 | 7Ah | Assign Wavetable Parameter #2 to Controller  |      0: off |    0
    |    |                                              | 2-127: Ctrl |
123 | 7Bh | Assign Wavetable Parameter #3 to Controller  |      0: off |    0
    |    |                                              | 1-127: Ctrl |
-----±----±---------------------------------------------±------------±-----
124 | 7Ch | Oscillator Phase synchronization            | 0: off      |   
    |    |                                              | 1: on      |
-----±----±---------------------------------------------±------------±-----
125 | 7Dh | MIDI Sync (synchronizes LFOs/ENVs/WTs        |  0: intern |    0
    |    | to MIDI clock)                              |  7: all    |
    |    |  Bit 0: sync Wavtable Sequencer            |            |
    |    |  Bit 1: sync LFOs                          |            |
    |    |  Bit 2: sync Envelopes                      |            |
    |    |                                              |            |
    |    | Examples: 01: sync only sequencer,          |            |
    |    |          02: sync only LFOs                |            |
    |    |          06: sync LFOs and envelopes        |            |
[/tt]

In addition, following parameters should be globally available in a Drum Kit:

  • Volume
  • Global CutOff and Resonance
  • Global Frequency Transpose
  • Global Filter Configuration (LP/BP/HP)
  • Split Layer (Lower Note, Higher Note)
  • Layer Note Transpose

Drumkit can be selected via Program Change Event (0..31)

This gives us following possibilities:

* MBSID-D can be used standalone or as MIDI slave of Step A, B or C interface
* a complete Step C (4 SIDs) can be partitionized like desired. For Example: use two SIDs with MBSID firmware, and two SIDs with MBSID-D firmware - one MBSID-D assigned to note range …B-2, the other to Note Range C-3…
* Or use MBSID-D as standalone drum expander(s) without CS in addition to your normal MBSID setup. So long you don’t want to edit the drum sound parameters, you can connect the MIDI-INs of your MBSID-D(s) in parallel to the MIDI IN of your normal MBSID
* It won’t be possible to edit parameters of slaves from a “master MBSID-D” (reason: see my posting from 19.11.)
* patches edited on a normal MBSID can be partly re-used for the MBSID-D. No conversion is required, just only the restrictions (see parameter list above) have to be taken into account

I don’t know, how much I can reduce the normal firmware, but perhaps there will be enough memory free for an additional 8-track drum sequencer - these sequences could be saved in one of the BankSticks! :slight_smile:
(maybe I should this take into account for the 303 Control Extension)

Best Regards, Thorsten.

TK: You rule. This would be awesome, specially the option to put MBSID-D in a quadbox… truly awesome!

:o when does the madness stop; 

i’ll try to make some patches too.. nice project

Please send me as much percussion patches as you can! :slight_smile:

Not only the standard patches for Bass/Snare drum, HiHat, Cymbal, etc. are for interest, but especially some “clicks and pops”, which sound C64ish.

Best Regards, Thorsten.

if my box was ready, i was already preparing a lot of drum patches…

a while ago i did a 4 complete drum kit + bleps, clicks and snaps using a couple of ms20

but to save them i used a sampler, in this case could be  just better…

sigh..sigh…i feel so useless…

Today I made some performance evaluations.

It is not a good idea to load the drum sounds directly from BankStick at the time they should be played, because this leads to a latency of 5 mS. Thats the time which passes to load 42 bytes from a BankStick when other tasks are running in background (the software engine which handles the LFOs and ENVs takes ca. 50% of this time)

So, the only way to realize a latency much below 500 uS is to preload the whole Drumkit into RAM - thats the way I will go. The RAM data can be compressed, I hope that at least 20 drum sounds will be loadable at once - this should be enough

This leads to the side effect, that a MBSID-D master has no RAM anymore to edit the parameters of a MBSID-D slave in realtime. However, this should also be acceptable. It will still be possible to prepare a drumkit on the master, and to dump it to the slave before the use. Maybe the use of MBSID-D as a CS master is a corner case anyhow - I will still use my common MBSID as master

Another point which I noticed and which will affect the sound architecture is the damned SID envelope bug. The VCA envelope of the previous sound can affect the envelope of the new sound (hick ups). One measure to compensate this is to clear the envelope registers when the sound is finished (the required delay could be calculated from the ADSR settings). Another possibility is to clear the registers, to wait some time (I don’t know how long), and to play the new sound thereafter… this would increase the latency… however, lets see

Best Regards, Thorsten.

The application is ready, but I haven’t received any drum sounds so far - come on, guys! :wink:

Best Regards, Thorsten.

i’m really sorry TK - this weekend was totally crazy for me - i had to help moving my father and assembling his kitchen :confused:

i’ll really try hard to find time during this week.

the following goes for 6581. haven’t tried it with 8580 yet.

from what i was trying i can say this - the bassdrums can sound pretty good, especially for 808-like sounds. triangular waveform has very quiet higher harmonics and sounds almost like sine even without the lowpass filter. other waveforms result in distorted/overdriven-like sound, can be used for gabber. combined waveforms aren’t useful for bassdrums cause they’re really low on bass.

the high hats will be no problem. the pitched noise offers a variety of tonal options. even without filters.

toms will be fine, similar to bassdrum.

snares will be the toughest… how fast can the LFO go? how fast can the WT go? it’s really nice to have the “tone” in the snare sound, otherwise it’s way too hollow. something could be done with the lower frequency noise… i’ll see.

other percussion sounds could probably realized without big problems and i don’t think they’re as critical as the basic ones.

i’m wondering - would it be possible to set the filter on/off per-patch? since the patches are only 1 channel it could be done. or do you think the popping when turning the filter channels on/off would be too annoying? it would be really useful.

others could post their experience and observations on drum sounds design here. what do you guys think about the snares?

Have you ever tried the WT examples in the preset library? Eg, “WT Synth Drum 11” is a pretty nice snare drum - I’m especially searching for improved versions of these WT sounds, and for additional C64 typical special sounds

LFO frequency: see bottom of http://www.ucapps.de/midibox_sid/sid_cc_implementation_chart.txt

Wt frequency goes up to 1.2 kHz (rate=127)

Filter: see CC#44 in the table above!

It doesn’t pop so long you are playing the sound which gets use of the filter very often. Thats difficult to describe for somebody who isn’t that much into the MBFM voice allocation algorithm, let’s try it: first the algorithm searches for a voice which was assigned to the same instrument like the new one. If such a voice/instrument combination is available, the appr. voice will be taken -> no filter crackle. If it was not found, it takes the first voice slot of the “voice queue”, normaly the voice which wasn’t used the longest time. If this voice was also assigned to a filter -> evtl. filter crackle. If all three voices are allocated, the this “longest” note will be dropped… replaced by the new one.  -> evtl. filter crackle.

So, it depends on type of drum patches which are combined, on the frequency of use, and on the style which should be played (maybe the sounds are so loud, that the popping filter is not regognized?)

I already thought about instrument groups (especially for HiHats, see above), maybe an additional feature could be the possibility to assign the group to a special voice in order to avoid that the filter is switched on/off. The implementation is a piece of cake, but I fear that the usage gets too complicated for most people… :-/ Do you know a more simple solution?

Best Regards, Thorsten.

P.S.: to avoid that somebody gets it wrong: this algorithm works great with MBFM, no crackling sounds can be regognized when voices are assigned to different instruments. The “crackle” problem is a SID specific problem, since it only provides one filter for all three oscillators. In other words: this is a resource which has to be shared.

A (very) short demo with a high-pitched BD, snare and hihats: http://www.midibox.org/midibox_sid/mbsid-d_demo1.mp3

Best Regards, Thorsten.

Great demo Thorsten!    If that doesn’t get the true SID heads drooling then I dont know what will.

If I had one built Id be programming drum sounds!!

great work

~Steve

here are a few patches for you Thorsten (and others):

http://s12.yousendit.com/d.aspx?id=3P1VW5DIU6V480UTCJEBGD4TTR

i hope anyone likes any of them and can use them :confused:

they sound much better on 8580 but also pretty much recognizable on 6581.

one thing i noticed - the osc envelope gets retriggered randomly when using WT. is that a known error? it happens on both chips.

anyway - all the samples are 1OSC, max 1 ENV, max 1 LFO. no filters. i think the bassdrums and the snares are the best but the cymbals are also usable. oops i just remembered i forgot the clap  :smiley: i’ll see what i can do.

any feedback appreciated.

Hi Kokoon,

thank you for the patches - there are really nice ones! :slight_smile:

To the random gate triggers: I just have splitted the topic, since this could become a large new thread :wink:

http://www.midibox.org/forum/index.php?topic=5748.0

Best Regards, Thorsten.

i’m glad you like the patches. i can make many more.

a question - i found the patches work (sound) alot better if you stop the ocillators with the WT when the sound should stop. is that an okay thing to do? i mean do others (you?) do that in your patches?

regarding the filters - i could really use the HP and BP filter to improve the high hats but those filters applied to any other patch would worsten it quite a bit. do you think it’s still okay to use such specific filters? i mean if someone will then turn on the filter for the bassdrum it will sound really bad. when the patches use no filters at all you can still put all 3 channels through a filter for “equalizing” purpuses but not if the filters are specifically defined for a patch. do you know what i mean? i’m just wondering what would be best.

then another question about the WTs - i’m not completely sure how they work but is this normal: if i set an absolute value in one WT step then i can’t set it any lower in any of the next steps. i haven’t experimented much with this specific case but what i did - i was trying to alternate the OSC1 sustain level between two values (lets say 63 and 31 but when it hits the first value lower than the current one the WT just kind of stops… any idea what i’m trying to say?

i’m glad you like the patches. i can make many more.

yes, please!

a question - i found the patches work (sound) alot better if you stop the ocillators with the WT when the sound should stop. is that an okay thing to do? i mean do others (you?) do that in your patches?

Yes, I’m doing this very often. It has the advantage is, that it doesn’t matter, how long the note is played, and that the sound stops with a specific tone.

regarding the filters - i could really use the HP and BP filter to improve the high hats but those filters applied to any other patch would worsten it quite a bit. do you think it’s still okay to use such specific filters? i mean if someone will then turn on the filter for the bassdrum it will sound really bad. when the patches use no filters at all you can still put all 3 channels through a filter for “equalizing” purpuses but not if the filters are specifically defined for a patch. do you know what i mean? i’m just wondering what would be best.

Don’t think so much about the integration of filters. Just do the sounds - if the combination of specific sounds results into strange effects, people are always able to use them on a second SID, or to record them seperately.

Focus should be to have a large variety of sounds (therefore I’m asking for help)

Btw.: Rio has also sent me some patches in the meantime

then another question about the WTs - i’m not completely sure how they work but is this normal: if i set an absolute value in one WT step then i can’t set it any lower in any of the next steps. i haven’t experimented much with this specific case but what i did - i was trying to alternate the OSC1 sustain level between two values (lets say 63 and 31 but when it hits the first value lower than the current one the WT just kind of stops… any idea what i’m trying to say?

Thats the normal behaviour of the sustain level. Once it has been lowered, you can only make it higher by retriggering the gate. So, the SID VCA has (unfortunately) not the same behaviour like the software implemented EG. And it especially has a bug (the famous SID ADSR bug) - the attack is sometimes delayed and “hicks up”, especially on high release values.

Best Regards, Thorsten.

ahh so that’s probably also why you didnt make sustain available as the modulation target (in the mod matrix) :wink:

it’s a shame though cause every time the gate is triggered the VCA punches with the max volume first and you can hear that. so the workaround with WTing the note triggers and then setting the sustain for each one (very fast) won’t work. maybe something can be done with the attack hmm…

any idea how to make a channel quieter?