Jump to content

MIDIbox FM preview II


TK.
 Share

Recommended Posts

Well, one month has passed after the last update, here is the current status:

D2k has created a PCB layout for the MBHP_OPL3 module which is perfectly working:

mbhp_opl3_board.jpg

Not visible: the 3 SMD chips at the bottom (one YMF262, two YAC512).

The second YAC512 is optional for two additional audio channels.

The firmware is ca. 75% completed: the synth architecture is defined, all implemented features are working (hopefully ;-)) without failures, the first two JSynthLib editor panels are running.

The Patch Editor:

mbfm_patch_panel_pre1.jpg

Full view: http://www.ucapps.de/midibox_fm/mbfm_patch_panel_pre1.gif

The Drum Editor:

mbfm_drum_panel_pre1.jpg

Full view: http://www.ucapps.de/midibox_fm/mbfm_drum_panel_pre2.gif

Missing: the ensemble editor which allows to edit the MIDI channel assignments/keyboard ranges/transpose/audio channels, etc... for the 4 instruments

Some new demo samples (no perfect work yet ;-)):

A .mid file (Phil Collins, Against all Odds...) played with a Rhodes-like sound. This was to test the polyphony (6 4OP voices are automatically assigned, the longest note will be killed first):

http://www.midibox.org/midibox_fm/mbfm_demo3.mp3

Some sound engine tests - note that beside of the hardware EGs, each voice has two additional LFOs and one EG. Each modulation target has an own depth pot, and it's also possible that a LFO or EG modulates the frequency of another LFO (so really wired things ;-)):

http://www.midibox.org/midibox_fm/mbfm_demo4.mp3

The third example demonstrates the possibilities of the drum synth, which has it's own voices (it runs in parallel to the main synth engine):

http://www.midibox.org/midibox_fm/mbfm_demo5.mp3

Next targets: finalize all planned features, adding the third editor panel for an ensemble, completing the minimal control surface, starting with the full control surface, case, and having a lot of fun :)

Best Regards, Thorsten.

Link to comment
Share on other sites

TK - a typo fixed, the file still isn't there ;D

..Sounds, VERY interesting!!!!

One thing: Software Envelope.. that could be (switchable to) multistage EG... (well, WT is there, but.. ;))

(And for "live" sound editing - is there a way to prevent these TOO drastic changes in sound.. I mean, for real live work, It's nice to change textures, but with FM it's SO easy to end up with something totally unwanted. CS live mode? (Custom disabling of some the controls/ scaling of the others, to some wanted range??))

Bye, Moebius

Of course, You're never runnin' out of ideas.. BUT - I've never heard of a real HARDWARE synth, capable of Granular synthesis.. *Whistling*

Link to comment
Share on other sites

Alright, the link to the drum example should work now: http://www.midibox.org/midibox_fm/mbfm_demo5.mp3 - if you get a "service temporarily unavailable" message, then try it again after some minutes. It seems that the server is currently very busy.

Matteo: I've added some photos to the http://www.ucapps.de/mbhp_opl3.html page.

Marcel: yes, but a very FM-like drum synth (see example): punchy bass drum and a lot of noise ;-) Unfortunately the frequencies for the Toms and snare/hihat/cymbal is not independent from each other, also the envelopes are very rough. But this doesn't prevents you from creating some nice grooves :)

Moebius: I will check the request for a multistage EG once I know how much parameters are free after the planned features are implemented.

Live editing: I've already an alternate view for the most important parameters in mind, maybe I can extend this idea by a set of full assignable parameter pages, where the parameter number and adjustable range can be specified. :)

Granular synthesis: hold the line until I will start with FPGAs (just kidding - or not? ;-)

Best Regards, Thorsten.

Link to comment
Share on other sites

Wow, TK, that is IMPRESSIVE!  I hadn't realized that each YAC512 provided a pair of outputs.  Now I'm going to have to get a new mixer, and it's all your fault  ;D

All I've managed to do this past month is change apartments.  My electronics gear is somewhere in a pile of boxes that takes up half of the den  :-/  As of the moment I haven't made any more progress on my POKEY or PSG synths, nor will I before 2005.  But oh well, that's life.

Anyways, I'm looking forward to having a Midibox FM PCB available from SmashTV sometime next year (as he no doubt will have them, once you have finalized your hardware).

Link to comment
Share on other sites

