Proof of concept for a new instrument.

Video does not say that much, read the text, and look at the pictures!

 

I have a proposition for a new type of controller for playing and recording chords. It’s based on isomorphic input and the usual keyboard. And no it’s not an accordion.

Why do I think me and the world needs this? Because recording and editing chords on the computer is tedious and boring. Even when applying all the tricks I know in Ableton Live I still lack a way to fast and easy add a walking chord or a strum like one. And if I program one and then transpose it I would have to redo it for every single clone if I want to change a little something. Not to mention the human feel that you get while playing something rather then programming it.

This became apparent to me while learning to play the bass, I could reuse the same pattern if I knew the base note. This kicked ars, but basses are hard to strum on, and even harder to make into MIDI data. So I found the isomorphic input method appealing, but the cheapest keyboard was still expensive. So I was thinking about making one cheaper, and that would not be done unless there where significally less buttons.

So I came up with this idea:
Using a one octave keyboard to choose the root-note, and then a isomorphic keyboard that is velocity sensitive. That way I would only need 12 velocity sensitive buttons and 12 keys for the note-selection.

This is a map over the isomorphic layout I choose:

So a major chord would be:

and minor:

To test this idea I wrote a little program based using a KORG padKONTROL as velocity editing and a rockband keytar as MIDI-input device. This was way faster and cheaper then starting to solder something together, and I get to get a feeling for it before trying to fix hardware problems like, how should it look, should it be strapped or more like a piano, is 12 buttons correct?

 

void handleMIDIMessageFromMidiDevice( int status, int data1,int  data2)
{

/*	printf("handleMIDIMessageFromMidiDevice: ");

	printf("status %d | ",status);
	printf("data1 %d | ",data1);
	printf("data2 %d \n",data2);
	*/
    if(status == 144) //NoteOn
    {
        if((data1-12) < 25) //If it's from the padKontrol, let's play
        {
            printf("MyData %d \n",data1-12);
            sendShortToHost(status,(data1-12)+RootNoot,data2);
        }
        else{ //it's from the keyboard, save rootnote
            RootNoot = data1;
        }
    }
    else if(status == 128)//NoteOff
    {
         if((data1-12) < 25)
         {
             sendShortToHost(status,(data1-12)+RootNoot,data2);
         }
    }

}

One thing I found out is that the minor chord could be optimized if I move it to here:

this was an easy fix and as used in the video.

 

Next steps could possibly be to make dedicated hardware, should it be drum-type buttons to mash on or should it be something else, should I strap it on like a keytar or should it be stationary like a piano. is it more comfortable to play the keyboard with left hand or should that be right hand. So many questions.

More avantgardism

I made a small John Cage-ish piano tune, and then I programmed a video for it, nothing huge. Just wanted to learn a little about opengl in processing.

Anyway, here it is:

 

and here’s the code:

 

import ddf.minim.*;

Minim minim;
AudioPlayer player;


PImage img;
int diff = 40;
int daff = 40;

void setup() {
  minim = new Minim(this);

  size(640, 360, P3D);
  frameRate(20);
  img = loadImage("lines.png");
  noStroke();
  player = minim.loadFile("mister_mister.mp3");

  noLoop();
}

float cnt =0;
float cntInc =0.05;
float cntIncIncer =0.05;

void draw() {
  background(0);

  int  trianglesize = width-(diff*2);
  int meanpos = height-diff;

  daff = (int)random(4);
  beginShape();

  cnt+=cntInc;
  if (cnt>(9*2))
  {
    cnt=0;
    cntInc+=cntIncIncer;
  }
  if (cntInc > 8)
  {
    img = loadImage("lines2.png");
    cntIncIncer-=cntIncIncer*2.0;
  }

  texture(img);
  vertex(width/2, diff, 0, (300/2)+cnt, 0+cnt);
  vertex(0+diff, height-diff, 0, 0+cnt, 300+cnt);
  for (int i = 0; i < player.bufferSize() - 1; i+=1)
  {
    float x1 = map( i, 0, player.bufferSize(), 0, trianglesize );
    float x2 = map( i+1, 0, player.bufferSize(), 0, trianglesize );
    vertex( x1+diff, meanpos + player.left.get(i)*  ((cntInc*3)+10), 0, 00+cnt, 300+cnt);
    vertex( x2+diff, meanpos + player.left.get(i+1)*((cntInc*3)+10), 0, 00+cnt, 300+cnt);
  }
  vertex(width-diff, height-diff, 0, 00+cnt, 300+cnt);

  endShape();
  if (player.isPlaying())
  {
    saveFrame("frames/########.tif");
  }
  else
  {
    println("DONE");
    noLoop();
  }
}

void keyPressed() {
  println("start!");
  player.play();
  loop();
}