electro-music.com   Dedicated to experimental electro-acoustic
and electronic music
 
    Front Page  |  Radio
 |  Media  |  Forum  |  Wiki  |  Links
Forum with support of Syndicator RSS
 FAQFAQ   CalendarCalendar   SearchSearch   MemberlistMemberlist   UsergroupsUsergroups   LinksLinks
 RegisterRegister   ProfileProfile   Log in to check your private messagesLog in to check your private messages   Log inLog in  Chat RoomChat Room 
 Forum index » DIY Hardware and Software » Microcontrollers and Programmable Logic
Arduino-based Sequencer
Post new topic   Reply to topic Moderators: State Machine
Page 1 of 1 [14 Posts]
View unread posts
View new posts in the last week
Mark the topic unread :: View previous topic :: View next topic
Author Message
Franky



Joined: Dec 09, 2007
Posts: 57
Location: Grenoble - France

PostPosted: Sat May 03, 2008 10:29 am    Post subject: Arduino-based Sequencer
Subject description: A polyvalent sequencer from an Arduino board
Reply with quote  Mark this post and the followings unread

Hi guys, I've bought an Arduino board (not exactly the real Arduino, a clone, but it's doing exactly the same stuff), and I had some toughts about a little (but powerfull) sequencer to do with.

Here's the thing:

8 steps
3 resets modes (4th ,6th or 8th step)
3 running modes: forward, reverse, pendullum (mirror mode)

Controls:
Frequency CV (0-5V range)
Gate Length CV (0-5V range)
Gate out - 5V
8 step-gates out (no CV, no pots)

Here's the code:
Code:


**************************************
*
*     ARDUINO SEQUENCER
*     Source Code by: Franky
*     Version: 0.1 beta
*     License: Copyleft (free)
*
**************************************


int i;
int freqPin = 0;   // Analog freq control
int pwPin = 1;     // Analog PW control (gate length)
int modePin1 = 8;
int modePin2 = 9;
int gatePin = 10;
int freq;          // Frequency value
int gl;            // Gate Lenght value
int uns;           // Time Until NeXTStep
int resetPin1 = 11;
int resetPin2 = 12;

void blink(char nbre) {
  char i;
  for (i=0;i<nbre;i++) {
     digitalWrite(ledPin, HIGH);
     delay(500);
     digitalWrite(ledPin, LOW);
     delay(500);
  }
}

void setup() {
  pinMode(0, OUTPUT);
  pinMode(1, OUTPUT);
  pinMode(2, OUTPUT);
  pinMode(3, OUTPUT);
  pinMode(4, OUTPUT);
  pinMode(5, OUTPUT);
  pinMode(6, OUTPUT);
  pinMode(7, OUTPUT);

  pinMode(modePin1, INPUT);
  pinMode(modePin2, INPUT);
  pinMode(resetPin1, INPUT);
  pinMode(restePin2, INPUT);

  pinMode(gatePin, OUTPUT);

  blink(3);
}

int moderead() {
  int mode1;
  int mode2;
  mode1 = digitalRead(modePin1);
  mode2 = digitalRead(modePin2);
  if (mode1 == LOW && mode2 == HIGH) return 1;
  if (mode2 == LOW && mode2 == LOW) return 2;
  if (mode2 == HIGH && mode2 == LOW) return 3;
  else return 0; /* Should never happen */
}

int resetpoint() {
  int r1 = digitalRead(resetPin1);
  int r2 = digitalRead(resetPin2);
  if (r1 == LOW && r2 == HIGH) return 4;
  if (r2 == LOW && r2 == LOW) return 6;
  if (r2 == HIGH && r2 == LOW) return 8;
  else return 8; /* Should never happen */
}