this looks great to me so far (i still haven't built my first box yet.. more and more features keep coming to me ;-) ..

this seems like the kind of synth i would like to build a control surface for.. well.. that led mod matrix on the sid looks very hard to build..  i think with this one i would like kind of a "halfway" option between minimal control surface and the full one..

what i mean is the full surface without the led matrix (mods controlled via the menu like in the minimal version)..  only if an led matrix is planned of course..

the new modulation possibilities sound good as well..

on the proteus synths they use a system of virtual patchcords for mod sources controlling other sources (lfos controlling lfos etc.).. this is all done via a 2 line lcd (so it seems a bit like rocket science.. much easier with a computer  ;-)

for example:

env1 <- patchcord1-> LFO2rate <- patchcord2->  Q

each patchcord can control several parameters at once and each has a "depth" control (if this is set to -100 then the lfo waverform it controls is reversed)

as well as patchcords the emu synths also have "processers" such as diode, quantizer, 4x gain etc. which can be patched between mod sources to modify the control signals further.. and further and further..

all the best

adam

Link to comment
Share on other sites

Hi Adam,

problem with the OPL3 is, that there are not so much parameters which are worth to modulate with a high-resolution LFO/EG. Most of them are 4 bit only. Therefore my strategy is to have a modulation link to all high-resolution parameters, and these are the four "volumes" (note: volume on a modulator->carrier connection means that the amount of FM), the note pitch, the LFO frequency, the assigned AOUT (analog CV output) - and thats all.

There are already 14 modulation targets (each has a seperate depth parameter into negative/positive direction), with 6 voices this makes 84 modulation targets which are handled in parallel. I think this is enough for the small PIC ;-)

The diode, gain, etc... features could be selected with the waveform parameter, so here I'm open in the future

Anyhow, all parameters can be modulated with the wavetable sequencer. Thats the strategy for more complex sounds, and therefore the possibilities are hard to compare with common synths.

Best Regards, Thorsten.

Link to comment
Share on other sites

hi Thorsten,

thanks for writing... the wavetables sound promising..i have been playing with wavetables in pure data lately, in pd it is possible to draw the waveforms with the mouse (and to draw way outside of the graph for some extreme gains etc.).

i am not very familiar with yamaha fm.. my friend dave has had a dx7 for years.. he told me once about using noise as a starting point for analogue style synthesis.. i'm not sure what he meant but i have been trying it lately on the micro modular.. first thing i found was that modulating an operator all the way with white noise makes musically pitched noise (which i like..)

i am still an absolute beginner with fm.. i was amazed to find that this makes a very nice soft cymbal type sound.. i think what amazed me was that i modulated an operator with a 7hz sine wave, and got white noise, i couldn't believe it.. i was pleased.. i was expecting a pulsing ring modulated type sound.. but no ;-) well.. the lfo rate is also controlled by the ad envelope so it might be going much higher than 7hz at the peak..

the emu (again) also features noise as a  modulation source.. and another LFO shape called sine plus noise (it looks like a very messy sine wave) which is supposed to be good for simulating flute and trumpet vibrato

i think a noise LFO waveform would consist of a random value at each step, evenly spaced across the whole range

another nice feature i have heard of on some synths is the ability to morph the lfo shape with a knob.. i think it would be nice to be able to choose 2 lfos (e.g square and sine) and morph between the two shapes.. i don't know how difficult this is to program.. anyway..

bye for now

best wishes

adam

PS, for  anyone who is interested, here are some articles on modulation, am and FM

modulation

http://www.soundonsound.com/sos/feb00/articles/synthsecrets.htm?session=bd3fadb4fe25022fcb636f0b5aae42f7

am

http://www.soundonsound.com/sos/mar00/articles/synthsecrets.htm?session=bd3fadb4fe25022fcb636f0b5aae42f7

fm part 1

http://www.soundonsound.com/sos/apr00/articles/synthsecrets.htm?session=bd3fadb4fe25022fcb636f0b5aae42f7

fm part 2

http://www.soundonsound.com/sos/may00/articles/synth.htm?session=bd3fadb4fe25022fcb636f0b5aae42f7

Link to comment
Share on other sites

To get a handle on what might be possible with this chip its best to consult the datasheet:

'>http://www.funet.fi/pub/msx/mirrors/msx2.com/vortexion/YMF262.PDF

Naturally modulation can be done in software, but only within the limits of the resolution of the parameter, and also at a rate that the PIC can update all parameters.

This is more in the mS rather than uS so that software envelopes and LFO's are possible but useful audio frequency modulation in software most likely not.

cheers

Link to comment
Share on other sites

TK, on a related note, I'm wondering what the approximate max software envelopes would be for the PIC.  It's sort of a digitally-controlled analog synth project that's sitting in the back of my mind (and would be somewhat related to the AOUT/SHX8).

