So, I figured I’d tinker with the Gibberwocky object in MAX, and maybe because I’m relatively new to MAX and this object I can’t sort this out, but anytime I bang on the object to open the browser/editor, the scene is the ‘help’ file patch. I’m a bit confused why this is and what I have to do to have a blank slate.

Sorry for perhaps the obvious question, but yeah, clueless here and want to tinker with Gibberwocky modulating a patch I’ve been working on :slight_smile:

Hmmmm… I’m assuming you have the help patch open at the same time? At the moment I guess you can only have one gibberwocky instance open without running into this problem… I thought we solved this problem at some point but apparently not.

Anyways, in the short term, does closing the help patch fix this problem?

I think I sorted it. My own cluelessness and inattentiveness to the Youtube video explanation had me tripping up with some other stuff too :slight_smile:

Hoping to find some time today to tinker. Huzzah!

interested in seeing/hearing things people are doing with Gibberwocky. I just started using it myself with atom and in combination with clyphx I have this total control over the DAW through code that I’m really enjoying.

2 Likes

I’ve been using it a bit to control Max and the modular via ES8. A lot of fun.

Will post a video once I get the setup right…

2 Likes

Her’s a work in progress video showing how I’ve been using Gibberwocky with Max. I’ve recorded a set of stems from the modular, focusing on these ambient sounds that are harmonically quite static but have lots of rhythmic fluctuation in them. Lots of Three Sisters in formant mode. The patch shown sequences these as a set of tape loops.

This is my first patch with Gibberwocky in control - so there’s nothing super complex going on, just some slow changes to UI objects, lots of randomisation for a more generative approach. It definitely feels useful to not have to build these things in Max though and have all the sequencing in one place.

Additionally there is some control of my modular through an ES8, with sync going to an Echophon and varying levels of voltage to Impulse Drive. Here’s a shot of the modular patch:

And the Max patch:

All the players are top left, some filtering and envelope shaping top right, LFOs to impulse drive centre right, function generators middle left then returns from the modular and effects bottom right.

Planning on doing a set of these.

7 Likes

@_mark That’s beautiful!!! Thanks so much for sharing, I really enjoyed the sounds you created.

1 Like

What the best practices for saving Gibberwocky scripts within Max patches?
And is there an automated way to reload them?

If not do people just save them as text files outside of the patch (or maybe inside via a comment or something?) and manually reload them?

Also, I’m brand new to the language and I’ve got my first patch hooked up and communicating. I’m trying to make values smoothly transition using .seq instead of jump though. The line documentation is hurting my head a bit. I tried to modify the example but it’s still jumping the ratio message and not interpolating it. Any ideas?

l = line( 4, 2.9, 3.1 )
message( 'ratio' ).seq(l, 2  )

l.start.seq( [2,3.8,4], 2 )
l.period.seq( [1/2,1],1 )

Thank you.

If you’re using https://gibberwocky.cc/burble as the editor, you can use Ctrl+Shift+S to save your current file and then Ctrl+Shift+L to load this. This is only for a single script, so I use it to save functions / values that I might want to use across multiple gibberwocky sessions… “setting the stage” if you will. Otherwise, yes, unfortunately I just save by copying/pasting into a text editor. There might be some improvements to that coming this summer.

In regards to the line example you posted, it should sample the line every two measures, changing the start/period at various other times. Is the problem that this isn’t the behavior you see, or is that it’s not the behavior you were expecting?

Thanks for trying gibberwocky out!

1 Like

Thanks @charlieroberts.

Essentially I’d like the simplest way possible to do something like this:
message( 'ratio' ).seq( [2.9,3.1], 2 )
But have the values slowly move from 2.9 to 3.1 (for instance) over the course of 2 measures instead of jumping every 2 measures.

And got it re: the editor. Do you save them in an external editor? Or do you save them in Max somehow And speaking of, is it possible to use a code editor instead of https://gibberwocky.cc/burble ?

Cheers!
Ben

It would be nice if there was some concept of control rate in the Max version of gibberwocky, but I don’t think it currently exists. So, you can either use line to make a gen~ expression in [gibberwocky] and sample it in Max (see the “modulating with gen~ tutorial”), or you can just sequence using your line object at a much faster rate. For example, this should sent an interpolated ‘ratio’ message every 1/128th note, the line has a period of two measures:

l = line( 2, 2.9, 3.1 )
message( 'ratio' ).seq( l, 1/128  )