void loop() {
  switch (moderead()) {
  case 0:
    break; /* Should never happen */

  case 1: // Forward mode
    for (i=0; i<resetpoint(); i++) {
      freq = analogRead(freqPin);
      gl = (analogRead(pwPin)*freq)/1024;
      uns = freq-gl;
      digitalWrite(i, HIGH);
      digitalWrite(gatePin, HIGH);
      delay(gl);
      digitalWrite(i, LOW);
      digitalWrite(gatePin, LOW);
      delay(uns);
    }
    break;

  case 2: // Mirror mode
    for (i=0; i<resetpoint>0; i--) {
      freq = analogRead(freqPin);
      gl = (analogRead(pwPin)*freq)/1024;
      uns = freq-gl;
      digitalWrite(i, HIGH);
      digitalWrite(gatePin, HIGH);
      delay(gl);
      digitalWrite(i, LOW);
      digitalWrite(gatePin, LOW);
      delay(uns);
    }
    break;

  case 3: // Reverse mode
    for (i=(resetpoint()-1); i>=0; i--) {
      freq = analogRead(freqPin);
      gl = (analogRead(pwPin)*freq)/1024;
      uns = freq-gl;
      digitalWrite(i, HIGH);
      digitalWrite(gatePin, HIGH);
      delay(gl);
      digitalWrite(i, LOW);
      digitalWrite(gatePin, LOW);
      delay(uns);
    }
    break;
  }
}





There are some pins available on the board, so it can be upgraded.

The code is free, you can do whatever you want with it..

_________________
Forty Seven Effects
Back to top
View user's profile Send private message Visit poster's website
Joel



Joined: Sep 12, 2006
Posts: 97
Location: London, UK

PostPosted: Sat May 03, 2008 11:08 am    Post subject: Reply with quote  Mark this post and the followings unread

Looks great! I've got an Arduino somewhere, will have to dig it out and give this a go when I get a chance....

It uses some different methods, but have you seen the Arduino Punk Console?

p.s. what does polyvalent mean, in relation to a sequencer?

Thanks for posting, Joel
Back to top
View user's profile Send private message
Franky



Joined: Dec 09, 2007
Posts: 57
Location: Grenoble - France

PostPosted: Sat May 03, 2008 1:01 pm    Post subject: Reply with quote  Mark this post and the followings unread

By polyvalent I mean it can run through several modes, where a classic "analog" sequencer can only go through one: forward. Here are 2 more running modes, allowing different sequences..

Wow, the punk console sounds great! Sounds like an old NES console lol..

Didn't try the audio possibilities of the Arduino so far, but i'm gonna give it a go..

_________________
Forty Seven Effects
Back to top
View user's profile Send private message Visit poster's website
okvern



Joined: Feb 05, 2008
Posts: 78
Location: Seattle, Washington
Audio files: 5

PostPosted: Wed May 07, 2008 12:54 am    Post subject: Reply with quote  Mark this post and the followings unread

Fellow Builders,

The Arduino is cool, definitely a platform to watch--take a look at the Arduino-related stuff at:

http://little-scale.blogspot.com/2008/02/simple-polyphonic-synth-with-just.html

I've gotten distracted by PICs lately because of a couple of projects, but I'll be going back to the Arduino soon.

re: the punk console

It's great that they used Visio for their panel layouts--I was Visio (pre-Microsoft) employee #11, title "Shapemaster," and they probably used shapes I wrote. I use it for all my panel layouts, and for some circuit board layouts.

Thanks,

Ole
Back to top
View user's profile Send private message
beavis



Joined: Aug 23, 2007
Posts: 14
Location: US

PostPosted: Wed May 07, 2008 8:27 am    Post subject: Reply with quote  Mark this post and the followings unread

okvern wrote:
Fellow Builders,

re: the punk console

It's great that they used Visio for their panel layouts--I was Visio (pre-Microsoft) employee #11, title "Shapemaster," and they probably used shapes I wrote. I use it for all my panel layouts, and for some circuit board layouts.

Thanks,

Ole


I'm the guy who used visio for all that stuff Smile

