The NumShotter :: a.k.a The 50€ DIY Controller in VCI-100 style (Sampler)

The NumShotter :: a.k.a The 50€ DIY Controller in VCI-100 style (Sampler)

Hello DJTT.

For the last couple of month I was working on a little mod:
The NumShotter, a.k.a The 50€ DIY Controller in VCI-100 style.
I, for myself, learned a lot with this project, so i thought i share it with you guys.
In addition I get the chance to show off a likle bit :smiley:

My aim in this project was to use the spare space in my flightcase and fill it up with a controller for my one-shot samples (as i select(= mix) reggae / dancehall).
I used the cheapest numpad i could find on amazon.de, turned it into a midi-controller using glovePie and reshaped it with scrapyard-aluminium and small arcade buttons.

It also blends nicely with the design i already made for my VCI 100.

:: off-topic ::

My VCI 100 is fully remapped:

  • I can smoothly scratch, thanks to firmware 1.4
  • I have a beat juggle-mode
  • Pull-Up-Button ( = jump to first cue-point. 'Caus if it’s nice, we play it twice)
  • I can set-up my mp3’s bpm, beatgrids and cuepoints on the fly (Set-up-Mode)
  • I have one advanced effect for both decks (dub-delay)
  • I have one 3-way-effect-bank for both decks
  • And one special effect deck combined with the sample-decks of traktor 2. I use it to simulate a DUB-SIREN (Google if you don’t know what that is).

This mapping is sick, and took me a lot of time. if someone is interested, leave me a message)

To top it off, i custom printed a DJ-TT-like high quality sticker for my mapping. I call it VCI-100_ras-Edition.

:: /off-topic ::

Back to the numSHOTTER

So i took apart the Numpad and stole the circuit-board with the usb-cable on it.

COST: About 10€/$ + 20€ for buttons and cables

As Computer-Keyboards have these double-layered-contact-papers, the contacts for the button-cables are reaaaly small. But with a helping hand we got them soldered on quite nicely (hot glue is a friend :wink: ).
Make shure to remember which contacts trigger which ASCII-Code Number (Its always 2 contacts in my case)
for example: numpadButton1 would be contact 11 and 2 on the numpads circuit board.

Aluminum from the scrapyard 1,5mm thick.

COST: Free

Making it look just as the design of the VCI-100 wasn’t as easy as I first thought, but with a little time and help of my babii we finally got all meassurements right.
Up to a friend with it (locksmith). He was doing his magic, and it was done.

COST: One long afternoon and a couple of beers

As I am in Digital-Media i didnt have no issues with the next step. Designed in photoshop, ordered online, sticked it on and cut the holes right on the metal.

COST 20€

This is how it looks. I love it, and it worked out just as I imagined it.

Now to the software.

I used GlovePIE and MidiYoke to transform the keyboad-data into midi-data.
My Script uses Key1 to cycle through 3 “Banks” of midi-notes.
They equal my number of sound-banks in Battery 3, which i run through Standalone VSTi-Host 1.34.
Battery is a drummer software (vst or standalone)
I use the VSTi-host to make the software portable.

Here’s my script:


midi.DeviceOut = 2
midi.channel1.c0 = swallow(Keyboard.NUMPAD1) and (var.Number = 1)

if starting then
var.Number=1
end

if pressed(swallow(Keyboard.NUMPAD1)) then var.Number++
if var.Number > 3 then var.Number = 1

midi.channel1.csharp1 = swallow(Keyboard.NUMPAD2) and (var.Number = 1)
midi.channel1.d1 = swallow(Keyboard.NUMPAD3) and (var.Number = 1)
midi.channel1.dsharp1 = swallow(Keyboard.NUMPAD4) and (var.Number = 1)
midi.channel1.e1 = swallow(Keyboard.NUMPAD5) and (var.Number = 1)
midi.channel1.f1 = swallow(Keyboard.NUMPAD6) and (var.Number = 1)
midi.channel1.fsharp1 = swallow(Keyboard.NUMPAD7) and (var.Number = 1)
midi.channel1.g1 = swallow(Keyboard.NUMPAD8) and (var.Number = 1)
midi.channel1.gsharp1 = swallow(Keyboard.NUMPAD9) and (var.Number = 1)

midi.channel1.csharp2 = swallow(Keyboard.NUMPAD2) and (var.Number = 2)
midi.channel1.d2 = swallow(Keyboard.NUMPAD3) and (var.Number = 2)
midi.channel1.dsharp2 = swallow(Keyboard.NUMPAD4) and (var.Number = 2)
midi.channel1.e2 = swallow(Keyboard.NUMPAD5) and (var.Number = 2)
midi.channel1.f2 = swallow(Keyboard.NUMPAD6) and (var.Number = 2)
midi.channel1.fsharp2 = swallow(Keyboard.NUMPAD7) and (var.Number = 2)
midi.channel1.g2 = swallow(Keyboard.NUMPAD8) and (var.Number = 2)
midi.channel1.gsharp2 = swallow(Keyboard.NUMPAD9) and (var.Number = 2)

