Tuesday, 5 April 2016

What do you need to program a microcontroller

 Microcontrollers are getting more common in synths.
So its important to get started understanding these if you are ever to master DIY, repairs, etc.
Soldering is just the first step. once you have it on your board and are happy you don't have any shorts
you will need to program the thing.

How do I do this? There are 4 things you need.
 
1. Microcontroller
2. programmer
3. IDE (integrated development environment)
   - compiler
   - text editor
4. basic circuit building skills 


--------------
 1. Microcontroller
There are lots of companies that make microcontrollers.
Each of these companies have their own programmers, compilers,  etc.
This makes it tricky when deciding which programmer to buy, as there isn't one programmer that
works for everything.

Lets look at 2 popular companies:
Microchip & Atmel

* Microchip produces microcontrollers with three very different architectures:
   8, 16, & 32 bit
Here is their website

8-bit (8-bit data bus)]
   -PIC10 and PIC12:
  - PIC16 series 
  - PIC18
   
16-bit (16-bit data bus) 
    - PIC24F
    - PIC24H
    - ds PIC 30
    - Ds PIC 33

32-bit (32-bit data bus) 
    - PIC 32
 

Atmel were acquired my Microchip so they share the same website
You can get started here

Here is a brief list of Atmel Microcontrollers

    ATmega168PA AU Atmel Arduino IC. SKU : RM1155. ...
    ATmega328 Microcontroller for Arduino. SKU : RM2940. ...
    ATmega8 Microcontroller. ...
    ATmega16 Microcontrollers. ...
    AT89S2051 Microcontroller. ...
    ATmega16 Microcontroller with Robosapiens Boot Loader Software. ...
    ATmega168 Microcontroller. ...
    ATmega32 Microcontroller.
 
------------------------------------------

2. programmer
The programmer is the device that is used to send the code from your
computer to the chip.
 
 Each company has many programmers.
Your choice will depend on how advanced you want to get.

Here is an example of a PIC/Microchip programmer

Below is a PIC K150 ICSP Programmer Kit

 

Here is a programmer for ATmel

...------------------------------------------

3. IDE
The integrated development environment is the software application.
It consists of at least a source code editor, build automation tools and a debugger.  

Each company will have its own IDE. There are also lots of 3rd party companies
 
MPLAB is a common IDE used for PIC microcontrollers
 
Atmel Studio is a common IDE for Atmel microcontrollers 
Atmel also uses Visual Studio from Microsoft.

-------------------------

4. Basic circuit building skills

When you buy a programmer, it will come with a manual, that shows how to connect it to your microcontroller.
You need to be able to read a basic circuit diagram and probably use a breadboard .

You will need to open up the data sheet for the microcontroller in question, and make the appropriate connections.
 

Links

+ Microcontrollers... Programmers  


OLED Bitmap graphics - part 1

  Displaying a image on the OLED

The OLED is 128 x 64 pixels
Thus any image needs to be the same size
 
In the code below is a Buchla image I made from a bitmap.
 

 
The section of the code made up of hexadecimal numbers is called the bitmap array.
This is the image.
To place a new image, just replace the hexadecimal section of the code.
 
// &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&

#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>

#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64

Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, -1);

