Also make sure your crow firmware is up to date.

1 Like

Thanks for the help! You are right awake’s output is not assigned to crowJFii. It works now :smile:

2 Likes

Thanks for the heads up! just checked that my Crows firmware is up to date. Everything is working fine now. thank you :smile:

Need help!
I received crow today and full of excitement plugged it in to play first immediately.
I imagined it would spit out beautiful melodies but instead I got wacky atonal sequences.
Connected crow to m4l to check if it tracks v/8 well, it does not.
I pressed C and tuned the oscillator. Going up it gets sharper. If C is C then E is F and C an octave up is E flat. And it’s the same with both outputs.
Tried to recalibrate the unit but nothing changed.
What could have gone wrong here?

weird! have you updated the firmware? additional calibrating troubleshooting tools [ cal.test('default') and cal.print() ] are also outlined here: https://monome.org/docs/crow/technical/#calibration

Should I update it? It says it’s 1.02
cal.print gave me these:
crow > dac1 -0.005359, 0.999602
crow > dac2 0.019319, 0.994565
crow > dac3 0.022049, 0.995992
crow > dac4 0.009265, 0.994067

What oscillator are you using? Are you sure it is correctly calibrated? The numbers you see from Cal.print look ballpark correct to me.

Version 1.0.2 is the newest firmware already.

I tried it on Mangrove and Plaits with the same results. I’m sure they’re calibrated as I use them with other sequencers with no problem.

So I had some time for further investigation.
Reporting the results.

Below numbers correspond to:
voltage input / voltage output
(as displayed in ^^ins m4l device)

in1
5v / 4.06v
6.15v / 5v
-5v / -4.04v
-6.18v / -5v
in2
5v / 4.05v
6.17v / 5v
-5v / -4.02v
-6.19v / -4.98v

Also tried sequencing ableton’s wavetable synth.
Tracking is way off as well and it skips majority of gates sent into input2.

Tried sending clock to modular and it’s really not stable. It sounds kinda cool but is not usable for syncing computer to modular. (I tried it with PNW)

Any ideas what should I do?
And is this the right place to discuss this or should I write an email?
As you might understand - I really want to fix this asap and get into making something with it.

i’m sorry to hear about the continued trouble!

i’d like to get a little bit more info, but regardless we can get a replacement sorted quickly – help@monome.org

As an experiment, I’m trying to add support for the TXo modules.

Could anyone confirm that this is the correct way to compile the binary for Crow please ? It’s the first time that I try something like this, I don’t want to “break” the module by uploading a corrupt/incomplete file ^^

Apparently there’s an error during the compilation process so I might have missed something in the instructions on how to include this:

lib/lualink.c:27:64: fatal error: lua/bootstrap.lua.h: No such file or directory
 #include "lua/bootstrap.lua.h" // MUST LOAD THIS MANUALLY FIRST
Summary
lib/lualink.c:27:64: fatal error: lua/bootstrap.lua.h: No such file or directory
 #include "lua/bootstrap.lua.h" // MUST LOAD THIS MANUALLY FIRST


                                                                ^
compilation terminated.
lib/ii.c:7:63: fatal error: ../build/ii_c_layer.h: No such file or directory
 #include "../build/ii_c_layer.h" // GENERATED BY BUILD PROCESS
                                                               ^
