Visual tempo feedback

Post Reply New Topic
RELATED
PRODUCTS

Post

I was inspired by this video
https://www.youtube.com/watch?v=CT6ABqYno6Y&start=307
where the author demos differents ways to get a visual tempo feedback.
It is usefull in live performances, you don't need to listen to the click. :phones:

how would you code that, how to subscribe to the clock ?

Post

Interested in this too. I tried this a while back using an old Launchpad (or any MIDI controller with LED feedback) and have clips running with the correct note/cc messages in them so they'll trigger the lights on the controller (@4:55 in the video).

Now in a script (I guess) you'd just have to send these notes/CCs out in the correct time. OSC might be an option as well making your own visual metronome.

Post

I don't think it needs a script for that. Simply create a clip which would send the note or controller information to the external controller to switch on the blink, and include it into your default project. One HW instrument track for visualization - could be abused for extra independent audio input as well...; - )

Post

Tj Shredder wrote: Sat May 02, 2020 9:30 am I don't think it needs a script for that. Simply create a clip which would send the note or controller information to the external controller to switch on the blink, and include it into your default project. One HW instrument track for visualization - could be abused for extra independent audio input as well...; - )
The only "problems" with using clips that way is launching scenes or using the stop all clips function as you'd have to restart the metronome midi clip. Of course you can copy the clip to all scenes. Using other time signatures might be another issue, you'd need multiple metronome clips depending on the signature. A script always hooked to the transport might be a more desired solution, taking all that into account.

Edit: Now thinking about it, it might be possible to do that straight in the grid with all the transport and scaler devices and then translating it into the correct note/CC messages. Of course this won't give RGB functionality, unless the controller is responding to velocity or other parameters via RGB out of the box.

Edit 2: For anyone still interested, I got something simple working in the Grid with Polaritys "Grid Note Out". Inside the Grid is a pitch and steps module triggering a single note each step, multinote triggers the 2x2 blocks on the Launchpad https://streamable.com/01p7lp
Last edited by misteraudio on Sun May 03, 2020 3:23 pm, edited 1 time in total.

Post

here is a piece of code to do heartbeat or snake style :D :D

javascript

Code: Select all

var numberOfBeat = 4; // init to a default value, is going to be updated by the real signature.
function init() {
   	transport = host.createTransport();

	transport.timeSignature().numerator().addValueObserver(function(numerator){
		numberOfBeat = numerator;
	});

	transport.getPosition().addValueObserver(function(value)
	{
		var tick = (Math.round((value*100/10))%10);
		var blink = false;
		if(tick >=0 && tick <= 3){ 
			blink = true;
		}
		println(blink); // use it to blink one pad, heartbeat style
		var padNumberToLight = Math.round(value)%numberOfBeat;
		println(padNumberToLight); // use it to blink pad number, snake style
		
	});

}

java

Code: Select all

  private int numberOfBeat = 4;
  public void init()
   {
		final ControllerHost host = getHost();      
		final Transport transport = host.createTransport();
	
		transport.timeSignature().numerator().addValueObserver (numerator -> {
			this.numberOfBeat = numerator;
		});

		transport.getPosition().addValueObserver (value -> {
			final long tick = (Math.round((value*100/10))%10);
			boolean blink = false;
			if(tick >=0 && tick <= 3){ 
				blink = true;
			}
			host.println(String.valueOf(blink)); // use it to blink one pad, heartbeat style
			final long padNumberToLight = Math.round(value)%numberOfBeat;
			host.println(String.valueOf(padNumberToLight)); // use it to blink pad number, snake style
		});

   }

Post

Managed to put a way to do it in DrivenByMoss !
https://github.com/git-moss/DrivenByMos ... -623191329

Post

wow this is exactly what I want to do! Will try the script.

Post

hehe, sadly this is not so perfectly beating because of the way bitwig use the scripting engine :
it is not realtime but when bitwig 'has' the time to send those message.

Then i learned the best is to use the MIDI CLOCK, this is quality realtime message !
In this German youtube video
https://www.youtube.com/watch?v=Ld_-f2XcBfA
the guy explain how to create a arduino usb midi controler and listen to those midi clock events ! then you put a little light, and you got a perfectly tempo synced light !
My next project for next year quarantine ... Or build one and put it on sale on https://www.tindie.com/

The best would be to firmware hack your existing controller and add a midi clock listener inside. (impossible) :D

Post

A little follow up,
i had an arduino uno in the house,
so with the youtube tutorial above, i made my midi visual feedback controler !! i post here some pointers if someone is intersted in 2020:

you have to include the midi usb lib. https://github.com/FortySevenEffects/ar ... di_library
(but in arduino it is called MIDI)

Code: Select all

#include <MIDI.h>


using namespace midi;

MIDI_CREATE_DEFAULT_INSTANCE(); // Create an instance of MIDI

byte zaehler = 0;
float bpm = 0;
float zeitAlt = 0;

int isPlaying = 0;


void setup() {

  pinMode(13, OUTPUT);
  Serial.begin(115200); 
  MIDI.setHandleClock(beatClock);
  MIDI.setHandleStart(beatClock);
  MIDI.setHandleContinue(beatClock);
  MIDI.setHandleStop(beatClock);
  MIDI.begin(MIDI_CHANNEL_OMNI);
}

void loop() {
  if (MIDI.read()) {
    Serial.println(MIDI.getType(), HEX);
  }
}

void beatClock() {
  midi::MidiType realtimebyte = MIDI.getType();
  if(realtimebyte == midi::Start) { 
    zaehler = 0; 
    isPlaying = 1; 
    zeitAlt = millis(); 
  }
  if(realtimebyte == Continue) { 
    zeitAlt = millis(); 
  }
  
  if(realtimebyte == Stop) { 
    isPlaying = 0;
    digitalWrite(13, LOW); 
  }
  
  if(realtimebyte == Clock) {
    zaehler++;
    if (zaehler == 97) {zaehler = 1;}
    if(zaehler == 1 || zaehler == 24 || zaehler == 48 || zaehler == 72) { 
      if(isPlaying){
       
        digitalWrite(13, HIGH);
      }
    } 
    if(zaehler == 5 || zaehler == 25 || zaehler == 49 || zaehler == 73) { 
      digitalWrite(13, LOW);
    }
  }

  if (zaehler == 24 || zaehler == 48 || zaehler == 72 || zaehler == 96 ) {
    bpm = round((60000 / (millis() - zeitAlt)));
    Serial.print(bpm);
    Serial.println(" BPM");
    zeitAlt = millis();
  }
}
Arduino UNO is not a usb device can't be setup like a usb midi device like the Teensy board.
Luckily with this tutorial
https://www.youtube.com/watch?v=18OKo9s ... =emb_title

i have discovered
https://moco-lufa-web-client.herokuapp.com/#/

whit which you can create your own usb midi arduino Uno image, with the name you can choose , and it will show in bitwig as a midi device ! (so cool)
watch the youtube tutorial, now your arduino uno has two mode, depending of a jumper.

Then don't forget to go in Bitwig settings, synchonisations, midi sync, and send midi clock data to your new midi device that should be listed !

Post Reply

Return to “Controller Scripting”