Friends of norns: gear, accessories, etc

lately have found “not wanting to sit at a desk” to be significant barrier to nornsing. looked into various solutions, but nothing super satisfying until i discovered the genre of product “breakfast in bed trays.” like laptop stands, but typically have a lip all the way around the surface area. managed to find one that has that and also tilts pretty far forward


pretty happy with it. bought the shortest usb cables i could find but they are actually still too long—i need like 12-16 inch ones i think. may to bite the bullet and get some custom made when i commit to a layout.

but onto my question, which is maybe more suited to the ios thread, but… touchOSC sucks, right? is it just me? i’ve had it since i bought a smart phone in like 2012, and have used it maybe 5 times, so i am by no means an expert

my main gripes:
—the editor is bad. i made an interface for loom at some point (pictured), and the process really sucked. seemingly almost nothing can be batched, so to, say, resize the faders, you have to do each one individually.
—you can’t label anything? this can’t be right, can it? (i just looked it up and this is indeed wrong, but i compulsively need lists to have three items. don’t know why i didn’t see the labels)
—can’t adjust the distribution of possible values within a fader. especially for filters, i feel like i almost always want it to be logarithmic.

should i look into lemur or something? or am i just using it wrong?

10 Likes

I gave up on Touch OSC some time ago. I’m sure others achieve greatness with it, but not I.

I am in love with your breakfast tray idea though. I have one in my home and never thought of it being my mini studio! OP1, OP-Z, norns and grid are basically the best Tray companions ever. Play it in bed on a lazy rainy day if I ever get one of those again. Haha

2 Likes

Lemur I’m afraid won’t be a much better experience. Very powerful concept, awful UI and mediocre documentation. Worst of all, their website has broken links to the desktop editor app you need to properly create UI patches. AFAIK they still sell the ios/android app on the app store but they haven’t looked at their own forum/website in years. (Years of calls for help with no reply on forum). Such a shame the concept was so promising.

2 Likes

potential market for a developer, perhaps, :thinking:

5 Likes

I had one of these trays many moons ago, love your idea. Definitely getting a new one now.

1 Like

Posted the info of the teensy midi controller here:

really appreciate the heads up. it’s one of those apps that you just assume is good because it was really expensive at some point.

looking for alternatives lead me to filtering ‘ios osc’ search results on youtube to “within the last year” which lead me to this one:
http://miem.laras.be

first impressions are: it suffers from the same UI & documentation issues, BUT with the key distinction that it’s free and open source!

the focus in their videos seems to be on interpolation between overlapping regions rather than the traditional “make a bunch of sliders/faders/buttons” approach. but the editor has this, which is like, chefs kiss .gif after trying to use touchOSC:

will report back if i get it to work

2 Likes

