# An exploration of Just Friends' Geode

> Source: <https://gist.github.com/jaseknighter/9cb3aca53918d838356aa5e8294476c6>
> Published: 2021-08-15 18:30:39+00:00

gistfile1.txt

      This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
      
Learn more about bidirectional Unicode characters

 
    Show hidden characters

--- 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