compilation terminated.
main.o
stm32f7xx_it.o
system_stm32f7xx.o
submodules/STM32_Cube_F7/Drivers/STM32F7xx_HAL_Driver/Src/stm32f7xx_hal.o
submodules/STM32_Cube_F7/Drivers/STM32F7xx_HAL_Driver/Src/stm32f7xx_hal_cortex.o
submodules/STM32_Cube_F7/Drivers/STM32F7xx_HAL_Driver/Src/stm32f7xx_hal_rcc.o
submodules/STM32_Cube_F7/Drivers/STM32F7xx_HAL_Driver/Src/stm32f7xx_hal_rcc_ex.o
submodules/STM32_Cube_F7/Drivers/STM32F7xx_HAL_Driver/Src/stm32f7xx_hal_flash.o
submodules/STM32_Cube_F7/Drivers/STM32F7xx_HAL_Driver/Src/stm32f7xx_hal_flash_ex.o
submodules/STM32_Cube_F7/Drivers/STM32F7xx_HAL_Driver/Src/stm32f7xx_hal_gpio.o
submodules/STM32_Cube_F7/Drivers/STM32F7xx_HAL_Driver/Src/stm32f7xx_hal_i2c.o
submodules/STM32_Cube_F7/Drivers/STM32F7xx_HAL_Driver/Src/stm32f7xx_hal_i2s.o
submodules/STM32_Cube_F7/Drivers/STM32F7xx_HAL_Driver/Src/stm32f7xx_hal_dma.o
submodules/STM32_Cube_F7/Drivers/STM32F7xx_HAL_Driver/Src/stm32f7xx_hal_dma2d.o
submodules/STM32_Cube_F7/Drivers/STM32F7xx_HAL_Driver/Src/stm32f7xx_hal_pcd.o
submodules/STM32_Cube_F7/Drivers/STM32F7xx_HAL_Driver/Src/stm32f7xx_hal_pcd_ex.o
submodules/STM32_Cube_F7/Drivers/STM32F7xx_HAL_Driver/Src/stm32f7xx_hal_pwr.o
submodules/STM32_Cube_F7/Drivers/STM32F7xx_HAL_Driver/Src/stm32f7xx_hal_pwr_ex.o
submodules/STM32_Cube_F7/Drivers/STM32F7xx_HAL_Driver/Src/stm32f7xx_hal_rng.o
submodules/STM32_Cube_F7/Drivers/STM32F7xx_HAL_Driver/Src/stm32f7xx_hal_spi.o
submodules/STM32_Cube_F7/Drivers/STM32F7xx_HAL_Driver/Src/stm32f7xx_hal_tim.o
submodules/STM32_Cube_F7/Drivers/STM32F7xx_HAL_Driver/Src/stm32f7xx_hal_tim_ex.o
submodules/STM32_Cube_F7/Drivers/STM32F7xx_HAL_Driver/Src/stm32f7xx_hal_uart.o
submodules/STM32_Cube_F7/Drivers/STM32F7xx_HAL_Driver/Src/stm32f7xx_hal_usart.o
submodules/STM32_Cube_F7/Drivers/STM32F7xx_HAL_Driver/Src/stm32f7xx_ll_usb.o
lib/bootloader.o
lib/caw.o
lib/detect.o
lib/events.o
lib/flash.o
build_dir build/
lua build/ii_c_layer.h
lib/ii.o
lib/io.o
l2h lua/First.lua -> lua/First.lua.h
l2h lua/asl.lua -> lua/asl.lua.h
l2h lua/asllib.lua -> lua/asllib.lua.h
l2h lua/bootstrap.lua -> lua/bootstrap.lua.h
l2h lua/calibrate.lua -> lua/calibrate.lua.h
l2h lua/crowlib.lua -> lua/crowlib.lua.h
l2h lua/ii.lua -> lua/ii.lua.h
l2h lua/input.lua -> lua/input.lua.h
l2h lua/metro.lua -> lua/metro.lua.h
l2h lua/midi.lua -> lua/midi.lua.h
l2h lua/output.lua -> lua/output.lua.h
lua build/iihelp.lua
l2h build/iihelp.lua -> build/iihelp.lua.h
lua build/ii_ansible.lua
l2h build/ii_ansible.lua -> build/ii_ansible.lua.h
lua build/ii_crow.lua
l2h build/ii_crow.lua -> build/ii_crow.lua.h
lua build/ii_er301.lua
l2h build/ii_er301.lua -> build/ii_er301.lua.h
lua build/ii_jf.lua
l2h build/ii_jf.lua -> build/ii_jf.lua.h
lua build/ii_kria.lua
l2h build/ii_kria.lua -> build/ii_kria.lua.h
lua build/ii_levels.lua
l2h build/ii_levels.lua -> build/ii_levels.lua.h
lua build/ii_meadowphysics.lua
l2h build/ii_meadowphysics.lua -> build/ii_meadowphysics.lua.h
lua build/ii_txi.lua
l2h build/ii_txi.lua -> build/ii_txi.lua.h
lua build/ii_txo.lua
l2h build/ii_txo.lua -> build/ii_txo.lua.h
lua build/ii_wslash.lua
l2h build/ii_wslash.lua -> build/ii_wslash.lua.h
lua build/ii_lualink.h
lib/lualink.o
lib/metro.o
lib/midi.o
lib/repl.o
lib/shapes.o
lib/slopes.o
ll/adda.o
ll/ads131.o
ll/cal_ll.o
ll/dac8565.o
ll/debug_pin.o
ll/debug_usart.o
ll/i2c.o
ll/midi_ll.o
ll/random.o
ll/system.o
ll/timers.o
usbd/usbd_cdc_interface.o
usbd/usbd_conf.o
usbd/usbd_desc.o
usbd/usbd_main.o
submodules/STM32_Cube_F7/Middlewares/ST/STM32_USB_Device_Library/Core/Src/usbd_core.o
submodules/STM32_Cube_F7/Middlewares/ST/STM32_USB_Device_Library/Core/Src/usbd_ctlreq.o
submodules/STM32_Cube_F7/Middlewares/ST/STM32_USB_Device_Library/Core/Src/usbd_ioreq.o
submodules/STM32_Cube_F7/Middlewares/ST/STM32_USB_Device_Library/Class/CDC/Src/usbd_cdc.o
submodules/wrLib/str_buffer.o
submodules/wrLib/wrConvert.o
submodules/wrLib/wrMath.o
submodules/wrLib/wrQueue.o
submodules/wrDsp/wrBlocks.o
submodules/lua/src/lapi.o
submodules/lua/src/lcode.o
submodules/lua/src/lctype.o
submodules/lua/src/ldebug.o
submodules/lua/src/ldo.o
submodules/lua/src/ldump.o
submodules/lua/src/lfunc.o
submodules/lua/src/lgc.o
submodules/lua/src/llex.o
submodules/lua/src/lmem.o
submodules/lua/src/lobject.o
submodules/lua/src/lopcodes.o
submodules/lua/src/lparser.o
submodules/lua/src/lstate.o
submodules/lua/src/lstring.o
submodules/lua/src/ltable.o
submodules/lua/src/ltm.o
submodules/lua/src/lundump.o
submodules/lua/src/lvm.o
submodules/lua/src/lzio.o
submodules/lua/src/lauxlib.o
submodules/lua/src/lbaselib.o
submodules/lua/src/lbitlib.o
submodules/lua/src/lcorolib.o
submodules/lua/src/ldblib.o
submodules/lua/src/liolib.o
submodules/lua/src/lmathlib.o
submodules/lua/src/loslib.o
submodules/lua/src/lstrlib.o
submodules/lua/src/ltablib.o
submodules/lua/src/lutf8lib.o
submodules/lua/src/loadlib.o
submodules/lua/src/linit.o
Startup.o
linked:       crow.elf
disassembly:  crow.elf.lst
binary:       crow.bin
symbol table: crow.bin.dmp
Release: 0
  Size: 314124       FileType: Regular File
        ^ must be less than 384kB (384,000)