Would it be possible to have 8 modulation sources (envelopes, LFOs, let's say they're 8-bit each) and 12 modulation destinations (pitch, filter Q, etc.) for each of 8 voices?  Or would this run out of steam at about 4 voices?  

Mostly I'm trying to determine whether I should be using a MIOS frontend interface with a dedicated envelope-controlling PIC (using the PIC's PSP feature), or whether a MIOS unit could handle a control surface, MIDI in, _and_ a whole lot of envelopes.

I'm just looking for a vague estimate of whether or not this would be possible - I doubt that I'll get around to this for quite some time, as I still have about 3 other projects to do first :-)

Link to comment
Share on other sites

Hi Andrew,

Would it be possible to have 8 modulation sources (envelopes, LFOs, let's say they're 8-bit each) and 12 modulation destinations (pitch, filter Q, etc.) for each of 8 voices?  Or would this run out of steam at about 4 voices?  

I'm missing an important spec, and thats the update cycle for all voices.

I guess that this number of modulation sources/destinations can be processed within ca. 500 uS with 16 bit resolution. A lower resolution is not practicable, since especially EGs require a high-res counter, otherwise slow ramps cannot be realized

Calculation example: let's say the waveform generator is clocked at each millisecond, the EG counter is working with 16-bit resolution, this means that ramps with up to 65s are possible. With 8-bit resolution the maximum ramp time is only 256 mS

For LFOs a high-res counter is also required, with 8-bit you would only get a minimum frequency of 4 Hz (depends on implementation), with 16-bit ca. 0.015 Hz

1 mS update cycle means that 1mS-500 uS = 500 uS are free for other tasks: for updating the analog outputs, handling MIDI, printing LCD messages, etc...

Best Regards, Thorsten.

Addendum: I just remember that for such a dedicated application you can "unroll" your code, means: avoid iteration loops and avoid the use of pointers and indirect addressing, but generate the code directly (e.g. with macros). Registers should always be addressed diretcly. This enlarges the code dramaticaly, but can reduce the execution time by factor 3..5 and more :)

Link to comment
Share on other sites

I'm missing an important spec, and thats the update cycle for all voices.

Ooh, good point.  I hadn't really considered that, but I would imagine that a tolerance of 2-4 mS would probably be acceptable.  Maybe up to 10 mS, but I'd really have to listen to the effects of timing.

I guess that this number of modulation sources/destinations can be processed within ca. 500 uS with 16 bit resolution. A lower resolution is not practicable, since especially EGs require a high-res counter, otherwise slow ramps cannot be realized.

While I had taken the bit resolution into account for the DAC portion (I think 8-bit should be "good enough" for envelopes), I hadn't considered the EG timing.

Calculation example: let's say the waveform generator is clocked at each millisecond, the EG counter is working with 16-bit resolution, this means that ramps with up to 65s are possible. With 8-bit resolution the maximum ramp time is only 256 mS.

What about this alternate possibility:  each envelope has a phase accumulator, step size, and output value.  Each cycle (1 mS), the phase accumulator for each envelope is increased by one;  if it overflows, the step size is added to the output value.  The fastest envelope would be 1 mS; the base accumulator value would be 255 (to overflow on the first step), and the step size would also be 255.  The longest envelope would be 65s as you said; base accumulator value would be 0, and the step size would be 1.

Or I could be way off - my approach above is just a bastardized 16-bit envelope that makes precise envelope timing difficult at best, and may be almost as (if not more) processor-intensive as a full 16-bit envelope.

This is all getting _way_ ahead of myself (I still need to determine whether my PIC-based 2 osc + 2 subosc numerically controlled wavetable oscillator scheme will work)... but it's a lot more fun than doing what I'm supposed to be getting paid to do at work  ;)

Link to comment
Share on other sites

While I had taken the bit resolution into account for the DAC portion (I think 8-bit should be "good enough" for envelopes), I hadn't considered the EG timing.

The final resolution for the destinations doesn't really matter here. You have to work with 16 (or better 24) bit anyhow once you add the LFO/EG output values, thereafter you have to saturate the result to the desired resolution to avoid distortions.

What about this alternate possibility:  each envelope has a phase accumulator, step size, and output value.  Each cycle (1 mS), the phase accumulator for each envelope is increased by one;  if it overflows, the step size is added to the output value.  The fastest envelope would be 1 mS; the base accumulator value would be 255 (to overflow on the first step), and the step size would also be 255.  The longest envelope would be 65s as you said; base accumulator value would be 0, and the step size would be 1.