I don’t have a way to save sketches in Max currently, I just use an external editor. An Atom plugin was made a while back, but I think the project would need to be updated to work correctly (https://github.com/wichniowski/atom-gibberwocky). Hope to make some progress on better editor support this summer.

1 Like

Thanks again @charlieroberts. I’ll check out that ~gen tutorial.

So essentially I wasn’t sampling the line enough? I’d still have to do this full code to step through values in the line, correct?

l = line( 4, 2, 3.5 )
message( 'ratio' ).seq( l, 1/128  )
l.start.seq( [2,3.8,4], 2 )
l.period.seq( [2,3,4],2 )

I realized that because this is all within Max I can very easily achieve what I’m looking for by slewing in Max after receiving the stepped values from Gibberwocky. I’d ideally like to understand the language better but it works for now this way as well. Thanks.

Yeah, just applying some type of slewing / lowpass on the stepped signal should work well!

Here’s what should be happening the way you have the code now:

// create a line/ramp/phasor/sawtooth traveling from 2 to 3.5 over four measures
l = line( 4, 2, 3.5 )
// sample the line object each 1/128 note and send the result out the left [gibberwocky] outlet
// output with the prefix 'ratio'
message( 'ratio' ).seq( l, 1/128  )
// every two measures, change the minimum/start value of the line
// note: I have no idea what happens when the start value is greater than the end value in line() !
l.start.seq( [2,3.8,4], 2 )
// every two measures, change the period of the line
l.period.seq( [2,3,4],2 )

Hope that’s helpful!

2 Likes

Super helpful thank you!

2 Likes

Hey @charlieroberts. I’m back with a few more questions, lol.
I’ve been exploring the integration with some Max patches and loving the results I’m getting with it.

My first question is about gaining control back via the Max gui objects after I’ve stopped the Gibberwocky control. I assumed that .clear() would work but it doesn’t seem to be. Am I using it wrong? I tried .stop() before the clear messages but that didn’t seem to make a difference. I also tried separating the commands with a carriage return in between.

l = line( 4, 2.9, 3.1 )
message( 'ratio' ).seq( l, 2  ).clear()
l.start.seq( [2.015,3.8,4], 2 ).clear()
l.period.seq( [1/2,1], 1 ).clear()
params[ 'Slew' ].seq( [20, 30, 80], 1.99 ).clear()

I’ve also noticed one persistent bug with the graph displays for visual feedback. It consistently removes the comma after the closed bracket here:

l.start.seq( [2.015,3.8,4], 2 ).clear()
and turns it into:
l.start.seq( [2.015,3.8,4] 2 ).clear()
I then get errors on upon that when I do the next evaluation.

As always, thank you!

EDIT: Sometimes the bug seems to remove the bracket FYI

Yeah, that graph display bug is really annoying. I’ll try to see if I can fix it this week.

In regards to stopping the sequences, there’s a bit towards the end of the “basic sequencing” tutorial that talks about how sequencers are assigned different ID numbers. Unfortunately, the tutorial doesn’t get into how you use these ID numbers, which is the info that you actually need.

In your case you’re only applying one sequence to each property, so all of them use the default ID of 0. This means you can target them as follows:

l.start[ 0 ].stop()
l.period[ 0 ].stop()
message( 'ratio' )[ 0 ].stop()
params[ 'Slew' ][ 0 ].stop()

If you create multiple sequencers targeting properties you then need to specify individual sequence IDs, as a third parameter to any call to .seq(), you can then use that ID to select that particular sequence for manipulation.

You can see a little bit more of this syntax for targeting sequences in the “patterns and pattern transformations” tutorial as well.

1 Like

Ah. Brilliant thank you!

EDIT: Sorry @charlieroberts , a follow up question.
That syntax doesn’t seem to be working with sequenced params. ie:

params[ 'Slew' ].seq( [820, 1030, 1400], 2, 0 )

params[ 'Slew' ][ 0 ].stop() 

I noticed in the documentation that params don’t have any methods mentioned. Does this explain why that doesn’t work but adding a .stop() does? ie:

params[ 'Slew' ].seq( [820, 1030, 1400], 2, 0 ).stop()

Thanks again!

Hmmmm… I can’t recreate this bug. Using the gibberwocky.maxhelp patch, I can run this line from the introductory tutorial:

params['White_Queen'].seq( [10,32,64,92,127], 1 )

and then stop it with:

params['White_Queen'][0].stop()

… as well as restart it with a call to .start().

One other idea you could try… every call to .seq() returns the generated sequencer object. You could store that in a variable and then use that reference to stop/start. For example:

seq = params['White_Queen'].seq( [10,32,64,92,127], 1 )
// wait some amount of time and then...
seq.stop()
1 Like

I’m curious on how to implement the accumulator if you get a sec.

I’d like the second value in both of the seq arrays to accumulate by an integer of 1 each time the seq loops. So the 1.75 and 4.8 values below:

message( 'ratio' ).seq( [1.5, 1.75], [8, 4.8] )

Should I store those values as variables and run accum on them?
I’m sure it’s not right as it doesn’t work, but something like this?

one = 1.75
one.accum(1, 1.75, 5.75)
two = 4.8
two.accum(1, 4.8, 10.8)
message( 'ratio' ).seq( [1.5, one], [2, two] )

Thank you for all your help.
B

Hmmm… so that’s getting outside of the built-in gibberwocky functions; we’ll need to write some (very short) custom JavaScript functions to make this happen. In our arrays, our second items will be functions that will return the value of variables. Then we’ll create a standalone sequencer that updates those values over time.

If you haven’t done much JS before ()=>{ //some code } is shorthand to create a function that executes a chunk of code, ()=>someValue is even shorter and creates a function that returns a value.

value1 = 1.75
value2 = 4.8
message( 'ratio' ).seq( [1.5, ()=>value1 ], [8, ()=>value2 ] )

Seq( ()=> { value1++; value2++ }, [ 8, ()=> value2 ] ).start()

Seq is creates a standalone sequencer object… these objects are created behind the scene whenever you sequence anything. In this case we explicitly create one and tell it to call a function that increments our values.

Please feel free to ask questions about this code chunk!

1 Like