Friday, October 28, 2011

Fibonacci Series Plus Modulo Groove



I was bored last night.

Thursday, October 27, 2011

Simple Fibonacci Series Generator Max Patch


Saturday, October 22, 2011

Two Dimensional Light Controller: Ambient Tree Wave Remix

Friday, October 21, 2011

Ignacio Dacio's Single Line Arduino Music

One Loop, One Function. Simple Arduino Music. from ignacio dacio on Vimeo.

Artwork Inspired by Destroy Yourself Already!

Destroy Yourself Already! - Back

Destroy Yourself Already! - Front

Eric Carl has posted artwork that has been inspired by my Lazerscale2010 micro EP called "Destroy Yourself Already!".

Thursday, October 20, 2011

Nice Wave Shoes




by Lauren

Quick and Dirty Mono Direct Line Out for SEGA Genesis II

My recent work with Alex Yabsley demanded the musical control of eight SEGA consoles simultaneously. Given that we only had a few actual SEGA AV cables between us, we had to come up with some fast ways of getting direct audio out of Genesis and Mega Drive II units. In two cases, I spliced RF cables but we ran out of those as well! So I decided to find the summed mono audio points on the board, and solder an RCA connection directly to the relevant point. This thin cable is then fed out through the back of the SEGA via spacing between the AV port on the motherboard and the physical edging of the casing. Thus, a quick and dirty summed mono direct line out.



SEGA Mega Drive / Genesis DAC Channel Strip (Max for Live Device)


This is a channel strip for controlling the parameters of a SEGA Mega Drive / Genesis digital to analogue converter channel. This gives you control over:
  • DAC on / off
  • Custom waveform on / off
  • Oversample
  • Sampling rate
  • Custom waveform byte 1 of 14 as part of a handy multislider object
  • Custom waveform byte 2 of 14 as part of a handy multislider object
  • Custom waveform byte 3 of 14 as part of a handy multislider object
  • Custom waveform byte 4 of 14 as part of a handy multislider object
  • Custom waveform byte 5 of 14 as part of a handy multislider object
  • Custom waveform byte 6 of 14 as part of a handy multislider object
  • Custom waveform byte 7 of 14 as part of a handy multislider object
  • Custom waveform byte 8 of 14 as part of a handy multislider object
  • Custom waveform byte 9 of 14 as part of a handy multislider object
  • Custom waveform byte 10 of 14 as part of a handy multislider object
  • Custom waveform byte 11 of 14 as part of a handy multislider object
  • Custom waveform byte 12 of 14 as part of a handy multislider object
  • Custom waveform byte 13 of 14 as part of a handy multislider object
  • Custom waveform byte 14 of 14 as part of a handy multislider object
In future iterations of this plug in, I would like to add presets of the waveform data.

All of the above parameters can of course be edited via MIDI CC control envelopes / controllers - but having a handy little plugin like this might make it easier to explore different sounds for some people.

This will released at the same time as the SEGA Mega Drive / Genesis MIDI Interface.

SEGA Mega Drive / Genesis FM Channel Strip (Max for Live Device)


This is a channel strip for controlling the parameters of a SEGA Mega Drive / Genesis FM channel. This gives you control over:
  • Preset
  • Algorithm
  • Frequency LFO amount
  • Amplitude LFO amount
  • Feedback amount
  • Panning (hard left, hard right, centre or channel mute)
  • FM operator 1 total level
  • FM operator 1 detune amount
  • FM operator 1 attack
  • FM operator 1 decay 1
  • FM operator 1 decay 2
  • FM operator 1 amplitude 2
  • FM operator 1 release 2
  • FM operator 1 AM LFO on
  • FM operator 1 multiple
  • FM operator 1 rate scaling amount
  • FM operator 2 total level
  • FM operator 2 detune amount
  • FM operator 2 attack
  • FM operator 2 decay 1
  • FM operator 2 decay 2
  • FM operator 2 amplitude 2
  • FM operator 2 release 2
  • FM operator 2 AM LFO on
  • FM operator 2 multiple
  • FM operator 2 rate scaling amount
  • FM operator 3 total level
  • FM operator 3 detune amount
  • FM operator 3 attack
  • FM operator 3 decay 1
  • FM operator 3 decay 2
  • FM operator 3 amplitude 2
  • FM operator 3 release 2
  • FM operator 3 AM LFO on
  • FM operator 3 multiple
  • FM operator 3 rate scaling amount
  • FM operator 4 total level
  • FM operator 4 detune amount
  • FM operator 4 attack
  • FM operator 4 decay 1
  • FM operator 4 decay 2
  • FM operator 4 amplitude 2
  • FM operator 4 release 2
  • FM operator 4 AM LFO on
  • FM operator 4 multiple
  • FM operator 4 rate scaling amount
All of the above parameters can of course be edited via MIDI CC control envelopes / controllers - but having a handy little plugin like this might make it easier to explore different sounds for some people.

This will released at the same time as the SEGA Mega Drive / Genesis MIDI Interface.

Wednesday, October 19, 2011

How To Connect A Keypad To Arduino: Simple Example

