cool
This commit is contained in:
		
							parent
							
								
									1e4c30d62f
								
							
						
					
					
						commit
						43e3c04390
					
				
					 1 changed files with 70 additions and 18 deletions
				
			
		| 
						 | 
					@ -38,10 +38,12 @@ const unsigned char sintab[] PROGMEM = {
 | 
				
			||||||
  0x09,0x07,0x05,0x03,0x02,0x01,0x01,0x01
 | 
					  0x09,0x07,0x05,0x03,0x02,0x01,0x01,0x01
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// welches ist das nächste Sample aus der Sinustabelle
 | 
				
			||||||
volatile uint16_t sample[8];   // welches ist das nächste Sample aus der Sinustabelle
 | 
					 | 
				
			||||||
// die oberen 7 bit zeigen in die Tabelle, die restlichen 
 | 
					// die oberen 7 bit zeigen in die Tabelle, die restlichen 
 | 
				
			||||||
// bits sind kommastellen
 | 
					// bits sind kommastellen
 | 
				
			||||||
 | 
					volatile uint16_t sample[8];   
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					volatile uint8_t instrument[8]; 
 | 
				
			||||||
 | 
					
 | 
				
			||||||
uint16_t vol;               // aktuelle Lautstärke
 | 
					uint16_t vol;               // aktuelle Lautstärke
 | 
				
			||||||
volatile uint16_t set_vol;  // gewuenschte Lautstärke
 | 
					volatile uint16_t set_vol;  // gewuenschte Lautstärke
 | 
				
			||||||
| 
						 | 
					@ -51,13 +53,32 @@ volatile uint16_t tone_[8];     // Tonhöhe in "Inkrementiereinheiten"
 | 
				
			||||||
// Wert für die Tonausgabe
 | 
					// Wert für die Tonausgabe
 | 
				
			||||||
ISR(TIMER1_COMPA_vect) {
 | 
					ISR(TIMER1_COMPA_vect) {
 | 
				
			||||||
  static int timer1counter;      // Zähler um Lautstärkeänderung langsamer zu machen
 | 
					  static int timer1counter;      // Zähler um Lautstärkeänderung langsamer zu machen
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  int wert = 0;
 | 
					  int wert = 0;
 | 
				
			||||||
 | 
					  uint8_t scale = 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  // Wert an der Stelle sample1/512 aus der sinus-Tabelle lesen
 | 
					  // Wert an der Stelle sample1/512 aus der sinus-Tabelle lesen
 | 
				
			||||||
  for(int i=0; i<8; i++) {
 | 
					  for(uint8_t i=0; i<8; i++) {
 | 
				
			||||||
    wert += pgm_read_byte(&sintab[(sample[i] >> 9)]);
 | 
					    if (tone_[i] != 0) {
 | 
				
			||||||
 | 
					      
 | 
				
			||||||
 | 
					      uint8_t index = sample[i] >> 9; // 0-127
 | 
				
			||||||
 | 
					      if (instrument[i] == 0) {
 | 
				
			||||||
 | 
					        wert += pgm_read_byte(&sintab[index]);
 | 
				
			||||||
 | 
					      } else if (instrument[i] == 1) {
 | 
				
			||||||
 | 
					        wert += index*2;
 | 
				
			||||||
 | 
					      } else if (instrument[i] == 2) {
 | 
				
			||||||
 | 
					        if (index < 64) {
 | 
				
			||||||
 | 
					          wert += 0xff;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					      }      
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      scale++;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
  };
 | 
					  };
 | 
				
			||||||
  wert/=8;
 | 
					  if (scale != 0) {
 | 
				
			||||||
 | 
					    // wert/=scale;
 | 
				
			||||||
 | 
					    wert/=4;
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
  
 | 
					  
 | 
				
			||||||
  // Wert mit der aktuellen Lautstärke multiplizieren
 | 
					  // Wert mit der aktuellen Lautstärke multiplizieren
 | 
				
			||||||
  wert = (wert * vol) / 256; 
 | 
					  wert = (wert * vol) / 256; 
 | 
				
			||||||
| 
						 | 
					@ -66,7 +87,7 @@ ISR(TIMER1_COMPA_vect) {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  // nächstes Sample in der Sinustabelle abhängig vom gewünschten
 | 
					  // nächstes Sample in der Sinustabelle abhängig vom gewünschten
 | 
				
			||||||
  // Ton auswählen.
 | 
					  // Ton auswählen.
 | 
				
			||||||
  for(int i=0; i<8; i++) {
 | 
					  for(uint8_t i=0; i<8; i++) {
 | 
				
			||||||
    sample[i] += tone_[i];
 | 
					    sample[i] += tone_[i];
 | 
				
			||||||
  };
 | 
					  };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -79,6 +100,7 @@ ISR(TIMER1_COMPA_vect) {
 | 
				
			||||||
    if (vol < set_vol) vol++;
 | 
					    if (vol < set_vol) vol++;
 | 
				
			||||||
    if (vol > set_vol) vol--;
 | 
					    if (vol > set_vol) vol--;
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void startPlayback()
 | 
					void startPlayback()
 | 
				
			||||||
| 
						 | 
					@ -123,8 +145,9 @@ void startPlayback()
 | 
				
			||||||
  TIMSK1 |= _BV(OCIE1A);
 | 
					  TIMSK1 |= _BV(OCIE1A);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  // Startwerte
 | 
					  // Startwerte
 | 
				
			||||||
  for(int i=0; i<8; i++) {
 | 
					  for(uint8_t i=0; i<8; i++) {
 | 
				
			||||||
    sample[i] = 0;
 | 
					    sample[i] = 0;
 | 
				
			||||||
 | 
					    tone_[i] = 0;
 | 
				
			||||||
  }   
 | 
					  }   
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  // Global Interrupts wieder einschalten.
 | 
					  // Global Interrupts wieder einschalten.
 | 
				
			||||||
| 
						 | 
					@ -133,23 +156,52 @@ void startPlayback()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void setup()                    
 | 
					void setup()                    
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
 | 
					  Serial.begin(9600);
 | 
				
			||||||
  startPlayback();
 | 
					  startPlayback();
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include "pitches.h"
 | 
					#include "pitches.h"
 | 
				
			||||||
void loop()                    
 | 
					void loop()                    
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
   set_vol = 80;
 | 
					   set_vol = 128;
 | 
				
			||||||
   
 | 
					   
 | 
				
			||||||
   for(int counter = 1; counter<256; counter++) {
 | 
					   #define BLA(t) (2*(128ul*512ul*(t))/8000)
 | 
				
			||||||
     #define BLA ((128ul*512ul)/8000)
 | 
					
 | 
				
			||||||
     tone_[0] = (counter & _BV(0))?(NOTE_C4*BLA):0;  
 | 
					   instrument[0] = 2;
 | 
				
			||||||
     tone_[1] = (counter & _BV(1))?(NOTE_A3*BLA):0;
 | 
					   instrument[1] = 2;
 | 
				
			||||||
     tone_[2] = (counter & _BV(2))?(NOTE_F3*BLA):0;
 | 
					   instrument[2] = 0;
 | 
				
			||||||
     tone_[3] = (counter & _BV(2))?(NOTE_D3*BLA):0; 
 | 
					   instrument[3] = 0;
 | 
				
			||||||
     tone_[4] = (counter & _BV(2))?(NOTE_B2*BLA):0;
 | 
					   instrument[4] = 0;
 | 
				
			||||||
     tone_[5] = (counter & _BV(2))?(NOTE_G2*BLA):0;
 | 
					   instrument[5] = 1;
 | 
				
			||||||
     tone_[6] = (counter & _BV(2))?(NOTE_E2*BLA):0;
 | 
					   instrument[6] = 1;
 | 
				
			||||||
     tone_[7] = (counter & _BV(2))?(NOTE_C2*BLA):0;
 | 
					   instrument[7] = 1;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					   
 | 
				
			||||||
 | 
					   for(int counter = 0; counter<256; counter++) {
 | 
				
			||||||
 | 
					     Serial.println(counter, BIN);
 | 
				
			||||||
 | 
					     
 | 
				
			||||||
 | 
					     tone_[0] = (counter & _BV(0))?BLA(NOTE_C4):0;  
 | 
				
			||||||
 | 
					     tone_[1] = (counter & _BV(1))?BLA(NOTE_A3):0;
 | 
				
			||||||
 | 
					     tone_[2] = (counter & _BV(2))?BLA(NOTE_F3):0;
 | 
				
			||||||
 | 
					     tone_[3] = (counter & _BV(3))?BLA(NOTE_D3):0; 
 | 
				
			||||||
 | 
					     tone_[4] = (counter & _BV(4))?BLA(NOTE_B2):0;
 | 
				
			||||||
 | 
					     tone_[5] = (counter & _BV(5))?BLA(NOTE_G2):0;
 | 
				
			||||||
 | 
					     tone_[6] = (counter & _BV(6))?BLA(NOTE_E2):0;
 | 
				
			||||||
 | 
					     tone_[7] = (counter & _BV(7))?BLA(NOTE_C2):0;
 | 
				
			||||||
 | 
					     
 | 
				
			||||||
 | 
					     _delay_ms(200);
 | 
				
			||||||
   }     
 | 
					   }     
 | 
				
			||||||
 | 
					   
 | 
				
			||||||
 | 
					   // fading away...
 | 
				
			||||||
 | 
					   if (set_vol>0) {
 | 
				
			||||||
 | 
					     set_vol--;
 | 
				
			||||||
 | 
					   }
 | 
				
			||||||
 | 
					   
 | 
				
			||||||
 | 
					   /* test code */
 | 
				
			||||||
 | 
					   /*
 | 
				
			||||||
 | 
					   tone_[0] = BLA(NOTE_C4);
 | 
				
			||||||
 | 
					   _delay_ms(500);
 | 
				
			||||||
 | 
					   tone_[0] = BLA(NOTE_C2);
 | 
				
			||||||
 | 
					   _delay_ms(500);
 | 
				
			||||||
 | 
					   */
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Reference in a new issue