thats the way how I've realized the envelopes and LFOs in the MIDIbox SID/MIDIbox FM firmware (see sid_lfo_table.inc and sid_env_table.inc)

but it's a lot more fun than doing what I'm supposed to be getting paid to do at work  ;)

It definitely is a nice challenge, especially because you are able to hear the results - and sometimes really wired things are coming out, sounds which won't be doable with the final (bugfixed) algorithm ;-)

Best Regards, Thorsten.

Link to comment
Share on other sites

thats the way how I've realized the envelopes and LFOs in the MIDIbox SID/MIDIbox FM firmware (see sid_lfo_table.inc and sid_env_table.inc)

Cool, so I'm not crazy after all  :D

In case you're curious, the project concept is a digitally-controlled analog polysynth with 8 voices (and up to 8 parts multitimbral).  Each voice has two numerically-controlled wavetable oscillators + two suboscillators (-1 or -2 octaves), a Wasp-style 12 dB VCF (switchable NP/LP/BP/HP) with distortion and dual VCAs (one for post-filter, one for post-distortion).  The wavetable oscillators will be in a dedicated PIC18F252 (one per voice), using modified Digisound and/or Wiard wavetables in a lookup table in the PIC to save on chip count.

Of course, this has nothing to do with the Midibox FM...

Link to comment
Share on other sites

  • 2 weeks later...

Well done !

     Another neat project idea :) ..Had forgotten til now how much i liked the sound of those pc soundcard midichips. Demo's sounding very promising, be great to see more on this.

     By the way, i read somewhere that although this chip supports panning; its support is somewhat limited, ie hard left, center, or right - can i make a suggestion that the 4 output channels have their (panning) output modulated by a add on CV section ? ..this would add the scope for far more dynamic sound variations - (ADSR or LFO modulated?) as part of the sound patch itself potentially.

     Also btw, yamaha have been continuing development of such soundchips; there latest offering both plays back pcm & adpcm (audiostreams (& samples ?)) & does fm synthsis with 64 voices ! ..interesting - but opl 3 seems more adiquate & accessable right now :) ..might end up salvaging this in the future tho ;)

{see: http://www.yamaha.co.jp/english/product/lsi/prod/pdf/sgl/4mf781a20.pdf}

Link to comment
Share on other sites

Hi Artesia,

I've prepared a very generic solution for the CV OUTs: the EG5, the two LFO and the wavetable outputs of each voice (makes 36 signal sources) can be assigned to 8 AOUTs. So, you can not only control a stereo VCA, but also filters, distortion, or whatever you want. But I won't provide special schematics, because there are a lot of webpages from Synth-DIY specialist which cover these topics. However, you can start a collection of useful links if you want.

64 voices: this suggestion can only come from people who don't know how busy the PIC18F already is to handle the 6 4-operator voices (+5 percussion voices) of the OPL3.

Here the register allocation list to give you an impression. Note that nearly the whole RAM is allocated. I did my best to give each RAM cell a special purpose, most of them are used for very interesting features (most of them are not part of the OPL3 itself, but unique for MIDIbox FM :-))

;; ==========================================================================

MBFM_VOICE_QUEUE_0      EQU      0x0b0

MBFM_VOICE_QUEUE_5      EQU      0x0b5

MBFM_VOICE_QUEUE_LEN      EQU      MBFM_VOICE_QUEUE_5 - MBFM_VOICE_QUEUE_0 + 1

;; ==========================================================================

MBFM_DR_BASE            EQU      0x0c0

MBFM_DR_BD_M_FLAGS_MULT      EQU      0x0c0

MBFM_DR_BD_C_FLAGS_MULT      EQU      0x0c1

MBFM_DR_HH_O_FLAGS_MULT      EQU      0x0c2

MBFM_DR_HH_C_FLAGS_MULT      EQU      0x0c3

MBFM_DR_SD_FLAGS_MULT      EQU      0x0c4

MBFM_DR_TOM_FLAGS_MULT      EQU      0x0c5

MBFM_DR_CYM_FLAGS_MULT      EQU      0x0c6

MBFM_DR_BD_M_KSL_TL      EQU      0x0c7

MBFM_DR_BD_C_KSL_TL      EQU      0x0c8

MBFM_DR_HH_O_KSL_TL      EQU      0x0c9

MBFM_DR_HH_C_KSL_TL      EQU      0x0ca

MBFM_DR_SD_KSL_TL      EQU      0x0cb

MBFM_DR_TOM_KSL_TL      EQU      0x0cc