I've been around long enough to have used visio pre-MSFT, so its great to meet you!

I do schematics, enclosure layouts, drilling templates, build guides and even PCB layouts all in Visio. It simple rocks.

_________________
www.beavisaudio.com
Back to top
View user's profile Send private message Visit poster's website
Kassen
Janitor
Janitor


Joined: Jul 06, 2004
Posts: 7678
Location: The Hague, NL
G2 patch files: 3

PostPosted: Wed May 07, 2008 4:09 pm    Post subject: Reply with quote  Mark this post and the followings unread

I've got a borrowed Arduino here now. I've only had it for a few days and didn't get round to it beyond a quick look at the syntax. Looks very accessible indeed, thanks for the nice links.
_________________
Kassen
Back to top
View user's profile Send private message Send e-mail Visit poster's website
okvern



Joined: Feb 05, 2008
Posts: 78
Location: Seattle, Washington
Audio files: 5

PostPosted: Wed May 07, 2008 7:41 pm    Post subject: Reply with quote  Mark this post and the followings unread

Hi Franky,

I think gremlins got at your code a bit in the posting process--which is pretty common when posting code on forums. This happens to me every time, and I *run* a forum!Smile First, we're missing a define--add:

int ledPin = 13; // LED connected to digital pin 13

There's a typo in your setup function--"restePin2" should be "resetPin2".

Next, I think that this:

