コンピュータやソフトウェアのあれこれ@道民(&元道民)
Arduino
Arduinoでドレミファソラシド(3)
6月 26th
さっそく、バージョンアップしました。
といっても、前回のバージョンは公開していませんが。
※注意事項
2kΩの抵抗を挿んで試してね!
Digital 11 と Digital 3 にスピーカーを接続すると音がでます。
以下、添付ファイルと解説添付ファイル(ダウンロード)
20100626-Sine8mk2.zip
今回は、見た目をすっきりさせて、
和音が鳴るシーケンス形式も実装しました。
が、まだまだ安定していないし、1オクターブ分しか鳴らせないので、
いろいろ考え中です。
特に、*.pdeファイルについては、まだ試行錯誤しています。
今年の目標は、これで達成ということで。
といっても、前回のバージョンは公開していませんが。
※注意事項
2kΩの抵抗を挿んで試してね!
Digital 11 と Digital 3 にスピーカーを接続すると音がでます。
以下、添付ファイルと解説添付ファイル(ダウンロード)
20100626-Sine8mk2.zip
今回は、見た目をすっきりさせて、
和音が鳴るシーケンス形式も実装しました。
が、まだまだ安定していないし、1オクターブ分しか鳴らせないので、
いろいろ考え中です。
特に、*.pdeファイルについては、まだ試行錯誤しています。
今年の目標は、これで達成ということで。
Arduinoでドレミファソラシド(2)
6月 21st
ついに和音がでました!
一応、ソースを上げときます。
※注意事項
2kΩの抵抗を挿んで試してね!
Digital 11 と Digital 3 にスピーカーを接続すると音がでます。
以下、ソースコード。
#include "avr/io.h"
#define POLY_MAX 8
struct OSC {
byte note;
byte gate;
const char *pWave;
unsigned long index;
};
struct {
byte bpm;
unsigned long offset;
unsigned long index;
} bpm_info;
const char sinwav[] = {
-7, -6, -5, -4, -3, -2, -1, 0, 1, 2, 3, 4, 5, 6, 7, 7,
7, 6, 5, 4, 3, 2, 1, 0, -1, -2, -3, -4, -5, -6, -7, -7
// 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
//-7,-7,-7,-7,-7,-7,-7,-7,-7,-7,-7,-7,-7,-7,-7,-7
};
// [0] = 0, [1] = A(220Hz) -> [12] = A(440Hz)
unsigned long noteOffset[14];
const byte seq[][2] = {
{ 1,16},
{ 3, 2},
{ 5,16},
{ 6, 2},
{ 8,16},
{10, 2},
{12, 2},
{13, 2}
};
byte seqIdx = 0;
byte beatIdx = 0;
OSC osc[POLY_MAX];
namespace {
inline char oscInc(OSC *pOsc)
{
const unsigned long inc = noteOffset[ pOsc->note ];
pOsc->index += inc;
//return ((pOsc->index >> 24) & 0x1F) < 16 ? -16 : 16;
return pOsc->pWave[ ((pOsc->index >> 24) & 0x1F) ] * 2;
}
};
ISR ( TIMER0_COMPA_vect ) {
volatile byte i;
volatile short outVol;
// if ( move 1/8 -> beat++ )
bpm_info.index += bpm_info.offset;
if ( bpm_info.index & (unsigned long)0x00200000 ) {
if ( (beatIdx & 0x01) == (byte)0 ) {
// assign note
for (i=0; i<POLY_MAX; i++) {
if ( osc[i].note == (byte)0 ) {
osc[i].note = seq[seqIdx][0];
osc[i].gate = seq[seqIdx][1];
break;
}
}
seqIdx = ( (seqIdx + 1) & 0x07 );
}
for (i=0; i<POLY_MAX; i++) {
if ( (byte)0 < osc[i].gate ) {
osc[i].gate--;
if ( osc[i].gate == (byte)0 ) {
osc[i].note = 0;
}
}
}
bpm_info.index -= (unsigned long)0x00200000;
beatIdx = ( (beatIdx + 1) & 0x0F );
}
// LED toggle
if ( (beatIdx & 0x01) == (byte)0 ) {
digitalWrite( 13, HIGH );
}
// Mix osc output
outVol = 0;
for (i=0; i<POLY_MAX; i++) {
if ( osc[i].note != (byte)0 ) {
outVol += (short)( oscInc( &(osc[i]) ) );
}
}
// PWM Output
if ( (short)0 < outVol ) {
OCR2A = (byte)( outVol);
OCR2B = (byte)0;
}
else if ( outVol < (short)0 ) {
OCR2A = (byte)0;
OCR2B = (byte)(-outVol);
}
else {
OCR2A = (byte)0;
OCR2B = (byte)0;
}
}
void setup() {
TCCR0A = 0b00000010; // CTC
TCCR0B = 0b00000010; // 1/8
OCR0A = 125;
TIMSK0 = 0b00000010;
// PWM Setting
TCCR2A = 0b10100011; // Fast PWM
TCCR2B = 0b00000001; // 1/1
OCR2A = 0;
pinMode(11, OUTPUT); // Speker out +
pinMode(3, OUTPUT); // Speker out -(GND)
pinMode(13, OUTPUT);
digitalWrite( 13, LOW );
{ // Init osc
byte i;
for (i=0; i<POLY_MAX; i++) {
osc[i].note = 0;
osc[i].index = 0;
osc[i].pWave = sinwav;
}
}
{ // Hz -> offset
byte i;
// 1Hz : 1 * 0x01000000 / ( 125 * 8 * (1/16M) )
// 1/16000 = 1/16M * 1000(= 125 *8)
// wave size : 32
noteOffset[ 0] = 0;
noteOffset[ 1] = ( (unsigned long)( 220 * 32 * (0x01000000 >> 7)) / (16000 >> 7) );
noteOffset[ 2] = ( (unsigned long)( 233 * 32 * (0x01000000 >> 7)) / (16000 >> 7) );
noteOffset[ 3] = ( (unsigned long)( 247 * 32 * (0x01000000 >> 7)) / (16000 >> 7) );
noteOffset[ 4] = ( (unsigned long)( 261 * 32 * (0x01000000 >> 7)) / (16000 >> 7) );
noteOffset[ 5] = ( (unsigned long)( 277 * 32 * (0x01000000 >> 7)) / (16000 >> 7) );
noteOffset[ 6] = ( (unsigned long)( 293 * 32 * (0x01000000 >> 7)) / (16000 >> 7) );
noteOffset[ 7] = ( (unsigned long)( 311 * 32 * (0x01000000 >> 7)) / (16000 >> 7) );
noteOffset[ 8] = ( (unsigned long)( 329 * 32 * (0x01000000 >> 7)) / (16000 >> 7) );
noteOffset[ 9] = ( (unsigned long)( 349 * 32 * (0x01000000 >> 7)) / (16000 >> 7) );
noteOffset[10] = ( (unsigned long)( 370 * 32 * (0x01000000 >> 7)) / (16000 >> 7) );
noteOffset[11] = ( (unsigned long)( 392 * 32 * (0x01000000 >> 7)) / (16000 >> 7) );
noteOffset[12] = ( (unsigned long)( 415 * 32 * (0x01000000 >> 7)) / (16000 >> 7) );
noteOffset[13] = ( (unsigned long)( 440 * 32 * (0x01000000 >> 7)) / (16000 >> 7) );
}
{ // BPM Setting
bpm_info.bpm = 60;
// 1Hz : 1 * 0x01000000 / ( 125 * 8 * (1/16M) )
// 1/16000 = 1/16M * 1000(= 125 *8)
// BPS = BPM / 60
bpm_info.offset = ( (unsigned long)( bpm_info.bpm * (0x01000000 >> 6)) / (60 * (16000 >> 6)) );
bpm_info.index = 0x00400000; // dummy offset
}
TCNT0 = 0;
sei();
}
void loop() {
while (1) {
digitalWrite( 13, LOW );
}
}
一応、ソースを上げときます。
※注意事項
2kΩの抵抗を挿んで試してね!
Digital 11 と Digital 3 にスピーカーを接続すると音がでます。
以下、ソースコード。
#include "avr/io.h"
#define POLY_MAX 8
struct OSC {
byte note;
byte gate;
const char *pWave;
unsigned long index;
};
struct {
byte bpm;
unsigned long offset;
unsigned long index;
} bpm_info;
const char sinwav[] = {
-7, -6, -5, -4, -3, -2, -1, 0, 1, 2, 3, 4, 5, 6, 7, 7,
7, 6, 5, 4, 3, 2, 1, 0, -1, -2, -3, -4, -5, -6, -7, -7
// 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
//-7,-7,-7,-7,-7,-7,-7,-7,-7,-7,-7,-7,-7,-7,-7,-7
};
// [0] = 0, [1] = A(220Hz) -> [12] = A(440Hz)
unsigned long noteOffset[14];
const byte seq[][2] = {
{ 1,16},
{ 3, 2},
{ 5,16},
{ 6, 2},
{ 8,16},
{10, 2},
{12, 2},
{13, 2}
};
byte seqIdx = 0;
byte beatIdx = 0;
OSC osc[POLY_MAX];
namespace {
inline char oscInc(OSC *pOsc)
{
const unsigned long inc = noteOffset[ pOsc->note ];
pOsc->index += inc;
//return ((pOsc->index >> 24) & 0x1F) < 16 ? -16 : 16;
return pOsc->pWave[ ((pOsc->index >> 24) & 0x1F) ] * 2;
}
};
ISR ( TIMER0_COMPA_vect ) {
volatile byte i;
volatile short outVol;
// if ( move 1/8 -> beat++ )
bpm_info.index += bpm_info.offset;
if ( bpm_info.index & (unsigned long)0x00200000 ) {
if ( (beatIdx & 0x01) == (byte)0 ) {
// assign note
for (i=0; i<POLY_MAX; i++) {
if ( osc[i].note == (byte)0 ) {
osc[i].note = seq[seqIdx][0];
osc[i].gate = seq[seqIdx][1];
break;
}
}
seqIdx = ( (seqIdx + 1) & 0x07 );
}
for (i=0; i<POLY_MAX; i++) {
if ( (byte)0 < osc[i].gate ) {
osc[i].gate--;
if ( osc[i].gate == (byte)0 ) {
osc[i].note = 0;
}
}
}
bpm_info.index -= (unsigned long)0x00200000;
beatIdx = ( (beatIdx + 1) & 0x0F );
}
// LED toggle
if ( (beatIdx & 0x01) == (byte)0 ) {
digitalWrite( 13, HIGH );
}
// Mix osc output
outVol = 0;
for (i=0; i<POLY_MAX; i++) {
if ( osc[i].note != (byte)0 ) {
outVol += (short)( oscInc( &(osc[i]) ) );
}
}
// PWM Output
if ( (short)0 < outVol ) {
OCR2A = (byte)( outVol);
OCR2B = (byte)0;
}
else if ( outVol < (short)0 ) {
OCR2A = (byte)0;
OCR2B = (byte)(-outVol);
}
else {
OCR2A = (byte)0;
OCR2B = (byte)0;
}
}
void setup() {
TCCR0A = 0b00000010; // CTC
TCCR0B = 0b00000010; // 1/8
OCR0A = 125;
TIMSK0 = 0b00000010;
// PWM Setting
TCCR2A = 0b10100011; // Fast PWM
TCCR2B = 0b00000001; // 1/1
OCR2A = 0;
pinMode(11, OUTPUT); // Speker out +
pinMode(3, OUTPUT); // Speker out -(GND)
pinMode(13, OUTPUT);
digitalWrite( 13, LOW );
{ // Init osc
byte i;
for (i=0; i<POLY_MAX; i++) {
osc[i].note = 0;
osc[i].index = 0;
osc[i].pWave = sinwav;
}
}
{ // Hz -> offset
byte i;
// 1Hz : 1 * 0x01000000 / ( 125 * 8 * (1/16M) )
// 1/16000 = 1/16M * 1000(= 125 *8)
// wave size : 32
noteOffset[ 0] = 0;
noteOffset[ 1] = ( (unsigned long)( 220 * 32 * (0x01000000 >> 7)) / (16000 >> 7) );
noteOffset[ 2] = ( (unsigned long)( 233 * 32 * (0x01000000 >> 7)) / (16000 >> 7) );
noteOffset[ 3] = ( (unsigned long)( 247 * 32 * (0x01000000 >> 7)) / (16000 >> 7) );
noteOffset[ 4] = ( (unsigned long)( 261 * 32 * (0x01000000 >> 7)) / (16000 >> 7) );
noteOffset[ 5] = ( (unsigned long)( 277 * 32 * (0x01000000 >> 7)) / (16000 >> 7) );
noteOffset[ 6] = ( (unsigned long)( 293 * 32 * (0x01000000 >> 7)) / (16000 >> 7) );
noteOffset[ 7] = ( (unsigned long)( 311 * 32 * (0x01000000 >> 7)) / (16000 >> 7) );
noteOffset[ 8] = ( (unsigned long)( 329 * 32 * (0x01000000 >> 7)) / (16000 >> 7) );
noteOffset[ 9] = ( (unsigned long)( 349 * 32 * (0x01000000 >> 7)) / (16000 >> 7) );
noteOffset[10] = ( (unsigned long)( 370 * 32 * (0x01000000 >> 7)) / (16000 >> 7) );
noteOffset[11] = ( (unsigned long)( 392 * 32 * (0x01000000 >> 7)) / (16000 >> 7) );
noteOffset[12] = ( (unsigned long)( 415 * 32 * (0x01000000 >> 7)) / (16000 >> 7) );
noteOffset[13] = ( (unsigned long)( 440 * 32 * (0x01000000 >> 7)) / (16000 >> 7) );
}
{ // BPM Setting
bpm_info.bpm = 60;
// 1Hz : 1 * 0x01000000 / ( 125 * 8 * (1/16M) )
// 1/16000 = 1/16M * 1000(= 125 *8)
// BPS = BPM / 60
bpm_info.offset = ( (unsigned long)( bpm_info.bpm * (0x01000000 >> 6)) / (60 * (16000 >> 6)) );
bpm_info.index = 0x00400000; // dummy offset
}
TCNT0 = 0;
sei();
}
void loop() {
while (1) {
digitalWrite( 13, LOW );
}
}
Arduinoでドレミファソラシド(1)
6月 20th
やっと出来ました、ここまで。
あとは、波形と精度の問題かな。
その先は、来年の課題ということで。
※注意事項
2kΩの抵抗を挿んで試してね!
音が小さいときは、byte oscInc(OSC *pOsc)の戻り値に8を掛けてください。
Digital 11 と GND にスピーカーを接続すると音がでます。
以下、ソースコード。
#include "avr/io.h"
#define POLY_MAX 8
struct OSC {
byte note;
const byte *pWave;
unsigned long index;
};
struct {
byte bpm;
unsigned long offset;
unsigned long index;
} bpm_info;
const byte sinwav[] = {
1, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 14,
14, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 1
};
// [0] = 0, [1] = A(220Hz) -> [12] = A(440Hz)
unsigned long noteOffset[14];
const byte seq[] = {
1, 3, 5, 6, 8, 10, 12, 13,
13, 12, 10, 8, 6, 5, 3, 1 };
byte seqIdx = 0;
OSC osc[POLY_MAX];
namespace {
inline byte oscInc(OSC *pOsc)
{
const unsigned long inc = noteOffset[ pOsc->note ];
pOsc->index += inc;
//return ((pOsc->index >> 24) & 0x1F) < 16 ? (byte)0 : (byte)255;
return pOsc->pWave[ ((pOsc->index >> 24) & 0x1F) ];
}
};
ISR ( TIMER0_COMPA_vect ) {
volatile byte i;
volatile byte outVol;
// if ( move 1/4 -> next seq )
bpm_info.index += bpm_info.offset;
if ( bpm_info.index & (unsigned long)0x00400000 ) {
#if 0
// assign note
for (i=0; i<POLY_MAX; i++) {
if ( osc[i].note == (byte)0 ) {
osc[i].note = seq[seqIdx];
break;
}
}
#else
osc[0].note = seq[seqIdx];
#endif
bpm_info.index -= (unsigned long)0x00400000;
seqIdx = ( (seqIdx + 1) & 0x0F );
}
// LED toggle
if ( (bpm_info.index & (unsigned long)0x00200000) == 0 ) {
digitalWrite( 13, HIGH );
}
// Mix osc output
outVol = 0;
for (i=0; i<POLY_MAX; i++) {
if ( osc[i].note != (byte)0 ) {
outVol += oscInc( &(osc[i]) );
}
}
// PWM Output
OCR2A = outVol;
}
void setup() {
TCCR0A = 0b00000010; // CTC
TCCR0B = 0b00000010; // 1/8
OCR0A = 125;
TIMSK0 = 0b00000010;
// PWM Setting
TCCR2A = 0b10100011; // Fast PWM
TCCR2B = 0b00000001; // 1/1
OCR2A = 0;
pinMode(11, OUTPUT);
pinMode(13, OUTPUT);
digitalWrite( 13, LOW );
{ // Init osc
byte i;
for (i=0; i<POLY_MAX; i++) {
osc[i].note = 0;
osc[i].index = 0;
osc[i].pWave = sinwav;
}
}
{ // Hz -> offset
byte i;
// 1Hz : 1 * 0x01000000 / ( 125 * 8 * (1/16M) )
// 1/16000 = 1/16M * 1000(= 125 *8)
// wave size : 32
noteOffset[ 0] = 0;
noteOffset[ 1] = ( (unsigned long)( 220 * 32 * (0x01000000 >> 7)) / (16000 >> 7) );
noteOffset[ 2] = ( (unsigned long)( 233 * 32 * (0x01000000 >> 7)) / (16000 >> 7) );
noteOffset[ 3] = ( (unsigned long)( 247 * 32 * (0x01000000 >> 7)) / (16000 >> 7) );
noteOffset[ 4] = ( (unsigned long)( 261 * 32 * (0x01000000 >> 7)) / (16000 >> 7) );
noteOffset[ 5] = ( (unsigned long)( 277 * 32 * (0x01000000 >> 7)) / (16000 >> 7) );
noteOffset[ 6] = ( (unsigned long)( 293 * 32 * (0x01000000 >> 7)) / (16000 >> 7) );
noteOffset[ 7] = ( (unsigned long)( 311 * 32 * (0x01000000 >> 7)) / (16000 >> 7) );
noteOffset[ 8] = ( (unsigned long)( 329 * 32 * (0x01000000 >> 7)) / (16000 >> 7) );
noteOffset[ 9] = ( (unsigned long)( 349 * 32 * (0x01000000 >> 7)) / (16000 >> 7) );
noteOffset[10] = ( (unsigned long)( 370 * 32 * (0x01000000 >> 7)) / (16000 >> 7) );
noteOffset[11] = ( (unsigned long)( 392 * 32 * (0x01000000 >> 7)) / (16000 >> 7) );
noteOffset[12] = ( (unsigned long)( 415 * 32 * (0x01000000 >> 7)) / (16000 >> 7) );
noteOffset[13] = ( (unsigned long)( 440 * 32 * (0x01000000 >> 7)) / (16000 >> 7) );
}
{ // BPM Setting
bpm_info.bpm = 120;
// 1Hz : 1 * 0x01000000 / ( 125 * 8 * (1/16M) )
// 1/16000 = 1/16M * 1000(= 125 *8)
// BPS = BPM / 60
bpm_info.offset = ( (unsigned long)( bpm_info.bpm * (0x01000000 >> 6)) / (60 * (16000 >> 6)) );
bpm_info.index = 0x00400000; // dummy offset
}
TCNT0 = 0;
sei();
}
void loop() {
while (1) {
digitalWrite( 13, LOW );
}
}
あとは、波形と精度の問題かな。
その先は、来年の課題ということで。
※注意事項
2kΩの抵抗を挿んで試してね!
音が小さいときは、byte oscInc(OSC *pOsc)の戻り値に8を掛けてください。
Digital 11 と GND にスピーカーを接続すると音がでます。
以下、ソースコード。
#include "avr/io.h"
#define POLY_MAX 8
struct OSC {
byte note;
const byte *pWave;
unsigned long index;
};
struct {
byte bpm;
unsigned long offset;
unsigned long index;
} bpm_info;
const byte sinwav[] = {
1, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 14,
14, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 1
};
// [0] = 0, [1] = A(220Hz) -> [12] = A(440Hz)
unsigned long noteOffset[14];
const byte seq[] = {
1, 3, 5, 6, 8, 10, 12, 13,
13, 12, 10, 8, 6, 5, 3, 1 };
byte seqIdx = 0;
OSC osc[POLY_MAX];
namespace {
inline byte oscInc(OSC *pOsc)
{
const unsigned long inc = noteOffset[ pOsc->note ];
pOsc->index += inc;
//return ((pOsc->index >> 24) & 0x1F) < 16 ? (byte)0 : (byte)255;
return pOsc->pWave[ ((pOsc->index >> 24) & 0x1F) ];
}
};
ISR ( TIMER0_COMPA_vect ) {
volatile byte i;
volatile byte outVol;
// if ( move 1/4 -> next seq )
bpm_info.index += bpm_info.offset;
if ( bpm_info.index & (unsigned long)0x00400000 ) {
#if 0
// assign note
for (i=0; i<POLY_MAX; i++) {
if ( osc[i].note == (byte)0 ) {
osc[i].note = seq[seqIdx];
break;
}
}
#else
osc[0].note = seq[seqIdx];
#endif
bpm_info.index -= (unsigned long)0x00400000;
seqIdx = ( (seqIdx + 1) & 0x0F );
}
// LED toggle
if ( (bpm_info.index & (unsigned long)0x00200000) == 0 ) {
digitalWrite( 13, HIGH );
}
// Mix osc output
outVol = 0;
for (i=0; i<POLY_MAX; i++) {
if ( osc[i].note != (byte)0 ) {
outVol += oscInc( &(osc[i]) );
}
}
// PWM Output
OCR2A = outVol;
}
void setup() {
TCCR0A = 0b00000010; // CTC
TCCR0B = 0b00000010; // 1/8
OCR0A = 125;
TIMSK0 = 0b00000010;
// PWM Setting
TCCR2A = 0b10100011; // Fast PWM
TCCR2B = 0b00000001; // 1/1
OCR2A = 0;
pinMode(11, OUTPUT);
pinMode(13, OUTPUT);
digitalWrite( 13, LOW );
{ // Init osc
byte i;
for (i=0; i<POLY_MAX; i++) {
osc[i].note = 0;
osc[i].index = 0;
osc[i].pWave = sinwav;
}
}
{ // Hz -> offset
byte i;
// 1Hz : 1 * 0x01000000 / ( 125 * 8 * (1/16M) )
// 1/16000 = 1/16M * 1000(= 125 *8)
// wave size : 32
noteOffset[ 0] = 0;
noteOffset[ 1] = ( (unsigned long)( 220 * 32 * (0x01000000 >> 7)) / (16000 >> 7) );
noteOffset[ 2] = ( (unsigned long)( 233 * 32 * (0x01000000 >> 7)) / (16000 >> 7) );
noteOffset[ 3] = ( (unsigned long)( 247 * 32 * (0x01000000 >> 7)) / (16000 >> 7) );
noteOffset[ 4] = ( (unsigned long)( 261 * 32 * (0x01000000 >> 7)) / (16000 >> 7) );
noteOffset[ 5] = ( (unsigned long)( 277 * 32 * (0x01000000 >> 7)) / (16000 >> 7) );
noteOffset[ 6] = ( (unsigned long)( 293 * 32 * (0x01000000 >> 7)) / (16000 >> 7) );
noteOffset[ 7] = ( (unsigned long)( 311 * 32 * (0x01000000 >> 7)) / (16000 >> 7) );
noteOffset[ 8] = ( (unsigned long)( 329 * 32 * (0x01000000 >> 7)) / (16000 >> 7) );
noteOffset[ 9] = ( (unsigned long)( 349 * 32 * (0x01000000 >> 7)) / (16000 >> 7) );
noteOffset[10] = ( (unsigned long)( 370 * 32 * (0x01000000 >> 7)) / (16000 >> 7) );
noteOffset[11] = ( (unsigned long)( 392 * 32 * (0x01000000 >> 7)) / (16000 >> 7) );
noteOffset[12] = ( (unsigned long)( 415 * 32 * (0x01000000 >> 7)) / (16000 >> 7) );
noteOffset[13] = ( (unsigned long)( 440 * 32 * (0x01000000 >> 7)) / (16000 >> 7) );
}
{ // BPM Setting
bpm_info.bpm = 120;
// 1Hz : 1 * 0x01000000 / ( 125 * 8 * (1/16M) )
// 1/16000 = 1/16M * 1000(= 125 *8)
// BPS = BPM / 60
bpm_info.offset = ( (unsigned long)( bpm_info.bpm * (0x01000000 >> 6)) / (60 * (16000 >> 6)) );
bpm_info.index = 0x00400000; // dummy offset
}
TCNT0 = 0;
sei();
}
void loop() {
while (1) {
digitalWrite( 13, LOW );
}
}