MBFM_DR_CYM_KSL_TL      EQU      0x0cd

MBFM_DR_BD_M_AR_DR      EQU      0x0ce

MBFM_DR_BD_C_AR_DR      EQU      0x0cf

MBFM_DR_HH_O_AR_DR      EQU      0x0d0

MBFM_DR_HH_C_AR_DR      EQU      0x0d1

MBFM_DR_SD_AR_DR      EQU      0x0d2

MBFM_DR_TOM_AR_DR      EQU      0x0d3

MBFM_DR_CYM_AR_DR      EQU      0x0d4

MBFM_DR_BD_M_SL_RR      EQU      0x0d5

MBFM_DR_BD_C_SL_RR      EQU      0x0d6

MBFM_DR_HH_O_SL_RR      EQU      0x0d7

MBFM_DR_HH_C_SL_RR      EQU      0x0d8

MBFM_DR_SD_SL_RR      EQU      0x0d9

MBFM_DR_TOM_SL_RR      EQU      0x0da

MBFM_DR_CYM_SL_RR      EQU      0x0db

MBFM_DR_BD_M_WS            EQU      0x0dc

MBFM_DR_BD_C_WS            EQU      0x0dd

MBFM_DR_HH_O_WS            EQU      0x0de

MBFM_DR_HH_C_WS            EQU      0x0df

MBFM_DR_SD_WS            EQU      0x0e0

MBFM_DR_TOM_WS            EQU      0x0e1

MBFM_DR_CYM_WS            EQU      0x0e2

MBFM_DR_BD_CH_FB_CNT      EQU      0x0e3

MBFM_DR_HH_SD_CH_FB_CNT      EQU      0x0e4

MBFM_DR_CYM_TOM_CH_FB_CNT EQU      0x0e5

MBFM_DR_BD_FRQ            EQU      0x0e6

MBFM_DR_BD_DECR            EQU      0x0e7

MBFM_DR_HH_FRQ            EQU      0x0e8

MBFM_DR_HH_DECR            EQU      0x0e9

MBFM_DR_TOM_FRQ            EQU      0x0ea

MBFM_DR_TOM_DECR      EQU      0x0eb

MBFM_DR_BD_SPLIT_LOWER      EQU      0x0ec

MBFM_DR_BD_SPLIT_UPPER      EQU      0x0ed

MBFM_DR_HH_O_SPLIT_LOWER EQU      0x0ee

MBFM_DR_HH_O_SPLIT_UPPER EQU      0x0ef

MBFM_DR_HH_C_SPLIT_LOWER EQU      0x0f0

MBFM_DR_HH_C_SPLIT_UPPER EQU      0x0f1

MBFM_DR_SD_SPLIT_LOWER      EQU      0x0f2

MBFM_DR_SD_SPLIT_UPPER      EQU      0x0f3

MBFM_DR_TOM_SPLIT_LOWER      EQU      0x0f4

MBFM_DR_TOM_SPLIT_UPPER      EQU      0x0f5

MBFM_DR_CYM_SPLIT_LOWER      EQU      0x0f6

MBFM_DR_CYM_SPLIT_UPPER      EQU      0x0f7

     ;; last address which should be stored in BankStick. Everything else will be set to zero

MBFM_DR_LAST_BANKSTICK_ADDR EQU      MBFM_DR_CYM_SPLIT_UPPER - MBFM_DR_BASE

     ;; free 0xf8-0xf9

MBFM_DR_BD_FRQL            EQU      0x0fa

MBFM_DR_BD_FRQH            EQU      0x0fb

MBFM_DR_HH_FRQL            EQU      0x0fc

MBFM_DR_HH_FRQH            EQU      0x0fd

MBFM_DR_TOM_FRQL      EQU      0x0fe

MBFM_DR_TOM_FRQH      EQU      0x0ff

==========================================================================

;; instrument memory storage

;; one instrument record allocates 0x80 = 128 bytes

MBFM_Ix_RECORD_LEN      EQU      0x80

MBFM_Ix_NAME_x            EQU      0x00 ; -0x10

MBFM_Ix_OP1_FLAGS_MULT      EQU      0x10

MBFM_Ix_OP2_FLAGS_MULT      EQU      0x11

MBFM_Ix_OP3_FLAGS_MULT      EQU      0x12

MBFM_Ix_OP4_FLAGS_MULT      EQU      0x13

MBFM_Ix_OP1_KSL_TL      EQU      0x14

MBFM_Ix_OP2_KSL_TL      EQU      0x15

MBFM_Ix_OP3_KSL_TL      EQU      0x16

