Yeah, that is effectively the kind of thing I was looking for. Thanks! I’ll give this a think.

Hi all,

I’m having trouble using Crow with Max. I’m running Max 8.18 on Mac OS 11.1 and Crow Firmware 2.0.0 as confirmed by checking in Druid. I’ve followed all the steps to install the crow_max files in my Max user library as per these instructions:

but I can’t instantiate the crow object in Max (I just get the ‘no such object’ error message). My Crow otherwise seems to be OK as far as I can tell, and I can’t figure out why this could be happening…

Any advice please?

Hi! I’ve been writing a couple of crow scripts, which has been a blast: the event based api is perfect! I’m was wondering if its possible to detect whether something is plugged into the jacks? I want to write some normalisation behaviour in my scripts :slight_smile:

I figured this out, it was an issue with my Max search path. For some reason it wasn’t looking in my personal user library, it was just looking at my shared user library, so I dropped the crow_max folder in there. If anyone has a similar problem, check out this article on how to view and update your Max search path: Search Path - Max 7 Documentation

2 Likes

oh, jeez, i’m so sorry for missing your original post!

did the install steps here not lead you to the right library? happy to add additional info about ensuring the Max search path has the right folders, but i’d hoped that asking Max for the right location would’ve been bulletproof.

2 Likes

No worries! I really should have figured this out sooner. The part I got stuck on was:

“Open Max > Options > File Preferences > highlight User Library > the rightmost icon in the bottom bar should illuminate. Clicking this icon will open the User Library folder, where you can drop the crow_max folder.”

When I open Max > Options > File Preferences there are 4 folders: Global Library; User Library; Snapshots; Examples. For some reason my Max search path didn’t include the ‘User Library,’ but it did include the ‘Global Library.’ Not sure if this is normal or just a quirk with my Max installation / setup. First I tried to update the path list to include the ‘User Library’ location, but that also didn’t work so maybe there’s some other issue going on with my file system. Then I just dropped the crow_max folder into the ‘Global Library’ and hey presto.

Looking for some suggestions (and an excuse to think through this problem).

I’m trying a new approach to my system, and I am hoping to make some space by ditching an Ornament and Crime and using crow as a quad sample and hold: 2 v/o voltages sampled by 4 triggers.

The basic scripting is easy! The rub is that, in order to have enough inputs, I am trying to share a TXi between two crows. There are no other devices on the chain. The first crow is polling the knob positions at a slower pace in order to control my percussion script. The other crow is polling the inputs to catch triggers.If the triggers are high, I am sampling the voltages on the second crow’s inputs and updating its outputs.

As is, it seems like I have to set the metro polling rate to hundredths of a second to avoid audible lag when testing for triggers. That also means I am flooding the i2c bus, and the percussion module has a tough time getting its messages. In an ideal world, I’d use the crow’s inputs to detect the triggers, but I need to sample 4 triggers, AND my TXi has 4 inputs that were not otherwise being used (I also don’t have room for a 3rd crow).

Even with the bonkers fast polling time, the S&H is still off sometimes.

S&H Source Code
state = {
  [1] = false,
  [2] = false,
  [3] = false,
  [4] = false
}

function init()
  for i=1,4 do 
    output[i].slew = 0 
    output[i].scale({}, 12, 1.0)
  end
  
  metro[1].event = function(c)
		for i=1,4 do  ii.txi.get('in', i) end
  end
	
  metro[1].time = 0.003
  metro[1]:start()

  ii.txi.event = function( event, data )
  --print(event.arg)
  if event.name == 'in' then
    chan = event.arg
    -- if the trigger is high
    if data > 1 then
      if state[chan] == false then
        state[chan] = true 
        sample(chan)
        -- print(chan)
      end
    else
      if state[chan] then
        state[chan] = false
      end
    end
  end
  end
end

function sample(channel)
  if channel < 3 then
    output[channel].volts = input[1].volts
    -- print(output[channel].volts)
  else
    output[channel].volts = input[2].volts
  end  
end

I could potentially have one crow do all of the polling and then instruct the second crow to do it’s sampling, but that would still require getting messages through on a busy i2c bus.

I realize this isn’t the ideal way to do this, but I’m trying to use the resources I have available.

