An example how to play RSF files from EEPROM (Arduino example)
The structure of image in EEPROM
offset size description 0 1 byte number of melodies 1 2 bytes offset from file start to first melody 3 2 bytes melody 1 frames count 5 2 bytes offset from file start to melody 2 7 2 bytes melody 2 frames count .......... X 2 bytes offset from file start to melody N X 2 bytes melody N frames count X RSF file 1 content X RSF file 2 content X RSF file 3 content ........... X RSF file N content
Initialization and play
Wire.begin(); songs = readEEPROM(disk1, 0); Serial.begin(19200); // 57600 для версий 14.0+ for(int i=0; i<songs; i++) playsong(i);
Functions
byte readEEPROM(int deviceaddress, unsigned int eeaddress )
{
byte rdata = 0;
Wire.beginTransmission(deviceaddress);
Wire.write((int)(eeaddress >> 8)); // MSB
Wire.write((int)(eeaddress & 0xFF)); // LSB
Wire.endTransmission();
Wire.requestFrom(deviceaddress,1);
if (Wire.available()) rdata = Wire.read();
return rdata;
}
PlaySong Function for versions up to 13.2
void playsong(byte num)
{
int offset = readEEPROM(disk1, 1 + num*4) + readEEPROM(disk1, 1 + num*4 + 1)*256;
int frames = readEEPROM(disk1, 1 + num*4 + 2) + readEEPROM(disk1, 1 + num*4 + 3)*256;
offset += 16; //RSF header
int frame = 0;
byte tmp;
byte writebuf[16];
memset(writebuf,0,14);
writebuf[14] = 0x80;
writebuf[15] = 0x7F;
unsigned int tmp2, skip;
while( frame < frames )
{
skip = 1;
tmp = readEEPROM(disk1, offset++);
if(tmp == 0xFE)
{
tmp = readEEPROM(disk1, offset++);
skip = tmp * 16;
}
else if(tmp == 0xFD)
{
tmp = readEEPROM(disk1, offset++);
skip = tmp * 2;
}
else if(tmp != 0xFF)
{
tmp2 = tmp * 256;
tmp2 += readEEPROM(disk1, offset++);
byte reg = 0;
writebuf[13] = 0xFF;
while(tmp2 > 0 && reg < 14)
{
if(tmp2 & 1 == 1)
{
writebuf[reg] = readEEPROM(disk1, offset++);
}
tmp2 >>= 1;
reg++;
}
Serial.write(writebuf,16);
}
for(int i = 1; i <= skip; i++) delay(20);
frame += skip;
}
//stop
memset(writebuf,0,14);
writebuf[7] = 63;
Serial.write(writebuf,16);
}
PlaySong Function for versions 14.0+ (not checked)
void playsong(byte num)
{
int offset = readEEPROM(disk1, 1 + num*4) + readEEPROM(disk1, 1 + num*4 + 1)*256;
int frames = readEEPROM(disk1, 1 + num*4 + 2) + readEEPROM(disk1, 1 + num*4 + 3)*256;
offset += 16; //RSF header
int frame = 0;
byte tmp, tmp3;
byte writebuf[16];
//mute
memset(writebuf,0,14);
writebuf[7] = 63;
for(int i = 0; i <14; i++) {
Serial.write(i,1);
Serial.write(writebuf[i],1);
}
memset(writebuf,0,14);
writebuf[13] = 0xFF;
Serial.write(writebuf[13],1); // to synchronize
unsigned int tmp2, skip;
while( frame < frames )
{
skip = 1;
tmp = readEEPROM(disk1, offset++);
if(tmp == 0xFE)
{
tmp = readEEPROM(disk1, offset++);
skip = tmp * 16;
}
else if(tmp == 0xFD)
{
tmp = readEEPROM(disk1, offset++);
skip = tmp * 2;
}
else if(tmp != 0xFF)
{
tmp2 = tmp * 256;
tmp2 += readEEPROM(disk1, offset++);
byte reg = 0;
while(tmp2 > 0 && reg < 14)
{
if(tmp2 & 1 == 1)
{
tmp3 = readEEPROM(disk1, offset++);
if(writebuf[reg] != tmp3)
{
writebuf[reg] = tmp3;
if(!(reg==13 && tmp3==0xFF))
{
Serial.write(reg,1);
Serial.write(tmp3,1);
}
}
}
tmp2 >>= 1;
reg++;
}
}
for(int i = 1; i <= skip; i++) delay(20);
frame += skip;
}
//mute
memset(writebuf,0,14);
writebuf[7] = 63;
for(int i = 0; i <14; i++) {
Serial.write(i,1);
Serial.write(writebuf[i],1);
}
}
[ad name="HTML"]