for (i=0; i<resetpoint>0; i--) {

Should probably be:

for (i=0; i < resetpoint() > 0; i--) {

(Even though it looks like you've surrounded your code with a <code> or <pre> element, it looks like the forum decided that "resetpoint" belonged in a tag.)

Once I made those changes, it seems to compile and download fine--now I have to set up a breadboard to attach the controls. I think I can deduce what everything is supposed to be, but if you have a chance to post a note about pots/switches we need to attach, that would be great.

Thanks for sharing this code!

Ole
Back to top
View user's profile Send private message
blue hell
Site Admin


Joined: Apr 03, 2004
Posts: 24079
Location: The Netherlands, Enschede
Audio files: 278
G2 patch files: 320

PostPosted: Thu May 08, 2008 1:57 am    Post subject: Reply with quote  Mark this post and the followings unread

okvern wrote:
(Even though it looks like you've surrounded your code with a <code> or <pre> element, it looks like the forum decided that "resetpoint" belonged in a tag.)


Note to code posters : using the "Disable HTML in this post" option helps.

_________________
Jan
also .. could someone please turn down the thermostat a bit.
Posted Image, might have been reduced in size. Click Image to view fullscreen.
Back to top
View user's profile Send private message Visit poster's website
Kassen
Janitor
Janitor


Joined: Jul 06, 2004
Posts: 7678
Location: The Hague, NL
G2 patch files: 3

PostPosted: Thu May 08, 2008 2:54 am    Post subject: Reply with quote  Mark this post and the followings unread

Also; using the code tag will preserve indentation and get you a monospaced font. If you don't use it all spaces and tabs at the start of lines will be removed.

Typically it's wise to disable smileys as well.

_________________
Kassen
Back to top
View user's profile Send private message Send e-mail Visit poster's website
Franky



Joined: Dec 09, 2007
Posts: 57
Location: Grenoble - France

PostPosted: Thu May 08, 2008 3:40 pm    Post subject: Reply with quote  Mark this post and the followings unread

Damn it, you're right, and it seems that a big part of the code is missing: look at the Mirror mode, it only goes one way..

I'm not using the #define system to declare my pins, it didn't work at first, so I came up to declare this way.. Anyway it's the same..

About ledPin, i'm just using it to blink 3 times once the sketch is done uploading, you're not forced to use it.. It saves a pin moreover..

Thanks for the typo mistake, I didn't compile it so I could'nt know..

New try:

Code:

/*
**************************************
*
*     ARDUINO SEQUENCER
*     Source Code by: Franky
*     Version: 0.2b
*     License: Copyleft (free)
*
**************************************
*/


int i;
int freqPin = 0;   // Analog freq control             (analog in)
int pwPin = 1;     // Analog PW control (gate length) (analog in)
int modePin1 = 8;  // Reading from mode switch        (digital in)
int modePin2 = 9;  // idem                            (digital in)
int resetPin1 = 10;// Reading reset switch            (digital in)
int resetPin2 = 11;// idem                            (digital in)
int gatePin = 12;  // Gate out pin                    (digital out)
int ledPin = 13;   // Used for blink() function       (digital out)
int freq;          // Frequency value
int gl;            // Gate Lenght value
int uns;           // Time Until NeXTStep

void blink(char nbr) {
  for (i=0;i<nbr;i++) {
    delay(500);
    digitalWrite(ledPin, HIGH);
    delay(500);
    digitalWrite(ledPin, LOW);
  }
}

void setup() {
  pinMode(0, OUTPUT);   // Output pins, digital out
  pinMode(1, OUTPUT);   
  pinMode(2, OUTPUT);
  pinMode(3, OUTPUT);
  pinMode(4, OUTPUT);
  pinMode(5, OUTPUT);
  pinMode(6, OUTPUT);
  pinMode(7, OUTPUT);

  pinMode(modePin1, INPUT);
  pinMode(modePin2, INPUT);
  pinMode(resetPin1, INPUT);
  pinMode(resetPin2, INPUT);

  pinMode(gatePin, OUTPUT);

  blink(3);
}


int moderead() {
  int mode1;
  int mode2;
  mode1 = digitalRead(modePin1);
  mode2 = digitalRead(modePin2);
  if (mode1 == LOW && mode2 == HIGH) return 1;
  if (mode2 == LOW && mode2 == LOW) return 2;
  if (mode2 == HIGH && mode2 == LOW) return 3;
  else return 0; /* Should never happen */
}

int resetpoint() {
  int r1 = digitalRead(resetPin1);
  int r2 = digitalRead(resetPin2);
  if (r1 == LOW && r2 == HIGH) return 4;
  if (r2 == LOW && r2 == LOW) return 6;
  if (r2 == HIGH && r2 == LOW) return 8;
  else return 8; /* Should never happen */
}


void loop() {
  switch (moderead()) {
  case 0:
    break; /* Should never happen */
   
  case 1: // Forward mode
    for (i=0; i<resetpoint(); i++) {
      freq = analogRead(freqPin);
      gl = (analogRead(pwPin)*freq)/1024;
      uns = freq-gl;
      digitalWrite(i, HIGH);
      digitalWrite(gatePin, HIGH);
      delay(gl);
      digitalWrite(i, LOW);
      digitalWrite(gatePin, LOW);
      delay(uns);
    }
    break;

  case 2: // Mirror mode
    for (i=0; i<resetpoint(); i++) {
      freq = analogRead(freqPin);
      gl = (analogRead(pwPin)*freq)/1024;
      uns = freq-gl;
      digitalWrite(i, HIGH);
      digitalWrite(gatePin, HIGH);
      delay(gl);
      digitalWrite(i, LOW);
      digitalWrite(gatePin, LOW);
      delay(uns);
    }
// Steps 1 & 8 are triggered in forward loop
// reverse loop does not repeat it at the ends
    for (i=(resetpoint()-2); i>0; i--) {
      freq = analogRead(freqPin);
      gl = (analogRead(pwPin)*freq)/1024;
      uns = freq-gl;
      digitalWrite(i, HIGH);
      digitalWrite(gatePin, HIGH);
      delay(gl);
      digitalWrite(i, LOW);
      digitalWrite(gatePin, LOW);
      delay(uns);
    }
    break;

  case 3: // Reverse mode
    for (i=(resetpoint()-1); i>=0; i--) {
      freq = analogRead(freqPin);
      gl = (analogRead(pwPin)*freq)/1024;
      uns = freq-gl;
      digitalWrite(i, HIGH);
      digitalWrite(gatePin, HIGH);
      delay(gl);
      digitalWrite(i, LOW);
      digitalWrite(gatePin, LOW);
      delay(uns);
    }
    break;
  }
}



About the hardware:

For the mode button, the best is a 3 position toggle switch, on-off-on, with the center pin connected to VCC, and the others to modePin1 & modePin2 with their pullup resistors. It's the same for the reset button, and it will reset on steps 4, 6 or 8.
Each output should be connected to a pot wired as a voltage divider, with a diode (1N4148 should do the job) in series with the cursor, then connect all the cathodes together so the current can't flow back to the Arduino. And you've got your sequencer..

I can post a schematic if you want, but it's a very basic workout..


Edit: I have some thoughts about a sequencer using only switches and a few pots, like the punk console, with rotary encoders to set the pitch and the same kind of sequence modes i've got here..

_________________
Forty Seven Effects
Back to top
View user's profile Send private message Visit poster's website
XeroX



Joined: Sep 02, 2008
Posts: 10
Location: germany

PostPosted: Tue Nov 24, 2009 9:47 pm    Post subject: Reply with quote  Mark this post and the followings unread

this is an old thread, but i just bought an arduino Wink

would be nice if you could post the schematic.
and maybe someone could give me some tips where to find more about arduino and sequencer.

_________________
ﻫﻚ ॐ ™
Back to top
View user's profile Send private message Visit poster's website
acidblue



Joined: Jun 26, 2009
Posts: 226
Location: The Darkside

PostPosted: Fri Jun 18, 2010 10:51 am    Post subject: Reply with quote  Mark this post and the followings unread

I second the posting of a schematic.
Would be great for us new guys. Laughing

Great job BTW.
Back to top
View user's profile Send private message
nerdware



Joined: Jul 11, 2009
Posts: 91
Location: UK

PostPosted: Thu Jul 15, 2010 7:30 am    Post subject: Reply with quote  Mark this post and the followings unread

This is a great sequencer example! Thanks.

However, the moderead function doesn't need the series of tests to do the job. Simply shift one of the inputs, say mode2, by 1 bit and binary OR it with the other input, mode1. It'll be easier to read and it'll run faster. Smile

I'll leave the single line of code as an exercise, shall I? Wink

_________________
http://soundcloud.com/nerdware/
"render unto digital what is due to digital, render unto analogue what is due to analogue"
Back to top
View user's profile Send private message Visit poster's website
cappy2112



Joined: Dec 24, 2004
Posts: 2465
Location: San Jose, California
Audio files: 2
G2 patch files: 1

PostPosted: Fri Jul 16, 2010 11:07 am    Post subject: Reply with quote  Mark this post and the followings unread

Kassen wrote:
I've got a borrowed Arduino here now. I've only had it for a few days and didn't get round to it beyond a quick look at the syntax. Looks very accessible indeed, thanks for the nice links.


I've just read an article- about Parallel programming with Arduino's

Not quite what one would expect though, but nice idea.


http://tinyurl.com/298al2e

_________________
Free Tibet. Release the Panchen Lama from prison. Let the Dalai Lama return to his home.
Back to top
View user's profile Send private message
Display posts from previous:   
Post new topic   Reply to topic Moderators: State Machine
Page 1 of 1 [14 Posts]
View unread posts
View new posts in the last week
Mark the topic unread :: View previous topic :: View next topic
 Forum index » DIY Hardware and Software » Microcontrollers and Programmable Logic
Jump to:  

You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot vote in polls in this forum
You cannot attach files in this forum
You can download files in this forum


Forum with support of Syndicator RSS
Powered by phpBB © 2001, 2005 phpBB Group
Copyright © 2003 through 2009 by electro-music.com - Conditions Of Use