User Tools

Site Tools


Midibox CV to extend “DOUTs”

Anyone who considers 2 or 8 gates too few, or wants to trigger vintage drum synths/modules (Roland x0x style), may find the existing hardware of the Midibox CV insufficient. The solution is simple.


A dout module is needed, which will be connected to J8 of the coremodule. A doutx4 provides 32 gates/triggers. Some advice at this point: because it will be built without any optocouplers or transistors to protect the DOUT, it is essential not to apply any external voltage to the Gates/Triggers, and also to prevent short circuit.


A few changes have to be made to the sourcecode. On the one hand, the dout has to activate the gate/trigger on receiving the appropriate NoteOn: on the other hand you may want to reduce the duration of an impulse to 1ms independent of the Note duration.

Here as background is the trigger characteristic of some drum machines. The x0x-boxes (606,808,909…) trigger the sound at decrease of voltage at the gate instead of increase.
IE at the trailing edge of the +ve pulse rather than the leading edge? I'm not sure if this is correct.
Wikipedia says that Roland and Sequential gear is V-Trig {normal low, set high to trigger} and Moog, Korg and Yamaha is S-Trig {normal high, set low to trigger}. The manual for the Kenton Pro Solo MIDI-CV converter says: “ … Most synths / sequencers & drum machines will want the Positive edge pulse, but a few require the Negative edge instead. (e.g. Korg Monopoly) .. ” I've also seen written elsewhere that the 606 trigger out is V-Trig, but the 707 internal triggering for it's own voices is S-Trig
Also, if the trailing edge was the trigger, how would gates and envelopes work ie ADSR when AD happens at leading edge, D as gate is held high, and R when gate drops low? - Bunsen

Activate dout:

Download the source of Midibox CV at and search for the following in “main.asm”:

	;; process MIDI event
	call	CV_MIDI_NotifyReceivedEvent

	;; for best latency: branch to USER_Tick so that the new CV values
	;; will be mapped immediately
	rgoto	USER_Tick

Replace it with:


	;; BEGIN --- control DOUT pins via Note events at channel #1
	movf	MIOS_PARAMETER1, W		; Note Off -> Note On with velocity 0
	andlw	0xf0
	xorlw	0x80

	movlw	0x90				; check for Note On at channel #1
	rgoto USER_MPROC_NRE_NoNoteChn1
	;; MIOS_DOUT_PinSet expects pin number in WREG, value in MIOS_PARAMETER1
	movf	MIOS_PARAMETER3, W		; velocity == 0: off, velocity != 0: on
	movlw	0x01

	movf	MIOS_PARAMETER2, W		; pin number: note number - 0x24, we start with C-2
	addlw	-0x24
	andlw	0x7f
	call	MIOS_DOUT_PinSet
	;; END --- control DOUT pins via Note events at channel #1

	;; process MIDI event
	call	CV_MIDI_NotifyReceivedEvent

	;; for best latency: branch to USER_Tick so that the new CV values
	;; will be mapped immediately
	rgoto	USER_Tick

What happens here? Midibox CV is listening to the first channel (beginning from tune C-2) for a NoteOn and activates the corresponding dout. A NoteOff deactivates the dout.

Define the number of connected DOUT shift registers:

If you're using more than one DOUT shift register, you must also change this code in “” to reflect the number of shift registers:

	;; initialize the SRIO driver
	movlw	0x01
	call	MIOS_SRIO_NumberSet

To set it to the maximum (16), just replace the code with this:

	;; initialize the SRIO driver
	movlw	0x0F
	call	MIOS_SRIO_NumberSet

1ms Extension For Vintage Drum Machines:

Those who want to trigger vintage drums have to modify the sourcecode as follows: Search for the following:

	;; ---[ handle with control surface variables (flashing cursor, etc) ]---

Replace it with:

	clrf    MIOS_PARAMETER1      
	movlw   0x00    
	call    MIOS_DOUT_SRSet    
	movlw   0x01    
	call    MIOS_DOUT_SRSet    
	movlw   0x02    
	call    MIOS_DOUT_SRSet     
	movlw   0x03    
	call    MIOS_DOUT_SRSet     

	;; ---[ handle with control surface variables (flashing cursor, etc) ]---

This leads to a reset of all DOUTs once per cycle - this lasts 1ms. So the drum modules can be triggered with a 1ms latency.

MIDIbox SEQ allows up to 48 digital outputs as this type of trigger.

Changing the midi channel:

If you want the DOUT triggers to respond to MIDI events on a channel other than #1, replace instances of “0x80” and “0x90” with the following values:

  • Channel 1: 0x80, 0x90
  • Channel 2: 0x81, 0x91
  • Channel 3: 0x82, 0x92
  • Channel 4: 0x83, 0x93
  • Channel 5: 0x84, 0x94
  • Channel 6: 0x85, 0x95
  • Channel 7: 0x86, 0x96
  • Channel 8: 0x87, 0x97
  • Channel 9: 0x88, 0x98
  • Channel 10: 0x89, 0x99
  • Channel 11: 0x8A, 0x9A
  • Channel 12: 0x8B, 0x9B
  • Channel 13: 0x8C, 0x9C
  • Channel 14: 0x8D, 0x9D
  • Channel 15: 0x8E, 0x9E
  • Channel 16: 0x8F, 0x9F

Forum articles:,13478.0.html – Information on receiving on ALL channels, information on excluding specific DOUT pins from being reset with the 1ms trigger extension code (German) (German)

how_to_use_midibox_cv_with_a_dout.txt · Last modified: 2009/05/06 14:23 by