static const unsigned char PROGMEM bitmapPic[] = {

0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x03, 0xCC, 0x00, 0x00, 0x00, 0x01, 0xF0,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xF0, 0x00, 0x3C, 0x18, 0x00, 0x00, 0x03, 0xFF, 0x80,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1E, 0x60, 0x03, 0xC0, 0x30, 0x00, 0x03, 0xF8, 0xFC, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xE0, 0xC0, 0x3C, 0x00, 0xC0, 0x03, 0xFC, 0x01, 0xC0, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x03, 0x03, 0xC0, 0x01, 0x83, 0xF8, 0x00, 0x1C, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0xF0, 0x06, 0x7C, 0x00, 0x07, 0xF8, 0x00, 0x01, 0xE0, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x0F, 0x00, 0x0F, 0x80, 0x00, 0x08, 0x00, 0x00, 0x1E, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0xF0, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE0, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x07, 0x00, 0x0C, 0x00, 0x00, 0x02, 0x00, 0x00, 0x0F, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x70, 0x07, 0xF8, 0x00, 0x00, 0x3E, 0x00, 0x00, 0xF0, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x07, 0x83, 0xF8, 0x30, 0x00, 0x07, 0xCC, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x3F, 0xFC, 0x00, 0x60, 0x00, 0x78, 0x18, 0x00, 0x78, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0xFE, 0x00, 0x00, 0xC0, 0x07, 0x80, 0x20, 0x07, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0xC0, 0x00, 0x03, 0x00, 0x78, 0x00, 0xC0, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x40, 0x00, 0x06, 0x0F, 0x80, 0x01, 0x83, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x60, 0x00, 0x0C, 0xF0, 0x00, 0x03, 0x3C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x20, 0x00, 0x1F, 0x00, 0x00, 0x07, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x30, 0x00, 0x30, 0x00, 0x00, 0x0E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x03, 0x00, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x01, 0x07, 0x9C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x01, 0xBC, 0x36, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x03, 0xC0, 0x62, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x3C, 0xC0, 0xC3, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x01, 0xE0, 0x41, 0x81, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x0E, 0x00, 0x0F, 0x81, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x18, 0x00, 0xF0, 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x30, 0x0F, 0x20, 0xC0, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x60, 0x78, 0x10, 0x40, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0xC7, 0x80, 0x18, 0x60, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x01, 0xF9, 0x00, 0x08, 0x20, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x03, 0x80, 0x80, 0x0C, 0x30, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x03, 0x00, 0xC0, 0x04, 0x10, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x01, 0x00, 0x40, 0x36, 0x18, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x01, 0x80, 0x61, 0xFE, 0x08, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x80, 0x23, 0x03, 0x0C, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0xC0, 0x3E, 0x03, 0x04, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x40, 0x18, 0x03, 0x06, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x60, 0x18, 0x03, 0x06, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x20, 0x30, 0x02, 0x79, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x30, 0x30, 0x07, 0x81, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x10, 0x30, 0x0C, 0x01, 0x90, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x18, 0x30, 0x0C, 0x00, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x08, 0x30, 0x38, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x0C, 0x18, 0xE0, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x04, 0x1F, 0x80, 0x07, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x06, 0x30, 0x00, 0x78, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x02, 0x20, 0x07, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x03, 0x60, 0x78, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x01, 0xC7, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x01, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
};
 
void setup() {
  Serial.begin(115200);
 
  if(!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
    Serial.println(F("SSD1306 allocation failed"));
    for(;;);
  }
  delay(2000); // Pause for 2 seconds
 
  // Clear the buffer.
  display.clearDisplay();
 
  // Draw bitmap on the screen
  display.drawBitmap(0, 0, bitmapPic, 128, 64, 1);
  display.display();
}
 
void loop() {
// &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
 

 
 
 
 
 
//The raw code is here:

#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>

#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64

Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, -1);

static const unsigned char PROGMEM bitmapPic[] = {

// place bitmap code here

};
 
void setup() {
  Serial.begin(115200);
 
  if(!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
    Serial.println(F("SSD1306 allocation failed"));
    for(;;);
  }
  delay(2000); // Pause for 2 seconds
 
  // Clear the buffer.
  display.clearDisplay();
 
  // Draw bitmap on the screen
  display.drawBitmap(0, 0, bitmapPic, 128, 64, 1);
  display.display();
}
 