If anyone has any clever notions about how I could accomplish this more reliably, I’d welcome any insight!

PS - In case this is helpful to anyone else: After making my own i2c cables, the issues I was having with my TXi appear to have completely gone away? I’d tried 3 different cables, and all of them were having periodic dropouts at random times after startup (which required a system reboot). I was never able to catch the moment it happened with debugging enabled, so I still am not sure what what happening. But if you are having mystery i2c dropout issues, keep trying new cables!


Edit: Continuing to think on this, I’m wondering if altering the TXi’s firmware to make it behave like a pseudo leader is the best solution? The crow could register itself as a listener, and the TXi could send messages based on changes to quantized values? Or something like that.

I’ve already got another daunting firmware project to tackle, so it’s definitely not my preferred solution. However, it would reduce the traffic on the i2c line by an order of magnitude, as the TXi is better equipped to notify the crows of changes, in my particular case, rather than the other way around.

1 Like

Best solution is definitely crow A as leader, crow B and TXi as followers. Anything else will end in bus jams. Also, if you only use TXi for CV and use the crows’ inputs for triggers, you can get reliable interrupts instead of praying to catch a 10mS trigger while polling the TXi.

1 Like

Sorry, I should have mentioned explicitly that crow A is taking an external clock and reset for my percussion script. I could maybe free up the reset, but I probably want the much faster clock pulse on a crow input. :thinking:

Thanks for the suggestion. I can try to merge my scripts to see if that gets things to behave in a tighter more reliable fashion.

Shoot, well if you can guarantee that your triggers at the TXi are more like gates (Ladik Gatsby comes to mind, or even just decay-only envelopes with threshold defined in crow A) then you could at least take some pressure of the needed polling rate.

1 Like

Yeah. They’re coming straight out of Confundo Funkitus, so I don’t have much in the way of control without adding another module, which sort of defeats the point. If I end up adding 6hp+ then I might as well keep the uO_C.

At the very least it’s worth trying out a mega-script before exploring more options.


I may not be doing this as intended: To receive the call on another crow, you need to overwrite the default call behavior in your init, right?

So like:

ii.self.call1 = function(e,v)
{
    --do stuff for a single argument call
}

Is that the correct approach to the current methodology? Otherwise the other crow doesn’t seem to do anything but print the the call, as that is the default behavior for the function. Listening for an event didn’t seem to register an event on my second crow.


Edit: And to confirm, my impulse to avoid combining scripts was clearly wrong, as performance has improved following your suggestion. Still need to stress test it to find the best polling speed, but definitely better.

1 Like

Crow utilizes some “behind the panel” digital connections by connecting to neighboring modules’ I2C headers. There is an emerging lingua franca to this digital communication (based on Monome Teletype-to-Trilogy “II” interactions) and many digital modules now can control and/or be controlled on I2C. Some such modules accept messages which change their settings in a way which is inaccessible via CV.

Oh no! your post is gone. I was just getting warmed up. I do think “Laptop + Crow + Just Friends” is an excellent intro to some aspects of musical coding, btw.

1 Like

Crow communicates with Just Friends over ii, a digital protocol. Because of this, it is not limited to the amount of physical jacks on Just Friends, and can address more parameters.

1 Like

after tweaking the first script/manually uploading in Druid, my crow wont boot normally any more on a Windows 10 machine. (could this be some kind of conflict between a manually uploaded first.lua script and the default first.lua script?)

Here’s what I’ve done:

  • after tweaking the script and powering down, I got the ‘device not recognized’ issue
  • forced it to bootloader mode via jumper, but still not recognized by df util
  • used Zadig to install the WinUSB driver
  • now recognized by df util, Ive tried the erase user script and reflashing to 2.1.0 a variety of ways, both seem successful…but after a restart outside of bootloader mode there is no USB activity at all when I plug it in. no error, no new USB devices in Device Manager, druid still says crow is not connected.

here’s what I get when attempting to reflash. I do see the brief ‘cant detach’. after this and the jumper has been removed before the update, the dtfu bootloader device disappears and nothing else reappears. Any help is greatly appreciated!