MBFM_Ix_OP4_KSL_TL      EQU      0x17

MBFM_Ix_OP1_AR_DR      EQU      0x18

MBFM_Ix_OP2_AR_DR      EQU      0x19

MBFM_Ix_OP3_AR_DR      EQU      0x1a

MBFM_Ix_OP4_AR_DR      EQU      0x1b

MBFM_Ix_OP1_SL_RR      EQU      0x1c

MBFM_Ix_OP2_SL_RR      EQU      0x1d

MBFM_Ix_OP3_SL_RR      EQU      0x1e

MBFM_Ix_OP4_SL_RR      EQU      0x1f

MBFM_Ix_OP1_WS            EQU      0x20

MBFM_Ix_OP2_WS            EQU      0x21

MBFM_Ix_OP3_WS            EQU      0x22

MBFM_Ix_OP4_WS            EQU      0x23

MBFM_Ix_OP12_CH_FB_CNT      EQU      0x24

MBFM_Ix_OP34_CH_FB_CNT      EQU      0x25

MBFM_Ix_CTRL1            EQU      0x26

MBFM_Ix_CTRL2            EQU      0x27

MBFM_Ix_AOUT_MOD_ASSGN      EQU      0x28

MBFM_Ix_FINETUNE      EQU      0x29

MBFM_Ix_PITCHRANGE      EQU      0x2a

MBFM_Ix_PORTA_RATE      EQU      0x2b

MBFM_Ix_VELOCITY_ASSIGN      EQU      0x2c

MBFM_Ix_VELOCITY_INIT      EQU      0x2d

MBFM_Ix_VELOCITY_DEPTH      EQU      0x2e

MBFM_Ix_AFTERTOUCH_ASSIGN EQU      0x2f

MBFM_Ix_AFTERTOUCH_INIT      EQU      0x30

MBFM_Ix_AFTERTOUCH_DEPTH EQU      0x31

MBFM_Ix_MODWHEEL_ASSIGN      EQU      0x32

MBFM_Ix_MODWHEEL_INIT      EQU      0x33

MBFM_Ix_MODWHEEL_DEPTH      EQU      0x34

MBFM_Ix_WT_RATE            EQU      0x35

MBFM_Ix_WT_PAR1            EQU      0x36

MBFM_Ix_WT_PAR2            EQU      0x37

MBFM_Ix_WT_PAR3            EQU      0x38

MBFM_Ix_LFO1_MODE      EQU      0x39

MBFM_Ix_LFO1_PHASE      EQU      0x3a

MBFM_Ix_LFO1_RATE      EQU      0x3b

MBFM_Ix_LFO1_DEPTH_P      EQU      0x3c

MBFM_Ix_LFO1_DEPTH_V1      EQU      0x3d

MBFM_Ix_LFO1_DEPTH_V2      EQU      0x3e

MBFM_Ix_LFO1_DEPTH_V3      EQU      0x3f

MBFM_Ix_LFO1_DEPTH_V4      EQU      0x40

MBFM_Ix_LFO1_DEPTH_L      EQU      0x41

MBFM_Ix_LFO1_DEPTH_A      EQU      0x42

MBFM_Ix_LFO2_MODE      EQU      0x43

MBFM_Ix_LFO2_PHASE      EQU      0x44

MBFM_Ix_LFO2_RATE      EQU      0x45

MBFM_Ix_LFO2_DEPTH_P      EQU      0x46

MBFM_Ix_LFO2_DEPTH_V1      EQU      0x47

MBFM_Ix_LFO2_DEPTH_V2      EQU      0x48

MBFM_Ix_LFO2_DEPTH_V3      EQU      0x49

MBFM_Ix_LFO2_DEPTH_V4      EQU      0x4a

MBFM_Ix_LFO2_DEPTH_L      EQU      0x4b

MBFM_Ix_LFO2_DEPTH_A      EQU      0x4c

MBFM_Ix_EG5_MODE      EQU      0x4d

MBFM_Ix_EG5_ATTACK      EQU      0x4e

MBFM_Ix_EG5_ATTLVL      EQU      0x4f

MBFM_Ix_EG5_DECAY1      EQU      0x50

MBFM_Ix_EG5_DECLVL      EQU      0x51

MBFM_Ix_EG5_DECAY2      EQU      0x52

MBFM_Ix_EG5_SUSTAIN      EQU      0x53

MBFM_Ix_EG5_RELEASE      EQU      0x54

MBFM_Ix_EG5_CURVE      EQU      0x55

MBFM_Ix_EG5_DEPTH_P      EQU      0x56