midi.channel1.csharp3 = swallow(Keyboard.NUMPAD2) and (var.Number = 3)
midi.channel1.d3 = swallow(Keyboard.NUMPAD3) and (var.Number = 3)
midi.channel1.dsharp3 = swallow(Keyboard.NUMPAD4) and (var.Number = 3)
midi.channel1.e3 = swallow(Keyboard.NUMPAD5) and (var.Number = 3)
midi.channel1.f3 = swallow(Keyboard.NUMPAD6) and (var.Number = 3)
midi.channel1.fsharp3 = swallow(Keyboard.NUMPAD7) and (var.Number = 3)
midi.channel1.g3 = swallow(Keyboard.NUMPAD8) and (var.Number = 3)
midi.channel1.gsharp3 = swallow(Keyboard.NUMPAD9) and (var.Number = 3)


For me, this was my first diy-controller project.
I encourage everyone to try and turn your ideas into reality. It’s cheap and the time you spend doing is definitely worth every second, once you hold your piece in hands.
Thanks to everyone who lend me a helping hand :slight_smile:

//my mother tongue is German. typos are yours

i would have used the numshotter on the bottom of the VCI horizontally for cuepoints

i already use the transport buttons of my vci to juggle cuepoints (i can switch between normal transport and cue-point-juggleing) .
Although, cue-point-juggling would not be hard to map for the numShotter.

I use my numShotter for this

Only a little bit more advanced, now with Battery3

thats pretty awesome :smiley:

not sure if the glovepie code might be more efficient tho if you wrapped “if” statements around each of the 4 blocks (page change and the pages) so then it doesnt need to evaluate so much each iteration. as glovepie loops round your code around 20 times a second i think - which is the only bad thing i’ve found about it - it can end up eating a measurable amount of cpu which i don’t like.

nice use of space in the flight case :slight_smile: and i presume u could always use it in that space at the bottom if u wanted to - tho would probably actually be more in the way for what u want to use it for atm.

i got as far as buying 8 arcade buttons, gamepad, soldering iron and solder a few months back but haven’t actually got round to doing anything with them yet :stuck_out_tongue: (apart from playing around in glovepie…)

Is it really neccessary to quote that entire post just to make your comment?:confused:

To the OP, nice work!

Excellent work! Very nice concept. The important thing is that it works for you and it doesn’t matter what any wannabe-modder thinks of it.

Well said ToOntown and Respect Floer

thanks to all replies. :slight_smile:

@zestoi
I will do that. I was just glad that the script worked, and did not think about optimizing.. till now. thanks for the tip.

@extraclassic
Big ups to you! Your projects had been a big inspiration to me

So I tried to modify my script, but i must have done something wrong. if i change it from this


midi.channel1.csharp1 = swallow(Keyboard.NUMPAD2) and (var.Number = 1)
midi.channel1.d1 = swallow(Keyboard.NUMPAD3) and (var.Number = 1)

to


if var.Number = 1
midi.channel1.csharp1 = swallow(Keyboard.NUMPAD2)
midi.channel1.d1 = swallow(Keyboard.NUMPAD3)
endif

the “sends” come so repeatedly that my oneshots restart like 20 times a second on hold… so even one hit will repeat the sample approx. 3 times already. Of course i only want them to trigger once

anyone has an idea on that? maybe a command to suppress the re-triggering a note?

one thing is that you need an equality test so need to use == and not =

whether or not thats the only problem tho not sure…

if var.Number == 1
midi.channel1.csharp1   = swallow(Keyboard.NUMPAD2)
midi.channel1.d1        = swallow(Keyboard.NUMPAD3)
endif

quite embarrassing to make this mistake..

well, thanks for pointing it out. but even with this error removed i still found no way to make the if-statements work right. only my original code gives me proper one-shots
one-hit-one-play + no repeat on hold)
Holding down will keep the midi-key active, by the way

I changed the var.Number = X to var.Number == X
Hence I guess Operator “=” is more expensive in CPU-Usage!?

if pressed(swallow(Keyboard.NUMPAD1)) then var.Number++
if var.Number > 3  then var.Number = 1

midi.channel1.csharp1   = swallow(Keyboard.NUMPAD2) and (var.Number == 1)
midi.channel1.d1        = swallow(Keyboard.NUMPAD3) and (var.Number == 1)
midi.channel1.dsharp1   = swallow(Keyboard.NUMPAD4) and (var.Number == 1)
...

Honestly, I don’t really get why this works anyway. It just happend to work. Does glovePie convert stuff I don’t know off?
how could = and == give the same effect? Why do both stop the retriggering while holding the button in this scenario?

i’m never quite sure of the details of the scripting language glovepie uses :stuck_out_tongue: i wish it was something more standard - but i guess it’s optimised to be run in a tight loop many times a second and all

if you’re not seeing too much cpu usage then i guess no real need to worry about it anyway. odd tho - it should be able to work with grouped ‘if’ statements and should be more efficient too… i might have a play later with glovepie - been a while since i really used it too much

CPU-usage is ok. But it sure is not a bad idea to get it done right :wink:

[quote]
i might have a play later with glovepie - been a while since i really used it too much[/quote]

I Really appreciate that. Let me know if you find some clues