# 512kb -64kb(bootloader) -128kb(scripts)

Here’s what I did:

Install the dev environment :

brew tap PX4/homebrew-px4
brew update
brew install gcc-arm-none-eabi-49

(Lua and dfu-util were already installed on my Mac)
git clone --recursive https://github.com/monome/crow.git
cd crow
git submodule update --init

Add the following file txo.lua to the folder lua/ii
It is almost a copy of the er301.lua file, only the basic commands of the Txo.

txo.lua
do return
{ module_name  = 'TXO'
, manufacturer = 'BPC Music'
, i2c_address  = {0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67}
, lua_name     = 'txo'
, commands     =
  { { name = 'tr'
    , cmd  = 0x0
    , docs = 'Set TR *port* to *state* (0/1)'
    , args = { { 'port', u8 }
             , { 'state', s16 }
             }
    }
  , { name = 'tr_tog'
    , cmd  = 0x1
    , docs = 'Toggle TR *port*'
    , args = { 'port', u8 }
    }
  , { name = 'tr_pulse'
    , cmd  = 0x5
    , docs = 'Pulse TR *port* using TO.TR.TIME/S/M as an interval'
    , args = { 'port', u8 }
    }
  , { name = 'tr_time'
    , cmd  = 0x2
    , docs = 'Time for TR.PULSE *port* in *ms*'
    , args = { { 'port', u8 }
             , { 'ms', s16 }
             }
    }
  , { name = 'tr_pol'
    , cmd  = 0x6
    , docs = 'Polarity for TO.TR.PULSE *port* set to *rising* (0/1)'
    , args = { { 'port', u8 }
             , { 'rising', s16 }
             }
    }
  , { name = 'cv'
    , cmd  = 0x10
    , docs = 'Set *port* CV to *volts* (bipolar), following SLEW time'
    , args = { { 'port', u8 }
             , { 'volts', s16V }
             }
    }
  , { name = 'cv_slew'
    , cmd  = 0x12
    , docs = 'CV *port* slew time in *ms*'
    , args = { { 'port', u8 }
             , { 'ms', s16 }
             }
    }
  , { name = 'cv_set'
    , cmd  = 0x11
    , docs = 'Set CV *port* to *volts* (bipolar), ignoring SLEW time'
    , args = { { 'port', u8 }
             , { 'volts', s16V }
             }
    }
  , { name = 'cv_off'
    , cmd  = 0x15
    , docs = 'CV *port* offset, *volts* added at final stage'
    , args = { { 'port', u8 }
             , { 'volts', s16V }
             }
    }
  }
, pickle = -- zero-index the port & send to multiple devices for port >= 100
--void pickle( uint8_t* address, uint8_t* data, uint8_t* byte_count );
[[

uint8_t port = data[1] - 1;  // zero-index the port
data[1]   = port % 100;      // wrap command for subsequent devices
*address += port / 100;      // increment address for subsequent devices

]]
}
end
make
make clean

