Pages: 1 [2] 3   Go Down
Author Topic: [SOLUCIONADO] dronesizer  (Read 2113 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Newbie
*
Karma: 0
Posts: 17
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Sin problemas, además no puedo enfadarme contigo si me miras con esos ojos  smiley-mr-green
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 17
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Quote
Esta linea es un pufo de cuidado, para empezar, sei() es una funcion void, no devuelve nada, y <<<???

Tampoco he conseguido que funcione el primer código (el primero que puse es una versión actualizada, incluyo el otro del que hablo ahora abajo), en esta ocasión me salen fallos en esta linea:

TIMSK2 = 1&lt;&lt;&lt;SINC_LENGTH)

Y los fallos son:

sketch_aug26b.cpp: In function 'void setup()':
sketch_aug26b:57: error: 'lt' was not declared in this scope
sketch_aug26b:57: error: expected `;' before ')' token
sketch_aug26b:60: error: 'gt' was not declared in this scope
sketch_aug26b:60: error: expected `)' before ';' token
sketch_aug26b:60: error: expected `;' before ')' token
sketch_aug26b:63: error: 'gt' was not declared in this scope
sketch_aug26b:63: error: expected `)' before ';' token
sketch_aug26b:63: error: expected `;' before ')' token
sketch_aug26b:66: error: 'gt' was not declared in this scope
sketch_aug26b:66: error: expected `)' before ';' token
sketch_aug26b:66: error: expected `;' before ')' token

Code:
//audio out variables
float TEMP= 0.0;
 
#define SINC_LENGTH 32
 
float sinC[3][SINC_LENGTH] = {
  {//sinus
    0.59754515,0.69134176,0.7777851,0.8535534,0.9157348,0.96193975,0.9903926,1.0,0.9903927,0.9619398,0.9157348,0.8535534,0.77778506,0.69134164,0.597545,0.49999985,0.40245464,0.30865806,0.22221464,0.14644638,0.08426499,0.03806007,0.009607285,0.0,0.009607464,0.038060457,0.08426553,0.14644706,0.22221544,0.30865896,0.4024556,0.5000008,  }
  ,
  {//saw
    1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,  }
  ,
  {//tri
    0.03125,0.0625,0.09375,0.125,0.15625,0.1875,0.21875,0.25,0.28125,0.3125,0.34375,0.375,0.40625,0.4375,0.46875,0.5,0.53125,0.5625,0.59375,0.625,0.65625,0.6875,0.71875,0.75,0.78125,0.8125,0.84375,0.875,0.90625,0.9375,0.96875,1.0,  }
};
 
int incomingByte = 0; // for incoming serial datar
 
int pin0val =0;
 
enum waveFormType {
  SIN, SQUARE,TRI,  };
 
/*
float vol1=1.0;
 float vol2=1.0;
 float vol3=1.0;
 float vol4=1.0;*/
 
float globalHz1 =0.001;
float oscCount1=0;
 
float globalHz2 =0.001;
float oscCount2=0;
 
float globalHz3 =0.001;
float oscCount3=0;
 
float LFOHz =0.001;
float lfoCount=0;
 
int type=0;
 
void setup()
{
 
  pinMode(8, OUTPUT);
  pinMode(9, OUTPUT);
  pinMode(10, OUTPUT);
  pinMode(11, OUTPUT);
  pinMode(12, OUTPUT);
  pinMode(13, OUTPUT);
  Serial.begin(9600);
 
  randomSeed(analogRead(0));
 
  //Timer2 setup  This is the audio rate timer, fires an interrupt at 15625 Hz sampling rate
  TIMSK2 = 1&lt;&lt;&lt;SINC_LENGTH)
    oscCount1=0;
  oscCount2+=globalHz2;
  if(oscCount2&gt;SINC_LENGTH)
    oscCount2=0;
  oscCount3+=globalHz3;
  if(oscCount3&gt;SINC_LENGTH)
    oscCount3=0;
  lfoCount+=LFOHz;
  if(LFOHz&gt;SINC_LENGTH)
    LFOHz=0;
 
}
 
void calculateHz(float in,float detune1, float detune2)
{
 
  globalHz1 = ((440 * pow(2.0,(in-69.0)/12.0))/1562.50);
  globalHz2 = (440 * pow(2.0,(detune1-69.0)/12.0))/1562.50;
  globalHz3 = (440 * pow(2.0,(detune2-69.0)/12.0))/1562.50;
 
  /*
  Serial.print("  ");
   Serial.print(globalHz1*100000, DEC);
   Serial.print("  ");
   Serial.print(globalHz2*100000, DEC);
   Serial.print("  ");
   Serial.print(globalHz3*100000, DEC);
   */
}
 
void loop()
{
 
  LFOHz = (analogRead(3)/(SINC_LENGTH*10.0));
  type=analogRead(5)/51;// 20 modes
  float note = ((analogRead(0)/1024.0)*100.0);
  calculateHz(note,note-(((analogRead(1)/1024.0)*2.0)-1.0),note-(((analogRead(2)/1024.0)*2.0)-1.0));
 
  /*
  Serial.println("vol ");
 
   Serial.print(vol,DEC);
 
   Serial.println(" LFOHz");
   Serial.print(LFOHz,DEC);
 
   Serial.print("analog 1: ");
   Serial.print( analogRead(1),DEC);
 
   Serial.print("___ analog 2: ");
   Serial.print( analogRead(2),DEC);
 
   Serial.print(" type ");
   Serial.print(type);
 
   Serial.print(" Note ");
   Serial.print((int)(note) );
   Serial.println(" ");
 
   */
}
 

No se, es muy raro que no me funcionen ninguno de los dos códigos y en cambio si le funcionen al autor, no?


Logged

0
Offline Offline
Edison Member
*
Karma: 17
Posts: 1407
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

al definir las array las termina con
Code:
,  }

segun http://arduino.cc/es/Reference/Array
deberia acabar con el ultimo elemento de la lista
int myArray[10]={9,3,2,4,3,2,7,8,9,11};

Code:
float sinC[3][SINC_LENGTH] = {
  {//sinus
    0.59754515,0.69134176,0.7777851,0.8535534,0.9157348,0.96193975,0.9903926,1.0,0.9903927,0.9619398,0.9157348,0.8535534,0.77778506,0.69134164,0.597545,0.49999985,0.40245464,0.30865806,0.22221464,0.14644638,0.08426499,0.03806007,0.009607285,0.0,0.009607464,0.038060457,0.08426553,0.14644706,0.22221544,0.30865896,0.4024556,0.5000008 }
  ,
  {//saw
    1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 }
  ,
  {//tri
    0.03125,0.0625,0.09375,0.125,0.15625,0.1875,0.21875,0.25,0.28125,0.3125,0.34375,0.375,0.40625,0.4375,0.46875,0.5,0.53125,0.5625,0.59375,0.625,0.65625,0.6875,0.71875,0.75,0.78125,0.8125,0.84375,0.875,0.90625,0.9375,0.96875,1.0 }
};

prueba a ver si el numero de errores se reduce o igual hay algo que yo no se.
Logged

* Si preguntas, pon el código de tu programa, hace mucho mas fácil ayudarte. Y me ahorro un mensaje pidiendo que lo hagas.
* Si consigues solucionar tu problema, dedica unos minutos a explicar en tu post como lo conseguiste para beneficio de todos.
* Cambia el 'Subject' de tu hilo y añade 'SOLUCIONADO' cuando hayas llegado a una solución al problema que planteaste.
* Utiliza un 'Subject' para tu hilo que explique de que va el hilo.
Si estas empezando:
* Comienza a usar Arduino
* Guías de iniciación a Arduino
* Ejemplos
* Referencia del Lenguaje
* Conceptos básicos
Guia de usuario de arduino
Tutoriales en Ingles
Si necesitas que alguien te escriba el código: http://www.freelancer.com/  o esta  http://www.guru.com/

0
Offline Offline
Edison Member
*
Karma: 16
Posts: 1579
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

El codigo no lo han puesto bien en la web, por ejemplo en : if(oscCount3&gt;SINC_LENGTH) o en ;&lt

Esto es porque la conversion en html de los simbolos no se ha realizado correctamente. Hay varias erratas ahi....
TIMSK2 = 1&lt;&lt;&lt;SINC_LENGTH)
if(oscCount2&gt;SINC_LENGTH)
etc.

Por ejemplo, &gt; es el signo > y &lt; es <



« Last Edit: August 26, 2011, 11:52:53 am by Igor R » Logged


Málaga, Spain
Offline Offline
Edison Member
*
Karma: 37
Posts: 2172
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Hola,

por lo que he podido leer del código (la verdad es que no le he podido dedicar mucho tiempo), lo que se pretende es generar una forma de onda digital usando uno de los puertos con salidas discretas. El código en discordia lo que entiendo que debería hacer es llamar de forma periódica a la función oscillator. Para ello utiliza el timer counter 2 del AVR para producir una interrupción periódica. Por lo que entiendo que el código pretende hacer, es configurar el comparador 2 para que cada vez que llegue a un valor determinado se llame a la rutina de interrupción (aka oscillator).

Por lo tanto este código:
Code:
//Timer2 setup This is the audio rate timer, fires an interrupt at 15625 Hz sampling rate
TIMSK2 = 1< OCR2A = 127;
TCCR2A = 2; // CTC mode, counts up to 127 then resets
TCCR2B = 0<<< sei(); // global interrupt enable

}

// timer 2 is audio interrupt timer
ISR(TIMER2_COMPA_vect)
{
OCR2A = 127;
oscillator();

}


Debería quedar de la siguiente forma para que compile:

Code:
// cargo en el registro OCR2A - Output Compare Register A - 127, este valor se compara continuamente con
// el contador TCNT2, que se actualiza automaticamente por el micro con un "tick" dependiente de la configuración
// de preescalado del timer 2
OCR2A = 127;
 
// Configuro el contador en modo CTC (Clear Timer on Compare Match) - resetear el timer cuando
// TCNT2 sea igual que OCR2A (e.d. 127)
TCCR2A = 2;
TCCR2B = 0;

// Configuro el bloque del contador 2 para que genere una interrupción cada vez que hay un overflow
// en el contador.
TIMSK2 = 1;
...
sei (); // enable interrupts


}
// timer 2 is audio interrupt timer
// Rutina de interrupción que se llamará cada vez que el contador 2 haga overflow.
ISR(TIMER2_COMPA_vect)
{
   OCR2A = 127; // aunque esta linea no sea necesaria, déjala
   oscillator();
}

Siguiendo la lógica de la configuración no me termina de cuadrar. Ya que con el código que hay arriba, el contador nunca llegará a dar la vuelta (overflow) y no se invocará la rutina de interrupción. Esto es debido a que el contador 2 esta configurado en mode CTC, es decir, cuando el contador TCNT2 sea igual que OCR2A, pongo el contador a cero.

Por lo tanto el código quedaría así:

Code:

// cargo en el registro OCR2A - Output Compare Register A - 127, este valor se compara continuamente con
// el contador TCNT2, que se actualiza automaticamente por el micro con un "tick" dependiente de la configuración
// de preescalado del timer 2
OCR2A = 127;
 
// Configuro el contador en modo CTC (Clear Timer on Compare Match) - resetear el timer TCNT2 cuando
// TCNT2 sea igual que OCR2A (e.d. 127)
TCCR2A = 2;
TCCR2B = 0;

// Configuro el bloque del contador 2 para que genere una interrupción cada vez que hay un overflow
// en el contador.
TIMSK2 = 2;
...
sei (); // enable interrupts


}
// timer 2 is audio interrupt timer
// Rutina de interrupción que se llamará cada vez que el contador 2 haga overflow.
ISR(TIMER2_COMPA_vect)
{
OCR2A = 127;
oscillator();

}

Por otro lado, donde en el código pone "&gt" cámbialo por ">" y donde pone "&lt" cámbialo por "<". Ahora debería estar dando fallos de compilación.

A ver si con esto te compila y funciona. Si no es así, publica la fuente de donde has sacado el código y lo miro.


Un saludo
Logged

   

Offline Offline
Newbie
*
Karma: 0
Posts: 17
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Ok y gracias por las molestias, voy a probar lo que me decís, a ver si esta vez funciona.
Otra cosa que he observado es que dependiendo desde que navegador copie el código (hago copia y pega directo al soft de arduino)
el resultado es distinto.
Por ejemplo, la misma linea desde Firefox:

TCCR2B = 0<<< sei(); // global interrupt enable

Y después desde Opera:

TCCR2B = 0< sei(); // global interrupt enable

De todas formas he probado las dos formas, más los cambios que me recomendaron al principio y tampoco funcionaba.
No me extrañaría que el autor esté usando otro navegador distinto en el que todo se esté viendo de forma correcta.

Voy a probarlo y os cuento con lo que sea.
Lo dicho, muchas gracias.
« Last Edit: August 26, 2011, 12:43:24 pm by nach79 » Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 17
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Pues con las correcciones de fmalpartida compila sin problemas, pero quitando los "..." del código.
¿Esos puntos tienen alguna función?

Logged

Málaga, Spain
Offline Offline
Edison Member
*
Karma: 37
Posts: 2172
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Perdona, los puntos suspensivos son simplemente para indicar que podías seguir insertando código y finalmente habilitar interrupciones.

El código debería quedar:

Code:
void setup ()
{
   // Lo que venga antes

   // Iniciar el contador 2
   OCR2A = 127;
   TCCR2A = 2;
   TCCR2B = 0;
   TIMSK2 = 2;

   sei (); // habilitar interrupciones, aunque esto ya se hace dentro del arranque de Arduino en - init()
            // y no debería ser necesario
}

// timer 2 rutina de interrupción
ISR(TIMER2_COMPA_vect)
{
   OCR2A = 127;
   oscillator();
}

Si ves que no funciona, entonces prueba encender y apagar un LED dentro de la rutina, ojo, no pongas dentro ningún delay. Enciende el led las veces pares que entra en la rutina y apágalo las veces impares. A esa frecuencia se vera siempre encendido, pero te dará una idea de si entra o no en la rutina de interrupción. En el caso de que no lo haga, pon TIMSK2 = 1;

Ya nos contarás.

Un saludo.
Logged

   

Málaga, Spain
Offline Offline
Edison Member
*
Karma: 37
Posts: 2172
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Hola,

he hecho algunas pruebas para ver que la rutina que el código que te he dado funciona bien. Con este código deberías ver que el LED del PIN 13 se enciende y si pinchas un osciloscopio veras que una señal de casi 1KHz.

Code:
#define LED_PIN   13
#define DELAY     100

static byte ledStatus = 0;

void setup()
{
   pinMode ( LED_PIN, OUTPUT );
   digitalWrite ( LED_PIN, 0 );
   
   OCR2A = 127;
   TCCR2A = 2;
   TCCR2B = 4
   TIMSK2 = 2;
}

ISR(TIMER2_COMPA_vect)
{
   OCR2A = 127; // aunque esta linea no sea necesaria, déjala
   ledStatus ^= 1;
   digitalWrite( LED_PIN, ledStatus );
}


void loop ()
{

}

Ahora bien, si modificas:
  • TCCR2B = 1; esto te dará una frecuencia de unos 56,79KHz
  • TCCR2B = 2; esto te dará una frecuencia de unos 7,8KHz
  • TCCR2B = 3; esto te dará una frecuencia de unos 1,9KHz
  • TCCR2B = 4; esto te dará una frecuencia de unos 0.98KHz, este es el valor por defecto de la placa
  • Así sucesivamente, 7 es el mínimo...

También he probado con TIMSK2 = 1; y como sospechaba no funciona.

Salu2
Logged

   

Offline Offline
Newbie
*
Karma: 0
Posts: 17
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

fmalpartida...definitívamente eres un crack.
Justo como tu dices, después de hacer la prueba del led y ver que efectivamente se encendía, he probado a cambiar el valor de TCCR2B y por fin ha funcionado. No se si será exactamente como lo pretendía del autor, pero vaya, que suena muy interesante y me viene de lujo para hacer mis propias modificaciones y comprender mejor el código, ahora que ya funciona.
Ayer estuve por la noche revisando el DAC y las demás conexiones, porque aunque ya compilaba, no sonaba, y como pueden ser tantas cosas las que estén fallando.
Así que nada, muchísimas gracias por tu ayuda y por supuesto también a los demás.
Voy a estar unos días haciendo pruebas con el cacharro, diseñando el panel, etc...Cuando lo tenga listo subo un video a este mismo post para que veáis como ha quedado.
Saludos!
Logged

Málaga, Spain
Offline Offline
Edison Member
*
Karma: 37
Posts: 2172
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Hola nach79, muchas gracias por el cumplido, de lo que sí que me alegro es que te haya podido ayudar.

Por cierto, a qué valor has configurado finalmente TCCR2B?

Salu2
Logged

   

Offline Offline
Newbie
*
Karma: 0
Posts: 17
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Pues la verdad es que sirven los 7 valores y eso lo convierte en un generador de drones y ruidos muy versátil.
Tengo unos cuantos cacharros hardware caseros para hacer ruidos dando vueltas por aquí, pero este es más "imprevisible".
Tiene su gracia...

Logged

Málaga, Spain
Offline Offline
Edison Member
*
Karma: 37
Posts: 2172
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Hazle un video para que lo veamos. Tiene una pinta muy divertida.
Logged

   

Offline Offline
Newbie
*
Karma: 0
Posts: 17
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Prometido, en cuanto tenga algo acabado os lo enseño.
De momento dejo por aquí el código que me ha funcionado para los que estén interesados y anden perdidos como yo.
Code:
//audio out variables

#define SINC_LENGTH 32

float sinC[4][SINC_LENGTH] = {
{//sinus
0.59754515,0.69134176,0.7777851,0.8535534,0.9157348,0.96193975,0.9903926,1.0,0.9903927,0.9619398,0.9157348,0.8535534,0.77778506,0.69134164,0.597545,0.49999985,0.40245464,0.30865806,0.22221464,0.14644638,0.08426499,0.03806007,0.009607285,0.0,0.009607464,0.038060457,0.08426553,0.14644706,0.22221544,0.30865896,0.4024556,0.5000008 }
,
{//square
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 }
,
{//saw
0.03125,0.0625,0.09375,0.125,0.15625,0.1875,0.21875,0.25,0.28125,0.3125,0.34375,0.375,0.40625,0.4375,0.46875,0.5,0.53125,0.5625,0.59375,0.625,0.65625,0.6875,0.71875,0.75,0.78125,0.8125,0.84375,0.875,0.90625,0.9375,0.96875,1.0 }
,
{//tri
0.0625,0.125,0.1875,0.25,0.3125,0.375,0.4375,0.5,0.5625,0.625,0.6875,0.75,0.8125,0.875,0.9375,1.0,0.9375,0.875,0.8125,0.75,0.6875,0.625,0.5625,0.5,0.4375,0.375,0.3125,0.25,0.1875,0.125,0.0625,0.0 }
};

float note =50;
float TEMP= 0.0;

int oldKnobs[6] ={
0,0,0,0,0,0};
int tempKnobs[6] ={
0,0,0,0,0,0};

enum waveFormType {
SIN, SQUARE,SAW,TRI, };

float globalHz1 =0.001;
float oscCount1=0;

float globalHz2 =0.001;
float oscCount2=0;

float globalHz3 =0.001;
float oscCount3=0;

float LFOHz =0.001;
float lfoCount=0;

int type=0;

void setup()
{

pinMode(8, OUTPUT);
pinMode(9, OUTPUT);
pinMode(10, OUTPUT);
pinMode(11, OUTPUT);
pinMode(12, OUTPUT);
pinMode(13, OUTPUT);

Serial.begin(9600);
 // Iniciar el contador 2
   OCR2A = 127;
   TCCR2A = 2;
   TCCR2B = 7;
   TIMSK2 = 2;

   sei (); // habilitar interrupciones, aunque esto ya se hace dentro del arranque de Arduino en - init()
            // y no debería ser necesario
}

// timer 2 rutina de interrupción
ISR(TIMER2_COMPA_vect)
{
   OCR2A = 127;
   oscillator();
}

//output to audio
void aWrite(byte i)
{
PORTB = PORTB & B000000;
PORTB = PORTB | i;
}

void oscillator()
{

switch(type)
{
case 0:
{
TEMP = (sinC[SIN][(int)oscCount1] );
TEMP += (sinC[SIN][(int)oscCount2] );
TEMP += (sinC[SIN][(int)oscCount3]);
if(LFOHz!=0.0)
TEMP *= (sinC[SIN][(int)lfoCount]);
break;

}

case 1:
{
TEMP = (sinC[SIN][(int)oscCount1] );
TEMP += (sinC[SIN][(int)oscCount2]);
break;
}

case 2:
{
TEMP = (sinC[SIN][(int)oscCount1] );
TEMP += (sinC[SIN][(int)oscCount2] );
TEMP += (sinC[SIN][(int)oscCount3] );
break;
}

case 3:
{
TEMP = (sinC[TRI][(int)oscCount1] );
TEMP += (sinC[TRI][(int)oscCount2] );
TEMP += (sinC[TRI][(int)oscCount3] );
if(LFOHz!=0.0)
TEMP *= (sinC[SIN][(int)lfoCount] );

break;

}

case 4:
{
TEMP = (sinC[TRI][(int)oscCount1] );
TEMP += (sinC[TRI][(int)oscCount2] );
break;
}

case 5:
{
TEMP = (sinC[SIN][(int)oscCount1] );
if(LFOHz!=0.0)
TEMP *= (sinC[SIN][(int)lfoCount] );

break;
}

case 6:
{
TEMP = (sinC[TRI][(int)oscCount1] );
if(LFOHz!=0.0)
TEMP *= (sinC[TRI][(int)lfoCount] );

break;
}

case 7:
{
TEMP = (sinC[SQUARE][(int)oscCount1] );
if(LFOHz!=0.0)
TEMP *= (sinC[SQUARE][(int)lfoCount] );

break;
}

case 8:
{
TEMP = (sinC[SQUARE][(int)oscCount1] );
TEMP -= (sinC[SQUARE][(int)oscCount2] );
TEMP += (sinC[SIN][(int)oscCount3] );
break;
}

case 9:
{
TEMP = (sinC[SIN][(int)oscCount1] );
TEMP -= (sinC[TRI][(int)oscCount2] );
TEMP += (sinC[SIN][(int)oscCount3] );
break;
}
case 10:
{
TEMP = (sinC[SAW][(int)oscCount1] );
TEMP += (sinC[SAW][(int)oscCount2] );
TEMP += (sinC[SAW][(int)oscCount3] );
break;
}
case 11:
{
TEMP = (sinC[SAW][(int)oscCount1] );
TEMP += (sinC[SAW][(int)oscCount2] );
TEMP -= (sinC[SAW][(int)oscCount3] );
break;
}
case 12:
{
TEMP = (sinC[SAW][(int)oscCount1] );
TEMP += (sinC[SAW][(int)oscCount2] );
TEMP -= (sinC[SAW][(int)oscCount3] );
if(LFOHz!=0.0)
TEMP *= (sinC[SAW][(int)lfoCount] );
break;

}
case 13:
{
TEMP = (sinC[SAW][(int)oscCount1] );
TEMP += (sinC[SAW][(int)oscCount2] );
TEMP -= (sinC[SAW][(int)oscCount3] );
if(LFOHz!=0.0)
TEMP *= (sinC[SAW][(int)lfoCount] );
break;

}

case 14:
{
TEMP = (sinC[TRI][(int)oscCount1] );
TEMP += (sinC[TRI][(int)oscCount2] );
TEMP -= (sinC[TRI][(int)oscCount3] );
if(LFOHz!=0.0)
TEMP *= (sinC[TRI][(int)lfoCount] );
break;

}
default:
{
TEMP = (sinC[SQUARE][(int)oscCount1] );
TEMP += (sinC[SQUARE][(int)oscCount2] );
TEMP += (sinC[SQUARE][(int)oscCount3] );
if(LFOHz!=0.0)
TEMP *= (sinC[SIN][(int)lfoCount] );
break;
}
}

aWrite((byte)((TEMP)*24)); //write to output

oscCount1+=globalHz1;
if(oscCount1>SINC_LENGTH)
oscCount1=0;
oscCount2+=globalHz2;
if(oscCount2>SINC_LENGTH)
oscCount2=0;
oscCount3+=globalHz3;
if(oscCount3>SINC_LENGTH)
oscCount3=0;
/*lfoCount+=LFOHz; //WTF WHERE I THINKING HERE ????
if(LFOHz>SINC_LENGTH)
LFOHz=0;
*/
lfoCount+=LFOHz;
if(lfoCount>SINC_LENGTH)
lfoCount=0;

}

void loop()
{

tempKnobs[0] =analogRead(0);
tempKnobs[1] =analogRead(1);
tempKnobs[2] =analogRead(2);
tempKnobs[3] =analogRead(3);
tempKnobs[4] =analogRead(4);
tempKnobs[5] =analogRead(5);

if(tempKnobs[0]!=oldKnobs[0])
{
//note = ((tempKnobs[0]/1024.0)*100.0);
//globalHz1 = ((440 * pow(2.0,(note-69.0)/12.0))/1562.50);

globalHz1 = ((tempKnobs[0]/1024.0)*1.70);
oldKnobs[0]=tempKnobs[0];

globalHz2 =globalHz1+ (((tempKnobs[1]/1024.0)*.25)-0.125);
globalHz3 =globalHz1+ (((tempKnobs[2]/1024.0)*.25)-0.125);

}
if(tempKnobs[1]!=oldKnobs[1])
{
globalHz2 =globalHz1+ (((tempKnobs[1]/1024.0)*.25)-0.125);
oldKnobs[1]=tempKnobs[1];
}
if(tempKnobs[2]!=oldKnobs[2])
{
globalHz3 =globalHz1+ (((tempKnobs[2]/1024.0)*.25)-0.125);
oldKnobs[2]=tempKnobs[5];
}
if(tempKnobs[3]!=oldKnobs[3])
{
LFOHz=((tempKnobs[3]/1024.0)*0.4);
oldKnobs[3]=tempKnobs[3];

}
if(tempKnobs[4]!=oldKnobs[4])
{
oldKnobs[4]=tempKnobs[4];
}
if(tempKnobs[5]!=oldKnobs[5])
{
type=tempKnobs[5]/51;// 20 modes
oldKnobs[5]=tempKnobs[5];
}

}

Los poténciometros que uso son B1M (aunque cada uno que haga sus pruebas) y el R2R DAC es el que muestran en esta web:
http://www.uchobby.com/index.php/2008/01/08/arduino-audio-dac-options/
También recordar que todo este projecto está sacado de esta web:
http://www.larsby.com/johan/?p=435

Nada más, ya nos vemos por aquí!

Logged

Spain
Offline Offline
God Member
*****
Karma: 25
Posts: 956
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Nach79
Ya podias haber dicho que eras aficionado al "guitarreo"... asi te puedo recomendar esto para experimentar
Mira este chip que tiene muchos años pero que aun asi muchos aficionados usan, yo lo probe hace años en formato cob para un diseño y era genial:
http://www.holtek.com/english/docum/consumer/8950.htm


http://youtu.be/J9nr6w5JRxE
« Last Edit: August 27, 2011, 03:54:52 pm by Heke » Logged

CUIDADO !! MIS POST NO SON APTOS PARA MENORES. SI ERES MENOR DE 14 AÑOS DEBES DE LEERLOS ACOMPAÑADO DE UN ADULTO

Pages: 1 [2] 3   Go Up
Jump to: