oomph

oomph

put a little oomph into it.

oomph is sequencer with multiple built-in synth and sample voices.

this script combines some previously contributed projects with additions. it currently encompasses:

many thanks for the guidance from @sixolet - I worked out a way to make almost every parameter modulateable through internal ramps/lfos thanks to studying their code. many thanks to @jaseknighter also who went through some early demos and made the code much better with his suggestions. happy to hear other suggestions.

Requirements

  • norns
  • midi controller (optional)
  • grid (optional)

Documentation

most of the usage can be found in the parameters - you can directly edit parameters or use a midi controller to map devices for easy manipulation. there are also LFOs for nearly every parameter accessible through the “MOD” menus.

monophonic synth

the main screen allows you to sequence the monophonic synth. the sequencer ui is based off the TB-303 pattern chart (pdf).

  • K2 changes a parameter
  • K3 stops/starts
  • E1 changes pattern
  • E2/E3 navigate the individual parameters

the parameters are set out in columns, where each column is one of the sixteen steps of the sequence.

the first row is the note in the C major scale (this scale is transposed in parameters but still displays as the C major scale.

the second row allows you to modify the accidentals of each note (b = flat, and # = sharp).

the third row allows you to change the octave of each note - M for minus octave (-1) and P for plus octave (+1).

the fourth row allows you to add an accent or slide. “O” does an accent (i.e. provides Omph) and “H” provides a slide (i.e. the note Holds longer).

the fifth row can change the articulation of the sequence. the “@” denotes a gate, the “o” is a rest" and a “-” after a gate provides a legato. the actual strength of a legato is controlled in teh parameters by the “sustain” parameter.

audio input

audio input is re-routed through norns into the tape emulator. because of this, instead of using the “MONITOR” control in the audio mixer, you should instead use the “INPUT LEVEL” control in the parameters menu.

sample looper

the sample looper attempts to sync to the tempo by changing playback speed and resetting to the beginning at the beginning of the 16 step sequencer (can be controlled by a probability in the parametrs). the script tries to determine bpm from the filename if there is a “bpmX” in the name (i.e. mysample-bpm120-1.wav => 120 bpm). if there is no bpm available then the script figures out the bpm by a “best guess” approach by assuming that the loop is quantized to the nearest beat and checking to see which bpm allocates the most even number of beats.

there are some hard coded triggerable effects in the parameters menu and its possible to add your own since every parameter in the sample looper can be modulated using a variety of functions (sine, ramps, etc) - all you do is make a function that you want toggled (like this) and then add the name of that function to this array.

if you need a script to create quantized loops - checkout amen.

note: depending on how your loop is created, its possible that it doesn’t sound exactly in step with the rest of the sequences. to combat this there is a parameter at the bottom of the “LOOP” parameters called “latency” that lets you modulate how much the loop plays in front of or behind the beat.

chaining patterns

chaining patterns can be accomplished in the menu through the “BASS SEQUENCER”. every pattern will transition to another pattern after it is finished playing. by default, each pattern will automatically transition to itself (i.e. loop the current pattern). but can also be set to transition to any other pattern. to have a loop of multiple patterns, you need to ensure that the last pattern in the loop transitions to the first pattern. patterns are “unchained” by simply setting the transition back to itself.

copying patterns

copying patterns can be accomplished in the “BASS SEQUENCER” menu. simply select the pattern to copy to and from, and then trigger a copy.

grid

grid is an alternative interface for the main norns screen - it is totally optional.

the first five rows edit the parameters of the monophonic synth. the sixth row can be used to change patterns. the sixth row also allows chaining patterns by holding down one pattern key and pressing another while playing. the sixth row also allows copying patterns by holding down one pattern key and pressing another while not playing.

midi

In the PARAM menu there is a MIDI menu that lets you select a midi device that can be used to input into the “BASS” engine or into the “PLAITS” engine. You can also route output from the “BASS” into an external MIDI device - there is an option to set the portamento CC of your device which will also be sent according to the sequencing. this menu also has options to input sequences using a MIDI device.

todos

  • lfos: make more chaotic
  • midi: give tracks midi out
  • midi: allow midi in (for plaits, 303)
  • rpi3: possible cpu spikes?
  • grid: light-up special parameters
  • grid: recall patterns on double tap
  • grid: clear sequenced patterns
  • sound: distortion fx

known bugs

  • (cosmetic bug) if you goto a “MOD” and toggle one, and you go to the non-MOD page and change the parameter it will automatically turn off the toggle but the toggle won’t appeared to be turned off in the menu until you exit the menu and come back into the menu.
  • (ux bug) MOD lfos are set according to the current tempo, if you change tempos the MOD lfos will stay with periods from the previous tempo
  • (ux bug) the sample looper may not work fully with mono sound files, try to use stereo files

install

oomph will need 100mb of disk space (95 mb for wav files and 5 mb for SuperCollider files).

there are three steps to install.

first open maiden and run the following:

;install https://github.com/schollz/oomph

secondly, keep maiden open and run the following line to make sure everything is copasetic:

dofile("/home/we/dust/code/oomph/lib/update.lua")

thirdly, you need to restart your norns. now you can run oomph without issues.

update

to update the script just run the following in maiden:

dofile("/home/we/dust/code/oomph/lib/update.lua")
75 Likes

20 characters of this is amazing! Bravo!

4 Likes

oomph oomph oomph oomph!

:heart:

7 Likes

Dang norns in true groovebox form! This is rad.

4 Likes

May I steal the bassline engine, please? Sounds better than my lame attempt.

Great work!

2 Likes

definitely :blush: feel free to copy/cut/paste any code. the current engine is using tons of buses. a previous iteration with the same sound just utilized one bus and may be easier to integrate: oomph/Engine_Emu303.sc at 112ab6c8860e61a0d77b06ee497b5804d21a6ea0 · schollz/oomph · GitHub don’t hesitate to dm me if you need any help/explaination.

the main thing I added on top of the basic 303 emulation is the rising decay curve…as mentioned in this classic article:

article

it took a bit but I figured out I could recapitulate this exact behavior using a single bus with multiple envelope generators in SuperCollider:

supercollider

sc code
b=Bus.control(s);
c=Bus.control(s);
(
{
	Out.kr(0,EnvGen.ar( Env.new([0, 1, 0], [0.04, 4],-8),TDelay.kr(Impulse.kr(0),0.08),doneAction:2));
}.play;
{
	Out.kr(1,EnvGen.ar( Env.new([0, 1, 0], [0.04, 4],-8),TDelay.kr(Impulse.kr(0),0.08),doneAction:2));
}.play;
{
	Out.kr(0,EnvGen.ar( Env.new([0, 1, 0], [0.04, 4],-8),TDelay.kr(Impulse.kr(0),0.3),doneAction:2));
}.play;
{
	Out.kr(0,EnvGen.ar( Env.new([0, 1, 0], [0.04, 4],-8),TDelay.kr(Impulse.kr(0),0.6),doneAction:2));
}.play;
{
	[In.kr(1),In.kr(0)];
}.plot(2);
)

so a single bus is still required.

20 Likes

this is really good, amazing work

5 Likes

omg this demo is just such a magical capture – you’re a full wizard, zack. thank you for sharing this alchemy with us all, both in terms of the play and the code. superb.

15 Likes

I read that article, too, but didn’t get as far as implementing the cumulative envelope thing.

I did take the idea of adding the envelope back onto itself for accented notes from that post.

Tying the envelope decay time to tempo is an interesting idea. Maybe it would make more sense to link to step-length, rather than decay. I’m not sure that would be so easy to do though.

Anyway, I’m looking forward to having a look at the code!

2 Likes

This looks so cool! I love your work Infinitedigits!

I installed this on a not-up-to-date norns and got “supercollider fail” :frowning:

I’ve updated and removed Oomph but still getting Supercollider fail. Anyone able to suggest what might have gone wrong?

new script

matron

supercollider

no user matronrc file (/home/we/matronrc.lua) found, using default

loading matronrc file: /home/we/norns/matronrc.lua

setup IO screen:fbdev

setup IO keys:gpio

setup IO enc:gpio

setup IO enc:gpio

setup IO enc:gpio

IO setup OK.

font setup OK.

*** WARNING *** The program ‘matron’ uses the Apple Bonjour compatibility layer of Avahi.

*** WARNING *** Please fix your application to use the native API of Avahi!

*** WARNING *** For more information see http://0pointer.de/blog/projects/avahi-compat.html

Cannot lock down 107350048 byte memory area (Cannot allocate memory)

init oracle…

OSC rx port: 8888

OSC crone port: 9999

OSC ext port: 57120

OSC remote port: 10111

init weaver…

starting main lua vm

running lua config file: dofile(’/home/we/norns/lua/core/config.lua’)

MATRON

norns version: 0.0.0

git hash: be508b1

platform: 3

init dev_monitor…

setting cleanup…

init input…

running startup…

error loading keyboard layout, using old value: us

start_audio():

scanning devices…

got ttyUSB, assuming grid

monome device appears to be a grid; rows=8; cols=8; quads=1

handling pending events…

_norns.midi.add: 1, virtual, userdata: 0x3f15a0

grid added: 2 monome 64 m64-0376 m64-0376

running post-startup…

_norns._post_startup

script clear

norns.startup_status.timeout

SCRIPT ERROR: SUPERCOLLIDER FAIL

can you share the output of the crone side of maiden? you can click the tab when and capture that output when you restart.

:mage: :magic_wand: right back at you @dan_derks. when I started this project I consulted the moonshine docs which are just fantastic at getting me on the right foot when doing Supercollider stuff with norns (even after making sc things for a bit). thanks for all the support you constantly provide and your unending energy for this community.

6 Likes

compiling class library…

Found 738 primitives.

Compiling directory ‘/usr/local/share/SuperCollider/SCClassLibrary’

Compiling directory ‘/usr/local/share/SuperCollider/Extensions’

Compiling directory ‘/home/we/.local/share/SuperCollider/Extensions’

ERROR: duplicate Class found: ‘MiClouds’

/home/we/.local/share/SuperCollider/Extensions/MiClouds/MiClouds.sc

/home/we/.local/share/SuperCollider/Extensions/mi-UGens/Classes/MiClouds.sc

ERROR: duplicate Class found: ‘MiRings’

/home/we/.local/share/SuperCollider/Extensions/MiRings/MiRings.sc

/home/we/.local/share/SuperCollider/Extensions/mi-UGens/Classes/MiRings.sc

ERROR: duplicate Class found: ‘MiElements’

/home/we/.local/share/SuperCollider/Extensions/MiElements/MiElements.sc

/home/we/.local/share/SuperCollider/Extensions/mi-UGens/Classes/MiElements.sc

ERROR: duplicate Class found: ‘MiPlaits’

/home/we/.local/share/SuperCollider/Extensions/MiPlaits/MiPlaits.sc

/home/we/.local/share/SuperCollider/Extensions/mi-UGens/Classes/MiPlaits.sc

ERROR: duplicate Class found: ‘MiMu’

/home/we/.local/share/SuperCollider/Extensions/MiMu/MiMu.sc

/home/we/.local/share/SuperCollider/Extensions/mi-UGens/Classes/MiMu.sc

ERROR: duplicate Class found: ‘MiVerb’

/home/we/.local/share/SuperCollider/Extensions/MiVerb/MiVerb.sc

/home/we/.local/share/SuperCollider/Extensions/mi-UGens/Classes/MiVerb.sc

Compiling directory ‘/home/we/norns/sc/core’

Compiling directory ‘/home/we/norns/sc/engines’

Compiling directory ‘/home/we/dust’

ERROR: There is a discrepancy.

numClassDeps 1583 gNumClasses 3154

I can see lots of duplicate stuff there but not sure how to remove it!

this solution posted here should fix the issue:

1 Like

Oomph is so much fun, thank you very much for this.

One small question though: do loops have to be in the same folder als the ones installed with the script? I did not manage to play other files, e.g. in the tape folder.

3 Likes

Hi Folks -
This is my first time on here. Really enjoy this community. I’m a noob, and just getting comfortable loading scripts onto my Norns Shield (211028).
I have been attempting to install infinitedigits’ excellent new script Oomph via maiden, the install came up as error: load fail.
I’ve attached a screen grab from Matron here. Your insight would be appreciated.

1 Like

@baldego welcome to the community!

i’m curious if you followed the custom installation instructions @infinitedigits documented on the Oomph thread?

1 Like

@jaseknighter yes I did.

it looks maybe you entered the install command into the wrong part of maiden? this is where you should enter the install commands:

also a warm welcome to you @baldego!

they do not - you should be able to navigate “up” a folder and choose another folder and choose other loops.

3 Likes

@infinitedigits thank you. I’ll give that a try, and update here.

@infinitedigits @jaseknighter yes, that did the trick. Oomph is now loaded on my Shield. Thank you for your help!

6 Likes

Hi there,

Tnak you @infinitedigits for your amazing work ! I installed Oomph through your instructions but my Norns screen keeps stucking on “loading”.

Here is what it says in Maiden