As the afternoon faded into evening, it started to rain. The sky started to gray and a gentle drizzle started to ease in. The decision had to be made, not to stay in. A quick check of the forcast predicted things would only get worse, but the promise of a special evening was enough of a draw. The bike was plucked for the detirtus in the shed and the rain proof was donned.
In the venue (The Bassment, Chelmsford) the sofas were pulled forward, to the edge of the stage. Tables were prepared with flyers, candles and beer mats, and the few took their seats. As the rest of us stood, an open mic night saw Jordan Gray, and Emma Penrose & George Wood fill the walls with a mixture of haunting and sensual music and vocal.
The stage was draped in fairy lights, and Jack Browning took place, side of stage to perform a live portrait painting of oil on canvas while the night took place. A truly unique experience.
Alex Fox' haunting melodies and melancholic piano playing silenced the audience for the better part of the evening, seeing his EP Launch a positive success. Alex, Fighting through a hairy throat continually arrested my though process with a truly heart stopping performance. The sale of download codes of the EP and even a printed out musical score of his first single welcomed in a loving audience. Here is a musician truly worth his salt.
As the evening ended the rain began to fall harder. The bike was found and the empty streets of Chelmsford fell quite for my cycle home.
It always seems to rain, when Alex Fox plays, and there is nothing bad about it at all.
http://alexfox.bandcamp.com/
What's the point in giving us hands
Thursday, 8 June 2017
Thursday, 27 March 2014
Prototype board
So, the prototype board finally arrived for the power supply. Unfortunately the spacers that I had intended to use wouldn't fit in the tiny holes already provided, and the holes in the board were so close to the edge that I couldn't just drill them out, so I have drilled out some little holes a bit further in, not ideal, but still was just about right. I'm only loosing a small amount of space, and in the project space isn't at a premium, so it doesn't matter. I have found the pillar drill at work so no more excuses for shoddy hole drilling! Although they seem not to have any kind of vice or clamp over there, so i will have to source something like that if I want to drill a huge hole in the wooden front panel for the pots. Here is a picture of the idea anyway, probably small components and op -amps and stuff on the bottom, and big power hungry components on the top, so that I can get maximum air flow around them, for cooling.
Friday, 21 March 2014
Bench Power supply circuit is nearly ready!
Hi,
So we are getting very close. The first circuit creates our un-regulated supply, a 38V supply for the op-amps for the circuitry and a 12V supply for the internal cooling fan.
Then we have an op amp based power supply design with current limiter based on the LT3080 voltage regulator. In this circuit we are using 2 in series to double the amount of current we can deliver. These regulators rely on a minimum load of 1mA generated by I1. I2 is simply for testing (to represent the load on the output of the supply). This supply should give between 32V and 0V, and 0A to 4A. I believe that the transformer I have will only provide 0.5A at 48V, but I have designed the circuit to support more current if I choose to change the transformer in the future.
This has taken me over a month, and is only what I guess is a 'first draft'. I need to get some people who really know how these things work to give it a once over before I start designing the PCB!
Wednesday, 19 March 2014
Bench PSU Housing
Hey, So I didn't give up, but I built a few board up and decided I needed a bench power supply. I have been designing a bench supply for a while now. I have started putting the case together. I have cut up the front of an old draw and am going to make it into a box to house the design. Last night I marked up the wood with the components I want on it.
Then I have drilled and sanded for my life until the holes are the right side for the components. Here is the back, and below is the inside of the back. I have made a little bit of a hash of the front so it needs more work. I have the circuit for the supply nearly complete, but i'm still grappling with a few calculations (although im sure it'll all change when I get the design out of the simulator anyway!) - I have purchased a transformer which very shortly I will put a dynamic load that I have at work over it and figure out exactly how many bolts and amps I am going to get out of it. I intent to try and make a printed circuit board, etch it myself (because I can't sure veroboard for this project, as I'd smoke the copper track due to the high current). I'd like to finalise the circuit in the simulator before I get to the task of laying out a single sided PCB (as I beleive double sided will be too tricky). Watch this space for final schematics. Hopefully I will finish it soon so I can get on with the task in hand, which is building the synth! (Project update: I have the first two boards completely built up, thats Midi to CV, and Waveform generator. I just want a current limiter to test them with to ensure I don't smoke any of my lovely components!)
Thursday, 13 February 2014
Sorting Capacitors
I ordered some small value ceramic capacitors from ebay. for the princely sum of £3 I got 50 different values, 20 of each type including postage and packing! A bargain I though, until I came to the problem of how to organise them so I could use them. I really have run out of cash this month so didn't want to get ripped of buying another rubbish plastic monstrosity from Maplins. The solution I found was much more elegant ;)
Writing the resistor code number on left me with only the simple addition of a paper clip on each bag, then a bit of string strung up in my lab, hey presto, capacitor sorting method! Now when I come to picking a capacitor it is as easy as choosing a sirt from the wardrobe (and worryingly similar) :)
Monday, 3 February 2014
Midi to CV - Arduino Code
So, I have written the code that handles the MIDI in and whacks a CV out. This very basically chucks out a number to the DAC that is based on a lookup table. At the moment the values in the lookup table are junk, and that's OK, because the ICL8038 is not looking like it is going to be as precise as I want it to be, so this will give me the ability to be flexible with it, when I find out what it needs.
#include // this library has the "ShiftOut" command in it
#include // Add Midi Library
#define gatePin 13
#define midiIn 0
#define clockPin 5
#define dataPin 6
#define latchPin 4
#define midiSwitchPin 2
#define cvPot A0
#define sweepSwitchPin 3
int oldNote; // this is the last value that we did set
int newNote; // this is the value we want to set
int noteCount; // here we will count how many notes we have pressed at any one time
int midiLookup[144] // here we define the MIDI lookup table, this is 12x12 (12 octaves)
// and will define C-2 to C10 (NOTE: This table WILL need adjusting)
= { 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, // Octave -2
23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, // Octave -1
34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, // Octave 0
45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, // Octave 1
56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, // Octave 2
67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, // Octave 3
78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, // Octave 4
89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, // Octave 5
100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, // Octave 6
111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, // Octave 7
122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, // Octave 8
133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, // Octave 9
144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154 // Octave 10
};
// Below is a function that will be called by the Midi Library
// when a MIDI NOTE ON message is received.
// It will be passed bytes for Channel, Pitch, and Velocity
void HandleNoteOn(byte channel, byte pitch, byte velocity) {
if (velocity == 0) {//A NOTE ON message with a velocity = Zero is actualy a NOTE OFF
noteCount = noteCount - 1; // we remove 1 from the 'note on' count
}
else
{
newNote = midiLookup[pitch]; // set the newnote to be the value defined by the lookup table
noteCount = noteCount + 1; // we add one to the 'note on' count
}
if (noteCount >> 0)
{digitalWrite (gatePin, HIGH);}
else
{digitalWrite (gatePin, LOW);}
}
void setup() {
pinMode(clockPin, OUTPUT); // configure the clock pin to be an output
pinMode(midiIn, INPUT); // configure the midi in pin to be an input
pinMode(gatePin, OUTPUT); // configure the gate pin to be an output
pinMode(dataPin, OUTPUT); // configure the data pin to be an output
pinMode(latchPin, OUTPUT); // configure the latch pin to be an output
pinMode(cvPot, INPUT); // configure the pot to be an input
pinMode(midiSwitchPin, INPUT); // configure the midi switch to be an input
pinMode(sweepSwitchPin, INPUT); // configure the sweepSwitch io be an input
digitalWrite(clockPin, LOW); // Here we write the clock pin to be low
digitalWrite(latchPin, LOW); // Here we set the latch high to tell the device we dont need it
oldNote = 0; // the last value we set at this point is invalid, so we set this to 0
newNote = 1024; // we want to start off somewhere sensible so ballpark? 1024
noteCount = 0; // assume that all notes are off when the unit powers on
MIDI.begin(MIDI_CHANNEL_OMNI); // Initialize the Midi Library.
// OMNI sets it to listen to all channels.. MIDI.begin(2) would set it
// to respond to channel 2 notes only.
MIDI.setHandleNoteOn(HandleNoteOn); // This is important!! This command
// tells the Midi Library which function I want called when a Note ON command
// is received. in this case it's "HandleNoteOn".
}
void writeClockAndData (byte TopNumToSend, byte BottomNumToSend)
{
digitalWrite(latchPin, HIGH);
digitalWrite(gatePin, LOW); // default position at the start is notes off
digitalWrite(clockPin, LOW); // we are interfacing with a device that is clocked by rising edges, so we must first set the clock pin low
shiftOut(dataPin, clockPin, MSBFIRST, TopNumToSend); // here we send the data top end of the data
shiftOut(dataPin, clockPin, MSBFIRST, BottomNumToSend); // here we send the data bottom end of the data
digitalWrite(latchPin, LOW); // driving the latch high updates the DAC
}
void loop () { // Main loop
oldNote = newNote; //transfere the old value into oldNote before updating newNote
if (digitalRead(midiSwitchPin) == HIGH) {
MIDI.read(); // Continually check what Midi Commands have been received.
}
else
{
noteCount = 0; // this is a soft reset incase we get MIDI notes stuck on,
// we can flip in and out of MIDI mode to clear the problem
digitalWrite(gatePin, LOW); // this does a hard clear of the 'note on' count
if (digitalRead(sweepSwitchPin) == HIGH) {
delay(10);
newNote = newNote + analogRead(cvPot); // set the note to be incremented by the value of the analog pot
if (newNote > 4096) {newNote = 0;} // reset the sweep if it hits max.
}
else
{
delay(10);
newNote = analogRead(cvPot); // set the value of the note to be played to the value of the analog pot.
newNote = newNote * 4; // scale the 0 to 1024 value from the pot to 0 to 4096 for the DAC
}
}
if (oldNote != newNote) { // if the note value has changed from the last application scan...
writeClockAndData(highByte(newNote),lowByte(newNote)); // here we set the data
}
}
#include
#include
#define gatePin 13
#define midiIn 0
#define clockPin 5
#define dataPin 6
#define latchPin 4
#define midiSwitchPin 2
#define cvPot A0
#define sweepSwitchPin 3
int oldNote; // this is the last value that we did set
int newNote; // this is the value we want to set
int noteCount; // here we will count how many notes we have pressed at any one time
int midiLookup[144] // here we define the MIDI lookup table, this is 12x12 (12 octaves)
// and will define C-2 to C10 (NOTE: This table WILL need adjusting)
= { 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, // Octave -2
23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, // Octave -1
34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, // Octave 0
45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, // Octave 1
56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, // Octave 2
67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, // Octave 3
78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, // Octave 4
89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, // Octave 5
100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, // Octave 6
111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, // Octave 7
122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, // Octave 8
133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, // Octave 9
144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154 // Octave 10
};
// Below is a function that will be called by the Midi Library
// when a MIDI NOTE ON message is received.
// It will be passed bytes for Channel, Pitch, and Velocity
void HandleNoteOn(byte channel, byte pitch, byte velocity) {
if (velocity == 0) {//A NOTE ON message with a velocity = Zero is actualy a NOTE OFF
noteCount = noteCount - 1; // we remove 1 from the 'note on' count
}
else
{
newNote = midiLookup[pitch]; // set the newnote to be the value defined by the lookup table
noteCount = noteCount + 1; // we add one to the 'note on' count
}
if (noteCount >> 0)
{digitalWrite (gatePin, HIGH);}
else
{digitalWrite (gatePin, LOW);}
}
void setup() {
pinMode(clockPin, OUTPUT); // configure the clock pin to be an output
pinMode(midiIn, INPUT); // configure the midi in pin to be an input
pinMode(gatePin, OUTPUT); // configure the gate pin to be an output
pinMode(dataPin, OUTPUT); // configure the data pin to be an output
pinMode(latchPin, OUTPUT); // configure the latch pin to be an output
pinMode(cvPot, INPUT); // configure the pot to be an input
pinMode(midiSwitchPin, INPUT); // configure the midi switch to be an input
pinMode(sweepSwitchPin, INPUT); // configure the sweepSwitch io be an input
digitalWrite(clockPin, LOW); // Here we write the clock pin to be low
digitalWrite(latchPin, LOW); // Here we set the latch high to tell the device we dont need it
oldNote = 0; // the last value we set at this point is invalid, so we set this to 0
newNote = 1024; // we want to start off somewhere sensible so ballpark? 1024
noteCount = 0; // assume that all notes are off when the unit powers on
MIDI.begin(MIDI_CHANNEL_OMNI); // Initialize the Midi Library.
// OMNI sets it to listen to all channels.. MIDI.begin(2) would set it
// to respond to channel 2 notes only.
MIDI.setHandleNoteOn(HandleNoteOn); // This is important!! This command
// tells the Midi Library which function I want called when a Note ON command
// is received. in this case it's "HandleNoteOn".
}
void writeClockAndData (byte TopNumToSend, byte BottomNumToSend)
{
digitalWrite(latchPin, HIGH);
digitalWrite(gatePin, LOW); // default position at the start is notes off
digitalWrite(clockPin, LOW); // we are interfacing with a device that is clocked by rising edges, so we must first set the clock pin low
shiftOut(dataPin, clockPin, MSBFIRST, TopNumToSend); // here we send the data top end of the data
shiftOut(dataPin, clockPin, MSBFIRST, BottomNumToSend); // here we send the data bottom end of the data
digitalWrite(latchPin, LOW); // driving the latch high updates the DAC
}
void loop () { // Main loop
oldNote = newNote; //transfere the old value into oldNote before updating newNote
if (digitalRead(midiSwitchPin) == HIGH) {
MIDI.read(); // Continually check what Midi Commands have been received.
}
else
{
noteCount = 0; // this is a soft reset incase we get MIDI notes stuck on,
// we can flip in and out of MIDI mode to clear the problem
digitalWrite(gatePin, LOW); // this does a hard clear of the 'note on' count
if (digitalRead(sweepSwitchPin) == HIGH) {
delay(10);
newNote = newNote + analogRead(cvPot); // set the note to be incremented by the value of the analog pot
if (newNote > 4096) {newNote = 0;} // reset the sweep if it hits max.
}
else
{
delay(10);
newNote = analogRead(cvPot); // set the value of the note to be played to the value of the analog pot.
newNote = newNote * 4; // scale the 0 to 1024 value from the pot to 0 to 4096 for the DAC
}
}
if (oldNote != newNote) { // if the note value has changed from the last application scan...
writeClockAndData(highByte(newNote),lowByte(newNote)); // here we set the data
}
}
Subscribe to:
Posts (Atom)