Overview
To connect a 12 button keypad to Arduino only requires 7 digital pins, thereby saving resources if you don't need to press more than one button at one time. The keypad has 12 pins - each button makes a connection between a given row pin and a given column pin. For example, if I press button 1 (which is in row 1, column 1), then the pin for row 1 is connected to the pin for column 1. If I let go of button 1, then this connection is broken. In a similar way, if I press the 0 button (which is in row 4, column 2), then the pin for row 4 is connected to the pin for column 2.

By connecting each row and each column pin to the Arduino, we can read which button we are pressing. Imagine that each row pin is an output and each column pin is an input. If we can control which of our row pins are HIGH and which are LOW, then we can read our column pins and see which ones are HIGH and which ones are LOW, thereby indicating the row and the column that is currently pressed (i.e. the key number).

See the code for more detail. Please note that this code is computationally inefficient, and is written the way it is for the sake of clarity.

Hardware Setup




Connect the pin for row 1 to digital pin 2 on the Arduino.
Connect the pin for row 2 to digital pin 3 on the Arduino.
Connect the pin for row 3 to digital pin 4 on the Arduino.
Connect the pin for row 4 to digital pin 5 on the Arduino.
Connect the pin for column 1 to digital pin 6 on the Arduino.
Connect the pin for column 2 to digital pin 7 on the Arduino.
Connect the pin for column 3 to digital pin 8 on the Arduino.



Software
Note that the following code should be copied and pasted into a new Arduino sketch. For ease of reading, please format the code once it has been pasted (Tools > Autoformat).

// How To Connect A Keypad To Arduino: Simple Example
// by Sebastian Tomczak 19 October 2011

// setup value for serial printing
byte value;

// setup pin names and numbers for cols and rows
byte row1 = 2;
byte row2 = 3;
byte row3 = 4;
byte row4 = 5;
byte col1 = 6;
byte col2 = 7;
byte col3 = 8;


void setup() {
Serial.begin(57600);

// setup row outputs
pinMode(row1, OUTPUT);
pinMode(row2, OUTPUT);
pinMode(row3, OUTPUT);
pinMode(row4, OUTPUT);

// setup col inputs
pinMode(col1, INPUT);
pinMode(col2, INPUT);
pinMode(col3, INPUT);

// setup internal resistors
digitalWrite(col1, HIGH);
digitalWrite(col2, HIGH);
digitalWrite(col3, HIGH);

// initialise rows
digitalWrite(row1, HIGH);
digitalWrite(row2, HIGH);
digitalWrite(row3, HIGH);
digitalWrite(row4, HIGH);
}

void loop() {
// read row 1
digitalWrite(row1, LOW); // activate row 1
value = digitalRead(col1); // read row 1 & col 1 = button 1
if(value == 0) { // if the button is pressed...
Serial.println("Button 1 Pressed");
}
digitalWrite(row1, HIGH); // deactivate row 1

// repeat above for buttons 2 - 12 (i.e. rows 1 - 4 and cols 1 - 3)

digitalWrite(row1, LOW);
value = digitalRead(col2);
if(value == 0) {
Serial.println("Button 2 Pressed");
}
digitalWrite(row1, HIGH);


digitalWrite(row1, LOW);
value = digitalRead(col3);
if(value == 0) {
Serial.println("Button 3 Pressed");
}
digitalWrite(row1, HIGH);


digitalWrite(row2, LOW);
value = digitalRead(col1);
if(value == 0) {
Serial.println("Button 4 Pressed");
}
digitalWrite(row2, HIGH);


digitalWrite(row2, LOW);
value = digitalRead(col2);
if(value == 0) {
Serial.println("Button 5 Pressed");
}
digitalWrite(row2, HIGH);


digitalWrite(row2, LOW);
value = digitalRead(col3);
if(value == 0) {
Serial.println("Button 6 Pressed");
}
digitalWrite(row2, HIGH);


digitalWrite(row3, LOW);
value = digitalRead(col1);
if(value == 0) {
Serial.println("Button 7 Pressed");
}
digitalWrite(row3, HIGH);


digitalWrite(row3, LOW);
value = digitalRead(col2);
if(value == 0) {
Serial.println("Button 8 Pressed");
}
digitalWrite(row3, HIGH);


digitalWrite(row3, LOW);
value = digitalRead(col3);
if(value == 0) {
Serial.println("Button 9 Pressed");
}
digitalWrite(row3, HIGH);


digitalWrite(row4, LOW);
value = digitalRead(col1);
if(value == 0) {
Serial.println("Button * Pressed");
}
digitalWrite(row4, HIGH);


digitalWrite(row4, LOW);
value = digitalRead(col2);
if(value == 0) {
Serial.println("Button 0 Pressed");
}
digitalWrite(row4, HIGH);


digitalWrite(row4, LOW);
value = digitalRead(col3);
if(value == 0) {
Serial.println("Button # Pressed");
}
digitalWrite(row4, HIGH);

}

Sunday, October 16, 2011

Two Dimensional Light Controller with USB MIDI





Four-by-four light sensors plus four potentiometers.

Thursday, October 13, 2011