I’m not sure how updated it is now, but I used to love Mrmr when I had an iPad (https://apps.apple.com/us/app/id294296343?mt=8) .
It doesn’t quite have the visual finesse of TouchOSC but it had one feature that I thought was pretty essential which is that you could build the interface and initialize layouts directly from SuperCollider (or PD or whatever).

It was really nice to have my OSC interface code written into each SuperCollider patch I performed with and, of course, that allowed you to generate the UI programmatically with loops as well.

It also seems to have some sort of visual builder that will produce the source code for the UI as well.

The project was open source as well but now I can’t seem to find the source code: http://code.google.com/p/mrmr/

UPDATE:
Found the source code and project page: http://ecumedesjours.com/Mrmr/

1 Like

@ppqq @scazan the perfect x-platform mobile OSC client seems like a great fit for dart+flutter

4 Likes

i have yet to dive into flutter! have you explored it yet? i’m super curious about how configurable/stylable those GUIs are (which I know, maybe goes against their idea a bit of having a consistent material ui)

i’ve played w/ osc and flutter a little bit actually and even stubbed out a simple osc dart implementation:

it’s not complete but sufficient for the simple cases. at a recent hackathon, i played w/ a kind of poor man’s TouchOSC in flutter. definitely doable.

material is only an angle. custom UIs are very much in flutter’s wheelhouse. if you want some examples feel free to send me a message.

(full disclosure: i work on dart/flutter… best you know that up front, lest you think i’m just a shill!)

so i built my own little usb midi footswitch. it’s based on a teensy lc and i’m using a bit of code i found and have pasted below. i’m wondering if it’s possible to program the teensy as such that the three switches on the footswitch will correspond with the three buttons on my fates. my end goal is to use the footswitch to start/stop recording/overdubbing in cranes. i’m not sure if there’s a way to tell the norns software to interpret each footswitch press as a key press, or if my best bet is to expose the rec on/off params in cranes and then use midi learn to assign those to the switches. any help would be hugely appreciated!

p.s. if there’s a better place for this question, please feel free to move this post to a more appropriate thread.

/* Simple Teensy DIY USB-MIDI controller.
  Created by Liam Lacey, based on the Teensy USB-MIDI Buttons example code.

   Contains 8 push buttons for sending MIDI messages,
   and a toggle switch for setting whether the buttons
   send note messages or CC messages.

   The toggle switch is connected to input pin 0,
   and the push buttons are connected to input pins 1 - 8.

   You must select MIDI from the "Tools > USB Type" menu for this code to compile.

   To change the name of the USB-MIDI device, edit the STR_PRODUCT define
   in the /Applications/Arduino.app/Contents/Java/hardware/teensy/avr/cores/usb_midi/usb_private.h
   file. You may need to clear your computers cache of MIDI devices for the name change to be applied.

   See https://www.pjrc.com/teensy/td_midi.html for the Teensy MIDI library documentation.

*/

#include <Bounce.h>

//The number of push buttons
const int NUM_OF_BUTTONS = 8;

// the MIDI channel number to send messages
const int MIDI_CHAN = 1;

// Create Bounce objects for each button and switch. The Bounce object
// automatically deals with contact chatter or "bounce", and
// it makes detecting changes very simple.
// 5 = 5 ms debounce time which is appropriate for good quality mechanical push buttons.
// If a button is too "sensitive" to rapid touch, you can increase this time.

//button debounce time
const int DEBOUNCE_TIME = 5;

Bounce buttons[NUM_OF_BUTTONS + 1] =
{
  Bounce (0, DEBOUNCE_TIME),
  Bounce (1, DEBOUNCE_TIME),
  Bounce (2, DEBOUNCE_TIME),
  Bounce (3, DEBOUNCE_TIME),
  Bounce (4, DEBOUNCE_TIME),
  Bounce (5, DEBOUNCE_TIME),
  Bounce (6, DEBOUNCE_TIME),
  Bounce (7, DEBOUNCE_TIME),
  Bounce (8, DEBOUNCE_TIME)
};

const int MIDI_MODE_NOTES = 0;
const int MIDI_MODE_CCS = 1;

//Variable that stores the current MIDI mode of the device (what type of messages the push buttons send).
int midiMode = MIDI_MODE_NOTES;

//Arrays the store the exact note and CC messages each push button will send.
const int MIDI_NOTE_NUMS[NUM_OF_BUTTONS] = {40, 41, 42, 43, 36, 37, 38, 39};
const int MIDI_NOTE_VELS[NUM_OF_BUTTONS] = {110, 110, 110, 110, 110, 110, 110, 110};
const int MIDI_CC_NUMS[NUM_OF_BUTTONS] = {24, 25, 26, 27, 20, 21, 22, 23};
const int MIDI_CC_VALS[NUM_OF_BUTTONS] = {127, 127, 127, 127, 127, 127, 127, 127};

//==============================================================================
//==============================================================================
//==============================================================================
//The setup function. Called once when the Teensy is turned on or restarted

void setup()
{
  // Configure the pins for input mode with pullup resistors.
  // The buttons/switch connect from each pin to ground.  When
  // the button is pressed/on, the pin reads LOW because the button
  // shorts it to ground.  When released/off, the pin reads HIGH
  // because the pullup resistor connects to +5 volts inside
  // the chip.  LOW for "on", and HIGH for "off" may seem
  // backwards, but using the on-chip pullup resistors is very
  // convenient.  The scheme is called "active low", and it's
  // very commonly used in electronics... so much that the chip
  // has built-in pullup resistors!

  for (int i = 0; i < NUM_OF_BUTTONS + 1; i++)
  {
    pinMode (i, INPUT_PULLUP);
  }

}

//==============================================================================
//==============================================================================
//==============================================================================
//The loop function. Called over-and-over once the setup function has been called.

void loop()
{
  //==============================================================================
  // Update all the buttons/switch. There should not be any long
  // delays in loop(), so this runs repetitively at a rate
  // faster than the buttons could be pressed and released.
  for (int i = 0; i < NUM_OF_BUTTONS + 1; i++)
  {
    buttons[i].update();
  }

  //==============================================================================
  // Check the status of each push button

  for (int i = 0; i < NUM_OF_BUTTONS; i++)
  {

    //========================================
    // Check each button for "falling" edge.
    // Falling = high (not pressed - voltage from pullup resistor) to low (pressed - button connects pin to ground)

    if (buttons[i + 1].fallingEdge())
    {
      //If in note mode send a MIDI note-on message.
      //Else send a CC message.
      if (midiMode == MIDI_MODE_NOTES)
        usbMIDI.sendNoteOn (MIDI_NOTE_NUMS[i], MIDI_NOTE_VELS[i], MIDI_CHAN);
      else
        usbMIDI.sendControlChange (MIDI_CC_NUMS[i], MIDI_CC_VALS[i], MIDI_CHAN);
    }

    //========================================
    // Check each button for "rising" edge
    // Rising = low (pressed - button connects pin to ground) to high (not pressed - voltage from pullup resistor)

    else if (buttons[i + 1].risingEdge())
    {
      //If in note mode send a MIDI note-off message.
      //Else send a CC message with a value of 0.
      if (midiMode == MIDI_MODE_NOTES)
        usbMIDI.sendNoteOff (MIDI_NOTE_NUMS[i], 0, MIDI_CHAN);
      else
        usbMIDI.sendControlChange (MIDI_CC_NUMS[i], 0, MIDI_CHAN);
    }

  } //for (int i = 0; i < NUM_OF_BUTTONS; i++)

  //==============================================================================
  // Check the status of the toggle switch, and set the MIDI mode based on this.
  if (buttons[0].fallingEdge())
  {
    midiMode = MIDI_MODE_NOTES;
  }
  else if (buttons[0].risingEdge())
  {
    midiMode = MIDI_MODE_CCS;
  }

  //==============================================================================
  // MIDI Controllers should discard incoming MIDI messages.
  // http://forum.pjrc.com/threads/24179-Teensy-3-Ableton-Analog-CC-causes-midi-crash
  while (usbMIDI.read())
  {
    // ignoring incoming messages, so don't do anything here.
  }
  
}
7 Likes

So, I’m no expect in midi abd teensy programming, but, I don’t believe you can replicate the K1-3 button presses with midi. But, if this already sends out midi information with each button press, you should be able to midi learn the buttons to the functions you wish in the params of cranes. Plus, if you can’t find that as a midi function, it shouldn’t be TOO difficult to either alter the code or ask the creator for some help.

To possibly getting it to do what you want to without replicating the keys or altering the code, check to see if record and play are available on the params page of cranes.

Then, if those are available, plug in the pedal, choose it in the midi listing, open cranes, go to the params page and hold K1 to pull up a menu that will allow you to turn on midi learn. Scroll to the param you want the button to control, select that param and press your pedal button. If all goes well, you’ll see the CC that the button sent out next to it!

Sorry if this was an over explanation and you knew all of this, but it seems like the pedal is sending out midi channel 1 and is ready to go.

1 Like

hey! you are spot on; the teensy is on channel 1 and is sending midi information. unfortunately play and record are not available on the params page. so i was wondering if i should edit the cranes code to expose those params (and how to do that, tho i should probably take that q to the cranes thread,) or if there was a way to make norns interpret the presses of each footswitch as a press of one of the three norns keys. hopefully that makes sense! :grin:

Yeah, I’d post in that thread about making those params midi accessible. Honestly, the creator of the script @dan_derks is insanely helpful and responsive!

1 Like

this is a script-level-only sorta thing, but @okyeron did some great work on this already :slight_smile:

modified script: https://gist.github.com/okyeron/fe902b191ba4e39188da43373f39edd1

i’ll be able to get back to cranes after I finish up some residual cheat codes work, apologies for the delay!

6 Likes

dan, i wanna give ya a hug or buy ya a drink or both! thanks so much for your help! @kasselvania is right: you’re always insanely helpful and responsive :grin: :bouquet: :beers:

2 Likes

sounds like @okyeron saved the day with that mod! happy to help connect dots / folks :slight_smile:

3 Likes

i just wanted to circle back and let ya guys know that after looking over the code a bunch, and figuring out what @okyeron did to add the midi record trigger, i modded the code some more to include a midi trigger to clear the buffer. this is the first coding i’ve done on my own so that felt pretty cool! thank you both for facilitating that! :grin:

i was trying to figure out how to add a trigger to reverse the selected buffer, but i couldn’t get it for some reason.

3 Likes