Invalid DFU suffix signature
A valid DFU suffix will be required in a future dfu-util release!!!
Opening DFU capable USB device…
ID 0483:df11
Run-time device DFU version 011a
Claiming USB DFU Interface…
Setting Alternate Setting #0
Determining device status: state = dfuIDLE, status = 0
dfuIDLE, continuing
DFU mode device DFU version 011a
Device returned transfer size 1024
DfuSe interface name: "Internal Flash "
Downloading to address = 0x08020000, size = 281496
Download [=========================] 100% 281496 bytes
Download done.
File downloaded successfully
can’t detach
Resetting USB to switch back to runtime mode
Update successful!
Press any key to continue . . .

EDIT: I’ve tried all of this on another Win 10 machine with the same results.

EDIT REDUX: all outputs are showing 10v so I emailed monome :sob::sob::sob:

EDIT REDUX REDUX: fixed with 2.1.1 release!

1 Like

I think I’ve got my head around Crow and how it works and what it does. And I think that it could be a handy thing to fill out some of the spare HP in a Make Noise Tape & Microsound system.

My first thoughts were that I could use it to get a clock from norns into the T&MMM, e.g. for syncing Morphagene & Mimeophon with a script running on norns. I’m also thinking that I can probably find or create scripts to use it as clock divider - another module I’d like to have in the system is a Tempi; perhaps I could get at least some of the functionality of Tempi in Crow?

I have a DivKid / Instruo øchd in the skiff, and I’m thinking of adding a DivKid / SSF RND Step at some point. Presumably the things these modules are doing are things that Crow could mimic pretty easily? (Although I really like the øchd, so I don’t think it’s going anywhere soon.)

Am I thinking along the right lines here, or have I missed the point of Crow? Are there any other really great things I could be doing with a Crow in a T&MMM, or is it not a good idea? Is anyone already using a Crow in T&MMM?

1 Like

The way I like to think about crow is that it is a 2 in 4 out module. What those 2 in and 4 out do it kind of up to you. It has an internal clock, so you could easily turn it into a clock divider/multiplier. But really, that’s just scratching the surface. It can also slew between value changes, so you could have it be an LFO. You could write a script that on each tick of its clock ticks it progresses through some list of note values. Effectively turning it into a sequencer. You could write a script that sent musically random CV out to different modules. There’s a lot you could do.

I used to have a Tempi, so I can compare to it. The thing you’ll miss in a crow is the immediacy of switching up the clocked out puts. But what you’d gain is the ability to programmatically control each output.

I love watching Trent’s maps videos on YouTube. There he goes through a bunch of really cool uses for crow. This videos have given me a bunch of great ideas. Here’s one: https://youtu.be/2juKwBvzEJY

Sorry to kind of open Pandora’s box on you here. Crow can do a lot. Hopefully this helps and doesn’t muddy the waters even more.

I’d also look at what scripts others have written in the Library section. Yes, it can be a clock module, but it can also be so much more.

4 Likes

yes, crow is a very useful little one. i have two - one to sync norns as my master clock and another that’s usually running a dual quantizer to clamp cv to scales, but i also use it as a clock divider, logic, mini rungler, shift register. some great scripts in the comments here as well -

1 Like

No this all makes sense and is good - thank you. I have both a Teletype and a Tempi in another skiff, so it’s more of a friendly bento box than a scary Pandora’s box. :slight_smile:

So might it be fair to describe Crow as almost like a “headless Teletype-lite” kind of thing?

Can there be real-time communication between norns and Crow - e.g. is it be possible to run a script on norns that takes input from a grid or arc and then passes that on to Crow - effectively using the grid or arc to produce CV output from Crow?

I’ll definitely check out Trent’s videos - thanks for the tip!

Yes. Headless Teletype is a good way to think about it. Not sure I would say “lite”, just different. Real-time communication between Norns and crow is possible, but I haven’t really played around with it as much as I’d like to. I’ll let others talk more about that. Here’s a link to the Norns ii reference so you can see the crow commands: scripting with norns - docs

1 Like

I have never had trouble flashing Crow but this time the update failed. I forced bootloader and the process seemed to finish as opposed to hanging but when restarting rack Crow shows as disconnected. Tried a restart of Mac along with a different port and cable but no joy.

Any ideas? on the 2.1.0 version