//Arduino Tv framebuffer+ MIDI IN
#include <MIDI.h>
// Video out voltage levels
#define _SYNC 0x00
#define _BLACK 0x01
#define _GRAY 0x02
#define _WHITE 0x03
// dimensions of the screen
#define WIDTH 38
#define HEIGHT 14
//number of lines to display
#define DISPLAY_LINES 240
// update speed for the main loop of the game
#define UPDATE_INTERVAL 1
// maximum velocity of the ball
#define MAX_VEL 10
// time to wait while paused
#define DONE_WAITING 30
// input pins for the player pots
#define PLAYER_LEFT_PIN 2
// currently the same pin
#define PLAYER_RIGHT_PIN 3
//video pins
#define DATA_PIN 9
#define SYNC_PIN 8
int ledPin = 13;
int midi = 0;
// the video frameBuffer
byte frameBuffer[WIDTH][HEIGHT];
// loop indices
byte index, index2;
// pal video line loop
byte line;
// current drawing line in framebuffer
byte newLine;
// loop counter to for the main loop delay
int waitingCount = 0;
// if we should be waiting for something to happen
boolean waiting=true;
// value of the counter controlling the freq of updates
byte updateCounter=0;
// positions and velocity of the ball
byte ballXPos = 14;
byte ballYPos = 7;
int readMidi(){
int midi_type = 0;
if (MIDI.read()) {
switch(MIDI.getType()) { // Get the type of the message we caught
case PC:
midi_type = MIDI.getData1();
return midi;
//BlinkLed(MIDI.getData1()); // Blink the LED a number of times
// correponding to the program number
// (0 to 127, it can last a while..)
break;
// See the online reference for other types
default:
break;
}
}
}
void drawVisualisation(){
int midi = 0;
midi = readMidi();
if(midi = 0){
//digitalWrite(ledPin, HIGH);
setPixel(10, 2);
}
else if(midi < 10 & midi > 0 )
{
//digitalWrite(ledPin, HIGH);
//clearScreen();
setPixel(10, 3);
}
else if(midi < 20 & midi > 10)
{
//digitalWrite(ledPin, HIGH);
//clearScreen();
setPixel(10, 4);
}
else if(midi < 30 & midi > 20)
{
//digitalWrite(ledPin, HIGH);
//clearScreen();
setPixel(10, 5);
}
else if(midi < 40 & midi < 30)
{
digitalWrite(ledPin, HIGH);
grayPixel(5,10);
setPixel(10, 20);
grayPixel(7,10);
setPixel(10, 20);
grayPixel(9,10);
setPixel(11, 33);
grayPixel(5,10);
setPixel(13, 20);
grayPixel(5,10);
setPixel(15, 20);
grayPixel(5,10);
setPixel(14, 26);
grayPixel(5,10);
setPixel(19, 17);
grayPixel(5,10);
setPixel(10, 24);
grayPixel(5,10);
setPixel(11, 20);
grayPixel(5,10);
setPixel(15, 23);
grayPixel(7,10);
setPixel(23, 20);
grayPixel(9,10);
setPixel(05, 13);
grayPixel(5,10);
setPixel(16, 20);
grayPixel(5,10);
setPixel(15, 20);
grayPixel(5,10);
setPixel(14, 26);
grayPixel(5,10);
setPixel(19, 17);
grayPixel(5,10);
setPixel(10, 24);
grayPixel(5,10);
setPixel(10, 20);
//clearScreen();
}
else if(midi > 100)
{
//digitalWrite(ledPin, HIGH);
//clearScreen();
setPixel(10, 20);
grayPixel(30,30);
}
}
// draw a pixel to the buffer
void setPixel(byte x,byte y)
{
frameBuffer[x][y]= _WHITE;
}
void grayPixel(byte x, byte y)
{
frameBuffer[x][y]= _GRAY;
}
// draw a black pixel to the buffer
void clearPixel(byte x,byte y)
{
frameBuffer[x][y]= _BLACK;
}
// draw a paddle
void drawPaddle(byte x,byte y,byte col)
{
frameBuffer[x][y]= col;
frameBuffer[x][y+1]= col;
}
void drawBall(byte col)
{
frameBuffer[ballXPos][ballYPos]=col;
}
//draw the title message
void drawArduinoPong()
{
//arduino
/* int counter;
for(counter=1; counter<32;counter++){
setPixel(counter, 10);
//clearPixel(counter-1, 10);
}
for(counter=1; counter<32;counter++){
setPixel(2, counter);
//clearPixel(counter-1, 10);
}
for(counter=1; counter<32;counter++){
grayPixel(4, counter);
//clearPixel(counter-1, 10);
}
for(counter=1; counter<32;counter++){
setPixel(8, counter);
//clearPixel(counter-1, 10);
}
for(counter=1; counter<32;counter++){
grayPixel(12, counter);
//clearPixel(counter-1, 10);
} */
}
// clear the screen
void clearScreen()
{
for (index = 0; index < WIDTH; index++)
for (index2=0;index2<=HEIGHT;++index2)
{
frameBuffer[index][index2] = _BLACK;
}
}
// the setup routine
void setup()
{
MIDI.begin(); // Launch MIDI with default options
cli();
pinMode (SYNC_PIN, OUTPUT);
pinMode (DATA_PIN, OUTPUT);
digitalWrite (SYNC_PIN, HIGH);
digitalWrite (DATA_PIN, HIGH);
loop();
clearScreen();
//drawArduinoPong();
}
void loop()
{
// iterate over the lines on the tv
drawVisualisation();
for ( line =0;line< DISPLAY_LINES;++line)
{
// HSync
// front porch (1.5 us)
PORTB = _BLACK;
delayMicroseconds(1.5);
//sync (4.7 us)
PORTB = _SYNC;
delayMicroseconds(4.7);
// breezeway (.6us) + burst (2.5us) + colour back borch (1.6 us)
PORTB = _BLACK;
delayMicroseconds(0.6+2.5+1.6);
//calculate which line to draw to
newLine = line >>4;
delayMicroseconds(1);
//display the array for this line
// a loop would have been smaller, but it messes the timing up
PORTB = frameBuffer[0][newLine];
delayMicroseconds(1);
PORTB = frameBuffer[1][newLine];
delayMicroseconds(1);
PORTB = frameBuffer[2][newLine];
delayMicroseconds(1);
PORTB = frameBuffer[3][newLine];
delayMicroseconds(1);
PORTB = frameBuffer[4][newLine];
delayMicroseconds(1);
PORTB = frameBuffer[5][newLine];
delayMicroseconds(1);
PORTB = frameBuffer[6][newLine];
delayMicroseconds(1);
PORTB = frameBuffer[7][newLine];
delayMicroseconds(1);
PORTB = frameBuffer[8][newLine];
delayMicroseconds(1);
PORTB = frameBuffer[9][newLine];
delayMicroseconds(1);
PORTB = frameBuffer[10][newLine];
delayMicroseconds(1);
PORTB = frameBuffer[11][newLine];
delayMicroseconds(1);
PORTB = frameBuffer[12][newLine];
delayMicroseconds(1);
PORTB = frameBuffer[13][newLine];
delayMicroseconds(1);
PORTB = frameBuffer[14][newLine];
delayMicroseconds(1);
PORTB = frameBuffer[15][newLine];
delayMicroseconds(1);
PORTB = frameBuffer[16][newLine];
delayMicroseconds(1);
PORTB = frameBuffer[17][newLine];
delayMicroseconds(1);
PORTB = frameBuffer[18][newLine];
delayMicroseconds(1);
PORTB = frameBuffer[19][newLine];
delayMicroseconds(1);
PORTB = frameBuffer[20][newLine];
delayMicroseconds(1);
PORTB = frameBuffer[21][newLine];
delayMicroseconds(1);
PORTB = frameBuffer[22][newLine];
delayMicroseconds(1);
PORTB = frameBuffer[23][newLine];
delayMicroseconds(1);
PORTB = frameBuffer[24][newLine];
delayMicroseconds(1);
PORTB = frameBuffer[25][newLine];
delayMicroseconds(1);
PORTB = frameBuffer[26][newLine];
delayMicroseconds(1);
PORTB = frameBuffer[27][newLine];
delayMicroseconds(1);
PORTB = frameBuffer[28][newLine];
delayMicroseconds(1);
PORTB = frameBuffer[29][newLine];
delayMicroseconds(1);
PORTB = frameBuffer[30][newLine];
delayMicroseconds(1);
PORTB = frameBuffer[31][newLine];
delayMicroseconds(1);
PORTB = frameBuffer[32][newLine];
delayMicroseconds(1);
PORTB = frameBuffer[33][newLine];
delayMicroseconds(1);
PORTB = frameBuffer[34][newLine];
delayMicroseconds(1);
PORTB = frameBuffer[35][newLine];
delayMicroseconds(1);
// klugdge to correct timings
PORTB = frameBuffer[36][newLine];
PORTB=PORTB;
PORTB=PORTB;
PORTB=PORTB;
delayMicroseconds(3);
}
//vsync
PORTB = _SYNC;
// if delaying for some reason
if(waiting)
{
// increment the waiting counter
waitingCount++;
//digitalWrite(ledPin, HIGH);
// delay(200);
// digitalWrite(ledPin, HIGH);
readMidi();
drawVisualisation();
// wait for the remainder of the sync period
delayMicroseconds(610);
}
// not waiting
else
{
// increment the update delay counter
updateCounter++;
if( updateCounter >= UPDATE_INTERVAL)
{
// remainder of sync period
delayMicroseconds(10);
updateCounter=0;
}
else
// remainder of sync period
delayMicroseconds(250);
}
drawVisualisation();
}
drawVisualisation(); here at the end is the part I start to draw the Pixels on the PAL tv screen