Thanks,

1 Like

This looks fine to me. The errors you see in the Make process are there in the master branch too due to some weird dependency tracking issue that I can’t track down. The build looks correct (all the object files are good) and filesize looks good.

Good news is it’s not really possible to brick the module with a bad firmware (unless you’re using the FLASH library, which you’re not). If you upload a bad firmware it will just hang after bootloading & you’ll need to bridge the i2c header to re-flash with the bootloader.

1 Like

Thanks @Galapagoose

Following your message, I went ahead and uploaded the experimental firmware and… it’s working just fine. I can now control the three Txo from Max or Druid through Crow. Super happy about that, it was easier than I thought :slight_smile:

Now I need to add the rest of the commands (LFO etc) and I hope I can figure out easily the type of message and cmd address for each one of them. Not sure about that yet but I’ll try with the help of this list.

FWIW, calling each TXo with its own address works fine. There’s also a 301 on the bus, also working fine.

Also, sending ii.txo.tr_pulse(5) will not work but sending ii.txo[1].tr_pulse(5) works, it’s quite handy. I’ve modified the “pickle” a little bit.

Edit #1 :
About the “types” of arguments, is it a problem to set all times related args to S16 and volts related args to S16V ? Can it cause a memory issue ? I can’t find how the Txo handles the different types.

Edit #2 :
I’ve now added all the TXo commands, although I didn’t have time to test them all, it seems to work. Only tested the OSC, ENV and the basic set of commands. Not sure the txo.env.osc_n works but maybe I just don’t know how to use it ^^ That’s a huge set of commands. Some commands don’t need two args, (txo.env_trig for example), I need to clean that too.

4 Likes

I believe this is right and it shouldn’t be a memory issue. The type handling is all in determining how a Lua value from Crow gets converted to an int to send over the i2c bus. Everything voltage related on TXo is expected to be a signed 16 bit int to match how Teletype represents voltage values.

Awesome job converting all the TXo commands, I started on this some time ago but ran out of steam.

1 Like

Thank you :blush:

Ah great, that’s a good news. I was a bit worried about that.
I’m currently trying to test all the commands, there are some of them I’ve never used with the Teletype. I tested a simple 4 voices synth with Max earlier today without any issue (oscillator and env, something simple)and of course all the basic set of commands. Three TXo+ and a 301 on the same i2c bus. Tested successfully with the new support for multiples of the same ii device addressable (eg. ii.txo[1] and ii.txo[2] )

One thing I couldn’t figure out in the script reference, is there a way to know if something is or is not connected?

My use case would be outputting cv over the Ansible CV channels, unless it isn’t connected, then falling back on the crow’s own outputs.

1 Like

At present there’s nothing built-in. You could do something like the following:

ansible_connected = false
init = function()
  ii.ansible.get('cv',1) -- just a random request, to see if it's connected
end

ii.ansible.event()
  ansible_connected = true -- mark as connected if ansible responds
end
2 Likes

That works great for my purposes - thank you!

I think having that built in could end up being useful for Norns scripts - they could test for connected modules and route outputs or inputs accordingly, without having to make users set a bunch of params about what’s going where.

But given that workaround I think it would be a pretty marginal issue.

FYI We had a short discussion about something similar/related to this (it’s not 100% the same, the initial request was more about the technical details of how to communicate with multiple device, but there is some overlap) here https://github.com/monome/crow/issues/53

Crow and W/ users, how are you integrating these two little powerhouses? I’m trying to come back to W/ with beginner’s mind to remember the things that I wished it would do when I first started using it that I could not achieve with only THIS/THAT.

Are you using crow as 2 additional inputs? Is crow able to send out envelopes/triggers at loop points? What mode is W/ in?

(If this lives better somewhere else, let me know)

4 Likes