MBFM_Ix_EG5_DEPTH_V1      EQU      0x57

MBFM_Ix_EG5_DEPTH_V2      EQU      0x58

MBFM_Ix_EG5_DEPTH_V3      EQU      0x59

MBFM_Ix_EG5_DEPTH_V4      EQU      0x5a

MBFM_Ix_EG5_DEPTH_A      EQU      0x5b

MBFM_Ix_EG5_DEPTH_L      EQU      0x5c

MBFM_Ix_BANK            EQU      0x60

MBFM_Ix_PATCH            EQU      0x61

MBFM_Ix_MIDI_CHANNEL      EQU      0x62

MBFM_Ix_SPLIT_LOWER      EQU      0x63

MBFM_Ix_SPLIT_UPPER      EQU      0x64

MBFM_Ix_TRANSPOSE      EQU      0x65

MBFM_Ix_UNISONO            EQU      0x66

MBFM_Ix_AUDIO_CHANNELS      EQU      0x67

MBFM_Ix_MODWHEEL      EQU      0x70

MBFM_Ix_AFTERTOUCH      EQU      0x71

MBFM_Ix_PITCHBENDER      EQU      0x72

MBFM_Ix_LAST_VOICE      EQU      0x73

MBFM_Ix_NOTE_STACK_0      EQU      0x78

MBFM_Ix_NOTE_STACK_1      EQU      0x79

MBFM_Ix_NOTE_STACK_2      EQU      0x7a

MBFM_Ix_NOTE_STACK_3      EQU      0x7b

MBFM_Ix_NOTE_STACK_4      EQU      0x7c

MBFM_Ix_NOTE_STACK_5      EQU      0x7d

MBFM_Ix_NOTE_STACK_6      EQU      0x7e

MBFM_Ix_NOTE_STACK_7      EQU      0x7f

     ;; base addresses of instrument records

MBFM_Ix_NUM            EQU      4

MBFM_I1_BASE            EQU      0x100 + 0 * MBFM_Ix_RECORD_LEN      ; 0x100-0x17f

MBFM_I2_BASE            EQU      0x100 + 1 * MBFM_Ix_RECORD_LEN      ; 0x180-0x1ff

MBFM_I3_BASE            EQU      0x100 + 2 * MBFM_Ix_RECORD_LEN      ; 0x200-0x27f

MBFM_I4_BASE            EQU      0x100 + 3 * MBFM_Ix_RECORD_LEN      ; 0x280-0x2ff

MBFM_Ix_NOTE_STACK_LEN      EQU      MBFM_Ix_NOTE_STACK_7 - MBFM_Ix_NOTE_STACK_0 + 1

==========================================================================

;; NOTE: MBFM_Px_xxx defined in mbfm_par_table.inc!

==========================================================================

;; ==========================================================================

;; voice memory storage

;; one voice record allocates 0x20 = 32 bytes

MBFM_Vx_NUM            EQU      6

MBFM_Vx_RECORD_LEN      EQU      0x20

MBFM_Vx_UPDATE0            EQU      0x00

MBFM_Vx_UPDATE1            EQU      0x01

MBFM_Vx_FNUML            EQU      0x02

MBFM_Vx_FNUMH            EQU      0x03

MBFM_Vx_OP1_KSL_TL      EQU      0x04

MBFM_Vx_OP2_KSL_TL      EQU      0x05

MBFM_Vx_OP3_KSL_TL      EQU      0x06

MBFM_Vx_OP4_KSL_TL      EQU      0x07

MBFM_Vx_OP1_VOL            EQU      0x08

MBFM_Vx_OP2_VOL            EQU      0x09

MBFM_Vx_OP3_VOL            EQU      0x0a

MBFM_Vx_OP4_VOL            EQU      0x0b

MBFM_Vx_STAT            EQU      0x0c

MBFM_Vx_NOTE            EQU      0x0d

MBFM_Vx_VELOCITY      EQU      0x0e

MBFM_Vx_ASSIGNED_INSTR      EQU      0x0f

MBFM_Vx_FRQ_L            EQU      0x10

MBFM_Vx_FRQ_H            EQU      0x11

MBFM_Vx_TARGET_FRQ_L      EQU      0x12

MBFM_Vx_TARGET_FRQ_H      EQU      0x13

MBFM_Vx_LFO1_STAT      EQU      0x14

MBFM_Vx_LFO1_RATE      EQU      0x15

MBFM_Vx_LFO1_CTR      EQU      0x16

MBFM_Vx_LFO1_VALUE      EQU      0x17

