Valid point. It would have to be simple - not many options. But if there is eventually ii comms with Teletype, that would make a lot of sense.

1 Like

dunno! does it have i2c? As an addendum, I havent been able to get my crow working with my ansible over i2c but its be jamming along just fine with Just friends and w/ … I think maybe i need ti try a new cable though as im using the 6 pin headers and had to reverse that part of the chain since ansibles ground pins are on the opposite side…

my initial search didn’t find anything-

could (does already?) crow do some simple two-voice hocketing, like the Intellijel Shifty?

There’s a shiftregister.lua script in Bowery, so as far as I understand, yes

It does have i2c but I’m unsure if the ā€œexpanderā€ functionality requires you to load an alt firmware on the ansible or not (and I don’t know if there is a similar one for the trilogy modules)

Could it be you’re running into this issue? https://github.com/monome/crow/issues/197

Unfortunately first thing I tried was a 0 index … Can’t get any kind of triggers or cv out of it though it does say ā€œansible loadedā€ or whatever when I fire up ii.ansible.help() or any of the commands first try, I’ve now tested using multiple cables, a crimped 6 pin (that works with jf & w/) and 6 individual wires. It’s a brand new (less than a month old) ansible & crow… Is there some kind of debug log I could reference for druid? Druid.log doesn’t seem to have anything in it.

Just to be sure: You did enable the pullup using ii.pullup(true)?

I don’t think there are any other logs/outputs from crow apart from what druid itself is showing.

Yep did that, no dice unfortunately.

I have no idea whether or not this is possible, but is it theoretically possible to use both the JF ii integration and the front panel ins and outs? Or better yet, that plus utilizing the ansible outs? I’d love to see something like Orca utilize the JF poly synth (similar to the way it does with Pilot on the desktop) and be able to also have a bunch of trig outs to do other things. Just curious.

1 Like

:slight_smile:

crow’s ii.jf.play_note(pitch,vel) and ii.jf.play_voice(chan,pitch,vel) are controlling JF equivalently to TT’s JF.NOTE and JF.VOX commands.

Hopefully that answers your question @yobink

1 Like

i wrote a little function to read rhythms encoded as integers. hoping to abstract it a little and implement it in crow, but this is the basic idea. It takes an integer, checks the 1 bit (by modulus’ing it by 2) and prints a hit if the bit is on. then it shifts the bits to the right and does it again for the next beat! right now it’s set up for 8 bits/beats but that could be a parameter in the implementation.

beat = 53

for i = 0,7 do
    if math.fmod(beat, 2) == 1 then   
      io.write("hit!\n")
    else
      io.write("rest\n")
    end
    beat = bit32.rshift(beat, 1)
end
8 Likes

Noise Engineering’s Numeric Repetitor manual is super relevant here for those that want to explore this concept further on their crows!

5 Likes

Possibly the wrong thread for this…

The promo video for Crow shows live coding. Is that Druid? It appears to be…

A couple of questions if you don’t mind:

  1. For live coding, in addition to having to literally type commands into Druid, can I create and save sets of command lines in a text editor like textedit, and simply copy one or more lines from the text editor and paste them into Druid in real time?

  2. Is there any way to copy text from the print area above the //////////////////// and paste it into the command line below the ////////////////////? Does that make sense?

  3. I’m sure this is happening but I have some difficulty with finding things on Lines… are folks sharing granular command lines? Is that the same as sharing scripts? Sorry if that’s stupid… I’m reasoning that a script is comprised of one or more individual commands, which can presumably be reused in different orders and contexts…

So I’m thinking that a good way to approach learning how to code for Crow is to start with commands and move to the smaller parts by learning the specific syntax while also learning the larger parts by studying full scripts…

Does that make sense?

Thanks!

1 Like

Yeah, exactly. From what I’ve seen so far, ā€œlive codingā€ w/ Druid often takes the form of dynamically adjusting or influencing part of a larger script with single commands. For example, adjusting one of the script’s variables, or firing one of its functions at a given moment…

I’m toying with the idea of making a 30-minute norns/crow/lua video tutorial where I put together a very simple and musical script – something along the lines of creating two independent melody/gate patterns that can be randomized in simple ways.

I feel like I know 1% of lua, so maybe it’s worth showing how even this little amount of knowledge can go a long ways in pursuing musical ideas.

13 Likes

You can do this, but it’s important to also understand that any function or variable that is defined in a script can also be accessed in druid. So, if you find yourself copying and pasting some complex lua line into druid all the time, you could also define a function in the script that does this for you.

This way, instead of pasting something like for i=1,8 do print('caw') end into druid, you define a function in the script:

function caw()
  for i=1,8 do print('caw') end
end

and then you just type caw() into druid. Of course there may also be times when you want to type logic directly into the command line, it all depends on the use case.

3 Likes

Whoa very neat! Copied study 5 over, droning out as I type. Haven’t shared any of your audio->midi implementations, have you?

not as of yet. :sweat_smile:

1 Like

implemented and elaborated on my idea from earlier. looking for some opportunities for refactoring/ways to make this more flexible/usable.

 --generate rhythms from integers


function init()
  output[1].action = pulse(0.1, 10)
  beat = { 179, 10, 255, 203 }
  pattern = 1
  beatReset = 0
  clock = metro.init{ event = drum_loop, time = .2, count = -1 }
  clock:start()
end

function drum_loop(count)
  if math.fmod(beat[pattern], 2) == 1 then
    output[1](true)
  end
  beat[pattern] = bit32.rshift(beat[pattern], 1)
  beatReset = beatReset + 1
  if beatReset == 8 then
    beatReset = 0
    beat = { 179, 10, 255, 203 }
    pattern = pattern + 1
    if pattern == 5 then
      pattern = 1
    end
  end
end

edit: looking at using table.getn() to make the pattern length check dynamic.
i tried making a copy of the initial array of integers in another variable then reassigning the main one to that stored value but i guess arrays/tables in lua don’t work that way? i also tried table.clone() to copy it but that didn’t seem to work either.

1 Like

I might make a little function called init_beat() that does this, so you don’t have to repeat it in both functions.

if pattern == 5 then
  pattern = 1
end

this could be changed to
if pattern = #beat + 1 then pattern = 1 end
or
pattern = pattern % #beat + 1

If you use #beat instead of hardcoding the 5, it should always work if the beat length changes so you don’t have to update that number.

You could also pass an optional maxBeatLength param to drum_loop, like

function drum_loop(count, maxBeatLength)
  maxBeatLength = maxBeatLength or 8

and change if beatReset == 8 to if beatReset == maxBeatLength

This way it would default to 8 but be customizable if the script author wants to pass in a different number.

2 Likes