void loop() {

-------------------------------------------------------------------------------------------

 ---------------------------------
-------------------------------------

Saturday, 2 April 2016

ARP 2500 - Modcan'd

Playing around with some Eurorack sequencers.
The Modcan Touch is shaping up nicely as a partner for the ARP2500

Taking some samples:


It syncs perfectly with the ARP 1027 sequencer.

 The 1004-T oscillator.

The 1047 filter.

The 1046 Envelope Generator.

The patch.

i2c LCD & Arduino - part 2

 A bit more about making graphics, how to position them
and scroll through different screens / menus

Part 1 is here
 

 
 
 The code:
// **************************************


#include <Wire.h>

#include <LiquidCrystal_I2C.h>

LiquidCrystal_I2C lcd(0x3F, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);
// RS, E, D4, D5, D6, D7
byte heart[] = {
  0x00,
  0x0A,
  0x1F,
  0x1F,
  0x0E,
  0x04,
  0x00,
  0x00
};

byte Speaker[] = {
0b00001,
0b00011,
0b01111,
0b01111,
0b01111,
0b00011,
0b00001,
0b00000
};

byte Sound[] = {
0b00001,
0b00011,
0b00101,
0b01001,
0b01001,
0b01011,
0b11011,
0b11000
};

byte Bell[] = {
0b00100,
0b01110,
0b01110,
0b01110,
0b11111,
0b00000,
0b00100,
0b00000
};

  byte Alien[8] = {
0b11111,
0b10101,
0b11111,
0b11111,
0b01110,
0b01010,
0b11011,
0b00000
};

byte Skull[] = {
0b00000,
0b01110,
0b10101,
0b11011,
0b01110,
0b01110,
0b00000,
0b00000
};

byte Lock[] = {
0b01110,
0b10001,
0b10001,
0b11111,
0b11011,
0b11011,
0b11111,
0b00000
};
 
void setup() {
   lcd.begin(16, 2);
  lcd.backlight();             // turn backlight on
  lcd.createChar(1, heart);    // define a symbol for memory position 1
  lcd.createChar(2, Speaker);    // define a symbol for memory position 2
  lcd.createChar(3, Sound);    // define a symbol for memory position 3
  lcd.createChar(4, Bell);    // define a symbol for memory position 4
  lcd.createChar(5, Alien);    // define a symbol for memory position 5
  lcd.createChar(6, Skull);    // define a symbol for memory position 6
  lcd.createChar(7, Lock);    // define a symbol for memory position 7

 
}
 
void loop() {
  lcd.clear();                 // clear the screen

  screen1();                   // execute screen1 function
  delay(1000);                 // pause for 1 second

  lcd.clear();                 // clear the screen

  screen2();                   // execute screen2 function
  delay(1000);                 // pause for 1 second

   lcd.clear();                 // clear the screen

  screen3();                   // execute screen3 function
  delay(1000);                 // pause for 1 second

   lcd.clear();                 // clear the screen

  screen4();                   // execute screen4 function
  delay(1000);                 // pause for 1 second
}

void screen1() {
  lcd.setCursor(0, 0);         // set the cursor to position 1, line 1
  lcd.print("I ");           // write on the screen
  lcd.write(1);                // write symbol from memory position 1
  lcd.print(" Synths");  // write on the screen

  lcd.setCursor(1, 1);         // set the cursor to position 2, line 2
  lcd.print("I ");           // write on the screen
  lcd.write(2);                // write symbol from memory position 2
  lcd.print(" Synths ");  // write on the screen
   lcd.write(5);                // write symbol from memory position 5
}

void screen2() {               
  lcd.setCursor(2, 1);         // set the cursor to position 3, line 2
  lcd.print("Buchla ");             // write on the screen
  lcd.write(3);                // write symbol from memory position 3
  lcd.print(" Rules");       // write on the screen
}

void screen3() {
  lcd.setCursor(0, 0);         // set the cursor to position 1, line 1
  lcd.print("Happy Easter");           // write on the screen
  lcd.write(1);                // write symbol from memory position 1
  lcd.write(2);                // write symbol from memory position 2
  lcd.write(3);                // write symbol from memory position 3
 
  lcd.setCursor(1, 1);         // set the cursor to position 2, line 2
  lcd.print("I ");           // write on the screen
  lcd.write(4);                // write symbol from memory position 2
  lcd.print(" Synths");  // write on the screen
}

void screen4() {
  lcd.setCursor(0, 0);         // set the cursor to position 1, line 1
  lcd.write(1);                // write symbol from memory position 1

 lcd.setCursor(2, 0);         // set the cursor to position 3, line 1
  lcd.write(2);                // write symbol from memory position 2

  lcd.setCursor(4, 0);         // set the cursor to position 5, line 1
  lcd.write(3);                // write symbol from memory position 3

   lcd.setCursor(6, 0);         // set the cursor to position 7, line 1
  lcd.write(4);                // write symbol from memory position 4

   lcd.setCursor(8, 0);         // set the cursor to position 9, line 1
  lcd.write(5);                // write symbol from memory position 5

   lcd.setCursor(10, 0);         // set the cursor to position 12, line 1
  lcd.write(6);                // write symbol from memory position 6

   lcd.setCursor(12, 0);         // set the cursor to position 14, line 1
  lcd.write(7);                // write symbol from memory position 7
 
  lcd.setCursor(1, 1);         // set the cursor to position 2, line 2
 
  lcd.write(4);                // write symbol from memory position 2
 
}
// ***************************************************




 ---------------------------------
------------------------------------- 
 

Saturday, 26 March 2016

Friday, 25 March 2016

Tone() function - Arduino

Arduino - The Tone function
The Tone function is an easy way to make some noise with your Arduino.
 
A basic circuit. Example 1
The resistor is 100 Ohms.
Just need a Piezo speaker, breadboard & an Uno
 
The black leads connect to GND
 
 we need just 2 arguments
  1 pin
  2 frequency in Hz - determines pitch
 
tone(Pin, Hz)
tone(piezoPin, 100)
The frequency can be any number between 0 and 65,535.
Note that most noises that can be heard with the human ears range between 2k & 5k
 

Here is the code:
//-------------------------------------
// demo of tone function

// variables
int piezoPin = 8;

void setup(){
}

void loop(){
 
  /*
  we need just 2 arguments
  1 pin
  2 frequency in Hz - determines pitch
  */
  // create a tone ... tone();
  tone(piezoPin, 100); // play around with this last number
 
}
//---------------------------------------------------
 
 Example 2
Creating a beat.
Add a duration period - the last parameter (and a delay to your code).
 
The tone function is
tone(Pin, Hz,duration in milliseconds)
tone(piezoPin, 100, 500)
 
Here is an example of your new code
 
//----------------
// demo of tone function 2

// variables
int piezoPin = 8;

void setup(){
}

void loop(){
 
  /*
  we need just 3 arguments
  1 pin
  2 frequency in Hz - determines pitch
  3 duration
  */
  // create a tone ... tone();
  tone(piezoPin, 3000, 500);
 
  delay(1500);
 
}
//-----------------------------
 
Note, to add 1 second between each sound
you need to use a duration of 500ms, and a delay of 1500ms
 
 
Limitations
Don't use analogWrite on pins 3 & 11 if you are using the tone function

 
 Links
+ https://www.programmingelectronics.com/an-easy-way-to-make-noise-with-arduino-using-tone/
+ https://www.youtube.com/watch?v=1_LMAgO14z0
 
 ---------------------------------
------------------------------------- 

Buchla 360

Sadly this is only a panel, but its a glimpse into the world of the Buchla 300.

What is it? It's part of  the Buchla 300 Series Electric Music Box.

The 300 is described as a Digital/Analogue Hybrid Music system.
I have never seen one in the flesh and wonder what they were like.

The 360 is very rare. Formally, its called the "360 Programmable Octal Signal Source".
It's a 8 Voice Digital Synthesizer with 3 oscillators and a dedicated Buchla Lowpass/Gate per voice.

The 300 series were basically computer controlled 200 systems and it marked a return to analog modular synthesis when the rest of the world was going digital. ....mid 1970s's.
It used a patch programming language (Patch IV) to control the mostly 200 modules.
What made this special was that though many of the the modules were analog, the 300 offered digital control. This same concept of patch control is found in the modern Buchla 200e.

The 300 Series Controller/Processor was programmed using the 221 Kinesthetic Input Port touch keyboard.

The 221 had two modes :Programming or Performance.
The 221 had 50 real touch sensitive keys which could function in the +0 or in the +50 performance modes.
Special keys for programming in the Patch IV language included CMND, EXEC, DEL,  KEY,  SEQ, VOLT,  FUNC,  SEQ, SUBR, JUMP,  SKIP, INTP, SET, etc. etc.
Patch IV was written in 8080 assembly language, and used 28 K bytes of
RAM & 8 K of ROM. The 300 processor was the Intel 8080. This was a 8-bit micro processor originally released in 1974.

The 8080 was the basis of the MITS Altair 8800, for which Bill Gates and Paul Allen wrote BASIC.
The rest is history.

Please let me know if there are any errors or omissions.