little-scale and Dot.AY: Music for Eight SEGA Mega Drives Video



80 channels of chiptune hardware.

Tuesday, October 11, 2011

SEGA Mega Drive / Genesis MIDI Interface Update

I have updated my SEGA Mega Drive / Genesis with the following features:
  • Samples are now velocity-sensitive for volume control. The velocity range of 0 - 127 sets the sample playback volume to one of eight levels.

  • Samples have been updated to include the break (BRK) sample and additional claps, slaps and a dub siren

  • USB support has been added, and the interface appears as a standard MIDI device (compatible with Windows, Linux and OS X)

The only thing left to do before an initial batch is created is to update the included presets.

Blank SEGA Master System Reproduction Cartridge



32KB SEGA Master System EPROM cartridge.

Friday, October 07, 2011

Autocc (Max for Live Device)


Sometimes I find it useful to be able to send MIDI CC data from a Live track, or to be able to route a MIDI CC from a physical MIDI controller to a different MIDI CC on a track. This plugin allows both. Eight pairs of control - within each pair, one control sets the MIDI CC number and the other sets the MIDI CC value.

Download here: http://milkcrate.com.au/_other/downloads/M4L/little-scale%20autocc.amxd

MIDI Delay (Max for Live Device)


A track loses its inherent delay functionality when synchronising Ableton Live to an external clock source or transport. Sometimes, it's handy to still be able to delay MIDI data, though. Hence: MIDI delay. Very simple and to the point.

Download here: http://milkcrate.com.au/_other/downloads/M4L/little-scale%20MIDI%20Delay.amxd

Thursday, October 06, 2011

I'm In Chip Bass Monthly!

Check it out here: http://generationbass.com/2011/09/02/chip-bass-monthly-8/

More fun Chip Bass stuff can be found here: http://generationbass.com/author/alex/

Monday, October 03, 2011

SEGA Mega Drive / Genesis Bass Sound Design

https://8bc.org/music/little-scale/SEGA+Genesis+++Mega+Drive+Bass+Sound+Design/

Sunday, October 02, 2011

Tweetable, One Loop, One Function, Simple Arduino Music

Inspired by the work in this thread on Pouet and also this Youtube video containing code by viznut, tejeez and visy, I decided to take the plunge and try out some simple maths music as well! Of course, my platform of choice for this is the Arduino (actually - I used the Teensy).

The hardware setup is very simple - simply an R2R DAC connected to output bits 0, 1, 2 and 3 of PORTB. For the Arduino board, this means digital pins 8, 9, 10 and 11. For the Teensy board, this means digital pins 0, 1, 2 and 3. In the schematic below, R1, R2, R3, R4 and R8 are double the value of R5, R6 and R7. For example - R1 might be 100kΩ and R5 might be 50kΩ.


I set myself some limitations with the coding side of things. The code should:
1) Be 140 characters or less with the whitespace removed i.e. Twitterable.
2) Contain a single 'for' loop within the main loop of the program
3) Contain a single function within the 'for' loop that sets the current value of PORTB
4) Additional libraries such as maths.h are to be avoided
5) The output should only be four bits

Let's hear some examples!


Example #1
void setup() {DDRB=B00001111;}
void loop() {for(long i=0;i<1000000;i++) {PORTB=i>>8;}}

Example #2
void setup() {DDRB=B00001111;}
void loop() {for(long i=0;i<1000000;i++) {PORTB=i/2>>2|i/3>>2;}}

Example #3
void setup() {DDRB=B00001111;}
void loop() {for(long i=0;i<1000000;i++) {PORTB=i/(i>>12&3)&i/(3+(i>>11&31))|(i/3)|((i/2)|(i>>9&15));}}

Example #4
void setup() {DDRB=B00001111;}
void loop() {for(long i=0;i<100000;i++) {PORTB=i/(1+(i>>12))>>5|i>>i/(6+(6-i>>12))|i/3>>4;}}

Example #5
void setup() {DDRB=B00001111;}
void loop() {for(long i=0;i<100000;i++) {PORTB=i/3>>(i%40+5)|i/(24+i&3)>>(i%(15-((i>>15)%8)*6)+5);}}

Example #6
void setup() {DDRB=B00001111;}
void loop() {for(long i=0;i<100000;i++) {PORTB=i/5>>(1+((i>>12)&3))|i/2>>2&(i/6)>>7|i&31*i*(i>>8);}}

Example #7

void setup() {DDRB=B00001111;}
void loop() {for(long i=0;i<100000;i++) {PORTB=i/13>>(1+((i>>12)&3))|i/2>>2&(i/6)>>7|i&31*i*(i>>8);}}


In general, I guess we can call this "index modulation", in the sense that we have a counter (i) that keeps track of a loop. The sound output is calculated on a sample by sample basis using a function that manipulates i in various ways (left and right shifting, multiplication, divide, modulo etc). The combined output for each sample is then output to the R2R DAC where the value is converted to a voltage, which can be sent to a piezo, an amp or an audio input.

I find these ideas very exciting - it's a very minimalist approach to creating sound and music on a basic level, yet the outcomes are at times complex, containing rhythm, pitch and structure.