MBFM_Vx_LFO2_STAT      EQU      0x18

MBFM_Vx_LFO2_RATE      EQU      0x19

MBFM_Vx_LFO2_CTR      EQU      0x1a

MBFM_Vx_LFO2_VALUE      EQU      0x1b

MBFM_Vx_EG5_STAT      EQU      0x1c

MBFM_Vx_EG5_CTR_L      EQU      0x1d

MBFM_Vx_EG5_CTR_H      EQU      0x1e

MBFM_V1_BASE            EQU      0x300 + 0 * MBFM_Vx_RECORD_LEN      ; 0x300

MBFM_V2_BASE            EQU      0x300 + 1 * MBFM_Vx_RECORD_LEN      ; 0x320

MBFM_V3_BASE            EQU      0x300 + 2 * MBFM_Vx_RECORD_LEN      ; 0x340

MBFM_V4_BASE            EQU      0x300 + 3 * MBFM_Vx_RECORD_LEN      ; 0x360

MBFM_V5_BASE            EQU      0x300 + 4 * MBFM_Vx_RECORD_LEN      ; 0x380

MBFM_V6_BASE            EQU      0x300 + 5 * MBFM_Vx_RECORD_LEN      ; 0x3c0

So, take MIDIbox FM as a synth with a special sound which cannot be achived with a common (software) synth (partly due to the "nice" and not-emulatable distortions which are caused by the limited resolution of the OPL3 internals - lets call it "crispy" ;-) ), but don't take it as a high-end synthesizer with a nearly unlimited number of voices and always perfect sounds. This area is covered by synth manufactures and not worth the effort from my side.

Note also that each additional feature would mean that I have to downstrip already implemented features. The resources of the PIC18F452 are tiny compared to state-of-the-art microcontrollers (see the News section for oppinions on this topic)

Best Regards, Thorsten.

Link to comment
Share on other sites

Hey :)

I've prepared a very generic solution for the CV OUTs: the EG5, the two LFO and the wavetable outputs of each voice (makes 36 signal sources) can be assigned to 8 AOUTs. So, you can not only control a stereo VCA, but also filters, distortion, or whatever you want. But I won't provide special schematics, because there are a lot of webpages from Synth-DIY specialist which cover these topics. However, you can start a collection of useful links if you want.

     Good broad thinking there :) Shall be fun to toy with that, will have time to actually finish building some hardware in 2005. On the note of such hardware modules, i shall take the time to offer up some links for such places.

     However i would quite like to design such hardware module solutions specifically for the MIOS project; assuming no one else is currently doing so. Unlike pointing to external links, this would provide some tryed and tested modules (ie: VCA's, Resonant EQ's etc) - which people here could offer support for new builders (and maybe even pcbs ?) etc. This would also allow people to swap patches with hardware using these extensions & get the 'same' sound out of the box :)

     One thing i will shortly be sorting out as my first little venture this way, is a simple light controlled voltage source. This could be used to control the brightness of leds & backlights on midibox projects to optimise viewing clarity & power consumption under varying lighting conditions automatically.

     Similar to the way canon camera's vary the brightness of the viewfinder readouts dependant of the light meter readings.

64 voices: this suggestion can only come from people who don't know how busy the PIC18F already is to handle the 6 4-operator voices (+5 percussion voices) of the OPL3.  

     :) ...Well, took half a guess that maybe so - however with the new gen of yamaha chips its more of a suggestion for 'distant' future possibles. Also notably the chip mentioned has onboard cpu for controlling all the widgets; so the strain maybe somewhat less - but it might however involve quite abit more programming :]

     On the note of gritty lo-fi non-dithered sound - i have to totally agree :) ..it sounds fantastic & gives a real zing to it.

     So many synths sound too smoothed & dull now (no matter how hard you push them) - with the ever excessive attempts to make them as 'hi-fi' as possible.

     Another little thing worth messing around with for the sake of getting weird & funky gargles out of a synth like this - is to make the sampling frequency of the DAC variable. This of course works like a really dirty low pass filter & produces some wonderful noises. This Probably could not be done with the dac chips for this synth - however with other dacs &/or some data stream processing this effect could possibly be acheived.

     To get a idea of what this can sound like; if you have a soundblaster live card - use the KX drivers & go into the structure editor (disable output dithering) & insert the downsampling module in the main signal output chain. This will allow both sample rate & bit depth to be adjusted in realtime on whatever is being played. This sounds -kool- ! (can also be done in cooledit, but is not realtime & thus a little tedious).

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.

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...
 Share

×
×
  • Create New...