Skip to content

Instantly share code, notes, and snippets.

@jaseknighter
Created August 15, 2021 18:30
Show Gist options
  • Save jaseknighter/9cb3aca53918d838356aa5e8294476c6 to your computer and use it in GitHub Desktop.
Save jaseknighter/9cb3aca53918d838356aa5e8294476c6 to your computer and use it in GitHub Desktop.
An exploration of Just Friends' Geode
--- An exploration of Just Friends' Geode
-- from maps with trent: https://www.youtube.com/watch?v=fMzM4omsIg8&ab_channel=Trent
-- Just Type reference: https://github.com/whimsicalraps/Just-Friends/blob/main/Just-Type.md
-- mode sets rhythmic relations:
-- cycle: rhythmic undulation to the envelope level
-- The rhythm is generated similarly to transient,
-- however the variation is applied continuously
-- (rather than in single steps of beats).
-- Applying RUN voltage emphasizes every 2nd then 3rd then 4th event,
-- however all the in-between beats are available too.
-- Subtle CV shifts allow for a variation of groove
-- with nothing but volume manipulation.
-- Negative RUN levels emphasize every fraction of a beat.
-- Works extra well with quantize active.
-- sustain:
-- The first envelope is full volume and each one thereafter
-- will decrease in level.
-- By adding a RUN voltage the rate of decay can be modified.
-- TIME & INTONE set a base envelope rate, divisions sets the
-- rhythm of notes, and RUN sets the amplitude cycle
-- relative to repeats.
-- transient:
-- Each output has the same level
-- RUN voltages will introduce a rhythmic variation every n repeats.
-- The TIME & INTONE controls maintain their standard free-running influence,
-- speeding up and slowing down envelopes,
-- while the rhythms are controlled remotely.
-- ii.jf.play_note( divs, repeats )
-- Play a sequence, dynamically allocated to a channel
-- ii.jf.play_voice( channel, divs, repeats )
-- Play a sequence on a specific *channel*
-- min divs is 1
-- sending repeats a negative number has it repeat infinitely
-- ii.jf.tick( divs )
-- Clock *Geode* with a stream of ticks at *divs* per measure
-- ii.jf.tick( bpm )
-- Set timebase for *Geode* with a static *bpm*
-- ii.jf.quantize( divisions )
-- Quantize *Geode* events to *divisions* of the timebase
j = ii.jf -- alias to address just friends with just `j`
function init()
j.mode(2) -- set jf to geode mode
input[1]{
mode = 'change',
direction = 'rising' -- rising, falling, both are the options
}
end
counter = 0
divs = 1
direction = 1
input[1].change = function(count)
j.tick(8)
--note( 4, 3)
--note(6, 3)
--note(12,3)
--note(12,7)
counter = counter + 1
if (divs < 16 and counter > 4) or (divs >15 and counter > 2) then
counter = 0
if divs%2 == 0 then
note (divs/2, divs*2)
else
note (divs, divs)
end
divs = divs + direction
print(counter,divs)
if divs == 32 then
--divs = 1
direction = -1
elseif divs == 1 then
direction = 1
end
end
end
function voice( chan, divs, repeats )
j.play_voice(chan, divs, repeats)
end
function note( divs, repeats)
j.play_note(divs, repeats)
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment