添加一些关于midi播放的项目

This commit is contained in:
terryLP 2025-03-24 14:30:56 +08:00
parent e31eb22077
commit 498b4ef13b
699 changed files with 186162 additions and 1 deletions

View File

@ -0,0 +1,5 @@
*.mid
.DS_Store
sequence.h
*.json

View File

@ -0,0 +1,8 @@
The MIT License (MIT)
Copyright (c) 2016 ilufang
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

View File

@ -0,0 +1,45 @@
Arduino MIDI Player
===================
This program plays MIDI music on Arduino by generating analog/PWM waves on a port connected to a speaker/buzzer. We use timer 2 to do direct digital synthesis (DDS).
Features
--------
- **Chords/multiple notes!** The DDS can add multiple waves together on a single timer and single port. Unlike `tone()` which you can only run one frequency at any time.
- **Sine waves!** You can define any arbitrary function/wave sample to use as the instrument in `smf2seq.js`. No more square waves of the built-in `tone()` function.
- **Tested on UNO!** Though it might not work directly on other models, after some modification the concept should work on any Arduino. (since UNO is the crappiest model)
How to use
----------
**Hardware**
1. Connect buzzer/speaker to PWM port 11. Use a proper resister.
2. A variable-resistance resister is recommended to adjust the volume.
3. (Optional) Connect LEDs to port 2-7.
4. Ground everything.
**Software**
1. Place your `.mid` file under the main directory
2. Run `node smf2seq.js <your_midi_song.mid>` to generate `sequence.h` (You will need to install node.js if you don't have one)
3. Open `arduino-midi-player.ino` in Arduino IDE
4. Compile & Upload
Limitations
-----------
Due to the hardware of Arduino, your MIDI might not work perfectly. (Apparently an Arduino UNO will NEVER be able to handle a black MIDI)
- **Large files.** The max internal storage is 32KB and `smf2seq.js` use 6 bytes for each note.
- **Short time intervals/High BPM.** 1/2048 notes will not likely to play because of the internal clock
- **High/Low pitches.** The clock might not be fast enough to generate a desired wave of the specified frequency
- **Complex chords.** The clock interrupt cannot only process a limit number (4-6) of notes within the clock interval. Lower notes that exceed the limit of `KEYBUF_SIZE` will be discarded
- **Instruments.** MIDI instruments will be disregarded and everything will be sine waves
Notes
-----
- macros like `sbi`, `cbi`, `OCR2A` are used instead of API functions like `digitalWrite` to improve performance. Google them for more details

View File

@ -0,0 +1,135 @@
/*
* Arduino MIDI Player
*
* Setup Arduino and use timer2 to synthesize and output sine wave
*
* 2016 by ilufang
*/
/*
* Part of this file contains code modified/referenced from
* http://interface.khm.de/index.php/lab/interfaces-advanced/arduino-dds-sinewave-generator/
*
* DDS Sine Generator mit ATMEGS 168
* Timer2 generates the 31250 KHz Clock Interrupt
*
* KHM 2009 / Martin Nawrath
* Kunsthochschule fuer Medien Koeln
* Academy of Media Arts Cologne
*/
#include "avr/pgmspace.h"
#include "midi2wave.h"
#define cbi(sfr, bit) (_SFR_BYTE(sfr) &= ~_BV(bit))
#define sbi(sfr, bit) (_SFR_BYTE(sfr) |= _BV(bit))
#define POW2_32 4294967296
#define refclk 31376.6 // Reference clock
// variables in interrupt service
volatile int timer_tick = 0; // seeking position in wave
volatile unsigned char timer_micro = 0; // timing counter in microseconds
volatile unsigned short timer_milli = 0; // timing counter in milliseconds
volatile unsigned long phaccu_1, phaccu_2, phaccu_3, phaccu_4, phaccu_5, phaccu_6, phaccu_7, phaccu_8; // phase accumulator
volatile unsigned long tword_m_1, tword_m_2, tword_m_3, tword_m_4, tword_m_5, tword_m_6, tword_m_7, tword_m_8; // DDS tuning word m
unsigned long phaccu_all;
void setup()
{
Serial.begin(9600);
Serial.println("Hello");
for (int i = 2; i <= 8; ++i)
pinMode(i,OUTPUT); // LED output
pinMode(11,OUTPUT); // PWM Wave output
setupMidi();
setupTimer2();
}
void loop()
{
while(true) {
if (timer_milli > event_length) { // wait for the next midi event
cbi (TIMSK2,TOIE2);
loadNextEvent();
// calculate new DDS tuning word
tword_m_1=POW2_32*PIANO(active_keys[0])/refclk;
tword_m_2=POW2_32*PIANO(active_keys[1])/refclk;
tword_m_3=POW2_32*PIANO(active_keys[2])/refclk;
tword_m_4=POW2_32*PIANO(active_keys[3])/refclk;
if (!tword_m_1) phaccu_1 = 0;
if (!tword_m_2) phaccu_2 = 0;
if (!tword_m_3) phaccu_3 = 0;
if (!tword_m_4) phaccu_4 = 0;
timer_milli=0;
sbi (TIMSK2,TOIE2);
}
}
}
/*
* timer2 setup
*
* set pre-scaler to 1, PWM mode to phase correct PWM, 16000000/510 = 31372.55 Hz clock
*/
void setupTimer2() {
// Timer2 Clock Pre-scaler to : 1
sbi (TCCR2B, CS20);
cbi (TCCR2B, CS21);
cbi (TCCR2B, CS22);
// Timer2 PWM Mode set to Phase Correct PWM
cbi (TCCR2A, COM2A0); // clear Compare Match
sbi (TCCR2A, COM2A1);
sbi (TCCR2A, WGM20); // Mode 1 / Phase Correct PWM
cbi (TCCR2A, WGM21);
cbi (TCCR2B, WGM22);
// initialize DDS tuning word
tword_m_1=0;
tword_m_2=0;
tword_m_3=0;
tword_m_4=0;
// disable Timer0 interrupts to avoid timing distortion
cbi (TIMSK0,TOIE0);
// start Timer2!
sbi (TIMSK2,TOIE2);
}
/*
* Timer2 Interrupt Service
*
* Running at 31372,550 KHz = 32uSec
* this is the timebase REFCLOCK for the DDS generator
* FOUT = (M (REFCLK)) / (2 exp 32)
* runtime : 8 microseconds ( inclusive push and pop)
*/
ISR(TIMER2_OVF_vect) {
// soft DDS, phase accumulator with 32 bits
phaccu_1 += tword_m_1;
phaccu_2 += tword_m_2;
phaccu_3 += tword_m_3;
phaccu_4 += tword_m_4;
phaccu_5 += tword_m_5;
// use upper 8 bits for phase accumulator as frequency information
int phaccu_all = sine[phaccu_1>>24];
phaccu_all += sine[phaccu_2>>24];
phaccu_all += sine[phaccu_3>>24];
phaccu_all += sine[phaccu_4>>24];
phaccu_all += sine[phaccu_5>>24];
// Write to PWM port 11
OCR2A = phaccu_all/KEYBUF_SIZE;
// Increment timing counter
if(++timer_micro == 31) {
++timer_milli;
timer_micro=0;
}
}

View File

@ -0,0 +1,24 @@
Copyright (c) 2010, Matt Westcott & Ben Firshman
All rights reserved.
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met:
* Redistributions of source code must retain the above copyright notice, this
list of conditions and the following disclaimer.
* Redistributions in binary form must reproduce the above copyright notice,
this list of conditions and the following disclaimer in the documentation
and/or other materials provided with the distribution.
* The names of its contributors may not be used to endorse or promote products
derived from this software without specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

View File

@ -0,0 +1,51 @@
# Midifile.js
This module parses the Standard Midi File.
The code was modified to adapt to the 'require' way of nodejs. Irrelevant code have been removed.
The SMF parser part of the jasmid project is used. See jasmid's README and LICENSE for more info
Jasmid's original repository: https://github.com/gasman/jasmid
# JASMID Original Readme
```
jasmid - A Javascript MIDI file reader and synthesiser
Originally presented at BarCamp London 8, 13-14 November 2010
Instructions:
Open index.html in browser. Turn up volume. Click on link.
Sound output is via one of the following mechanisms, according to what your
browser supports:
* Mozilla Audio Data API <https://wiki.mozilla.org/Audio_Data_API>
* Web Audio API
<https://dvcs.w3.org/hg/audio/raw-file/tip/webaudio/specification.html>
* a Flash fallback originally taken from dynamicaudio.js by Ben Firshman
<https://github.com/bfirsh/dynamicaudio.js> and hacked around by me.
The code:
stream.js - helper library for reading a string as a stream of typed data
midifile.js - parses the MIDI file format into a header and a list of tracks,
each consisting of a list of event objects
replayer.js - steps over the data structure generated by midifile.js and calls
the appropriate operations on the synthesiser
synth.js - audio synthesiser; generates waveforms according to tweakable
parameters
audio.js - passes the generated waveform to either the Audio Data API or the
Flash fallback widget (da.swf)
Limitations:
* The only event types supported by replayer.js are note on, note off, tempo
change and program change
* There are currently only two instrument presets defined in synth.js - one for
strings and a 'piano' one for everything else - and neither of them are
particularly good (just a single volume-modulated sine wave).
Matt Westcott <matt@west.co.tt> - @gasmanic - http://matt.west.co.tt/
```

View File

@ -0,0 +1,241 @@
// This file has been converted for node 'require'
/*
class to parse the .mid file format
(depends on stream.js)
*/
var Stream = require("./stream.js");
module.exports = function(data) {
function readChunk(stream) {
var id = stream.read(4);
var length = stream.readInt32();
return {
'id': id,
'length': length,
'data': stream.read(length)
};
}
var lastEventTypeByte;
function readEvent(stream) {
var event = {};
event.deltaTime = stream.readVarInt();
var eventTypeByte = stream.readInt8();
if ((eventTypeByte & 0xf0) == 0xf0) {
/* system / meta event */
if (eventTypeByte == 0xff) {
/* meta event */
event.type = 'meta';
var subtypeByte = stream.readInt8();
var length = stream.readVarInt();
switch(subtypeByte) {
case 0x00:
event.subtype = 'sequenceNumber';
if (length != 2) throw "Expected length for sequenceNumber event is 2, got " + length;
event.number = stream.readInt16();
return event;
case 0x01:
event.subtype = 'text';
event.text = stream.read(length);
return event;
case 0x02:
event.subtype = 'copyrightNotice';
event.text = stream.read(length);
return event;
case 0x03:
event.subtype = 'trackName';
event.text = stream.read(length);
return event;
case 0x04:
event.subtype = 'instrumentName';
event.text = stream.read(length);
return event;
case 0x05:
event.subtype = 'lyrics';
event.text = stream.read(length);
return event;
case 0x06:
event.subtype = 'marker';
event.text = stream.read(length);
return event;
case 0x07:
event.subtype = 'cuePoint';
event.text = stream.read(length);
return event;
case 0x20:
event.subtype = 'midiChannelPrefix';
if (length != 1) throw "Expected length for midiChannelPrefix event is 1, got " + length;
event.channel = stream.readInt8();
return event;
case 0x2f:
event.subtype = 'endOfTrack';
if (length != 0) throw "Expected length for endOfTrack event is 0, got " + length;
return event;
case 0x51:
event.subtype = 'setTempo';
if (length != 3) throw "Expected length for setTempo event is 3, got " + length;
event.microsecondsPerBeat = (
(stream.readInt8() << 16)
+ (stream.readInt8() << 8)
+ stream.readInt8()
)
return event;
case 0x54:
event.subtype = 'smpteOffset';
if (length != 5) throw "Expected length for smpteOffset event is 5, got " + length;
var hourByte = stream.readInt8();
event.frameRate = {
0x00: 24, 0x20: 25, 0x40: 29, 0x60: 30
}[hourByte & 0x60];
event.hour = hourByte & 0x1f;
event.min = stream.readInt8();
event.sec = stream.readInt8();
event.frame = stream.readInt8();
event.subframe = stream.readInt8();
return event;
case 0x58:
event.subtype = 'timeSignature';
if (length != 4) throw "Expected length for timeSignature event is 4, got " + length;
event.numerator = stream.readInt8();
event.denominator = Math.pow(2, stream.readInt8());
event.metronome = stream.readInt8();
event.thirtyseconds = stream.readInt8();
return event;
case 0x59:
event.subtype = 'keySignature';
if (length != 2) throw "Expected length for keySignature event is 2, got " + length;
event.key = stream.readInt8(true);
event.scale = stream.readInt8();
return event;
case 0x7f:
event.subtype = 'sequencerSpecific';
event.data = stream.read(length);
return event;
default:
// console.log("Unrecognised meta event subtype: " + subtypeByte);
event.subtype = 'unknown'
event.data = stream.read(length);
return event;
}
event.data = stream.read(length);
return event;
} else if (eventTypeByte == 0xf0) {
event.type = 'sysEx';
var length = stream.readVarInt();
event.data = stream.read(length);
return event;
} else if (eventTypeByte == 0xf7) {
event.type = 'dividedSysEx';
var length = stream.readVarInt();
event.data = stream.read(length);
return event;
} else {
throw "Unrecognised MIDI event type byte: " + eventTypeByte;
}
} else {
/* channel event */
var param1;
if ((eventTypeByte & 0x80) == 0) {
/* running status - reuse lastEventTypeByte as the event type.
eventTypeByte is actually the first parameter
*/
param1 = eventTypeByte;
eventTypeByte = lastEventTypeByte;
} else {
param1 = stream.readInt8();
lastEventTypeByte = eventTypeByte;
}
var eventType = eventTypeByte >> 4;
event.channel = eventTypeByte & 0x0f;
event.type = 'channel';
switch (eventType) {
case 0x08:
event.subtype = 'noteOff';
event.noteNumber = param1;
event.velocity = stream.readInt8();
return event;
case 0x09:
event.noteNumber = param1;
event.velocity = stream.readInt8();
if (event.velocity == 0) {
event.subtype = 'noteOff';
} else {
event.subtype = 'noteOn';
}
return event;
case 0x0a:
event.subtype = 'noteAftertouch';
event.noteNumber = param1;
event.amount = stream.readInt8();
return event;
case 0x0b:
event.subtype = 'controller';
event.controllerType = param1;
event.value = stream.readInt8();
return event;
case 0x0c:
event.subtype = 'programChange';
event.programNumber = param1;
return event;
case 0x0d:
event.subtype = 'channelAftertouch';
event.amount = param1;
return event;
case 0x0e:
event.subtype = 'pitchBend';
event.value = param1 + (stream.readInt8() << 7);
return event;
default:
throw "Unrecognised MIDI event type: " + eventType
/*
console.log("Unrecognised MIDI event type: " + eventType);
stream.readInt8();
event.subtype = 'unknown';
return event;
*/
}
}
}
stream = Stream(data);
var headerChunk = readChunk(stream);
if (headerChunk.id != 'MThd' || headerChunk.length != 6) {
throw "Bad .mid file - header not found";
}
var headerStream = Stream(headerChunk.data);
var formatType = headerStream.readInt16();
var trackCount = headerStream.readInt16();
var timeDivision = headerStream.readInt16();
if (timeDivision & 0x8000) {
throw "Expressing time division in SMTPE frames is not supported yet"
} else {
ticksPerBeat = timeDivision;
}
var header = {
'formatType': formatType,
'trackCount': trackCount,
'ticksPerBeat': ticksPerBeat
}
var tracks = [];
for (var i = 0; i < header.trackCount; i++) {
tracks[i] = [];
var trackChunk = readChunk(stream);
if (trackChunk.id != 'MTrk') {
throw "Unexpected chunk - expected MTrk, got "+ trackChunk.id;
}
var trackStream = Stream(trackChunk.data);
while (!trackStream.eof()) {
var event = readEvent(trackStream);
tracks[i].push(event);
//console.log(event);
}
}
return {
'header': header,
'tracks': tracks
}
}

View File

@ -0,0 +1,71 @@
// This file has been converted for node 'require'
/* Wrapper for accessing strings through sequential reads */
module.exports = function(str) {
var position = 0;
function read(length) {
var result = str.substr(position, length);
position += length;
return result;
}
/* read a big-endian 32-bit integer */
function readInt32() {
var result = (
(str.charCodeAt(position) << 24)
+ (str.charCodeAt(position + 1) << 16)
+ (str.charCodeAt(position + 2) << 8)
+ str.charCodeAt(position + 3));
position += 4;
return result;
}
/* read a big-endian 16-bit integer */
function readInt16() {
var result = (
(str.charCodeAt(position) << 8)
+ str.charCodeAt(position + 1));
position += 2;
return result;
}
/* read an 8-bit integer */
function readInt8(signed) {
var result = str.charCodeAt(position);
if (signed && result > 127) result -= 256;
position += 1;
return result;
}
function eof() {
return position >= str.length;
}
/* read a MIDI-style variable-length integer
(big-endian value in groups of 7 bits,
with top bit set to signify that another byte follows)
*/
function readVarInt() {
var result = 0;
while (true) {
var b = readInt8();
if (b & 0x80) {
result += (b & 0x7f);
result <<= 7;
} else {
/* b is the last byte */
return result + b;
}
}
}
return {
'eof': eof,
'read': read,
'readInt32': readInt32,
'readInt16': readInt16,
'readInt8': readInt8,
'readVarInt': readVarInt
}
}

View File

@ -0,0 +1,58 @@
/*
* Midi2Wave
*
* Playback controller
*
* Load MIDI events into the global variable
*/
#ifndef __MIDI2WAVE_H__
#define __MIDI2WAVE_H__
#include "sequence.h"
#define MAX_NOTE 128
#define KEYBUF_SIZE 5
#define SINE_SAMPLE_SIZE 256
#define PIANO(key) (key?(pow(1.0594630943592952645618252949463,key+1-32-49+24)*440):0)
#define NOTE_NUMBER(index) pgm_read_byte_near(notes+index)
#define NOTE_DELAY(index) (pgm_read_word_near(params+index)>>4)
#define NOTE_VEL(index) (pgm_read_word_near(params+index)&15)
unsigned char volatile active_keys[KEYBUF_SIZE];
unsigned char volatile key_vels[MAX_NOTE];
volatile char note_count = 0;
// The current length in milliseconds
int event_length = 0;
// The primary key
char key = 61;
/*
* Setup
*
* Initialize stuff
*/
void setupMidi();
/*
* Render wave buffer
*
* Generate the wave buffer with current notes
*/
void renderWaveBuffer();
/*
* Load next event
*
* Load the next midi note/chord
* Updates the next delay variable
* Updates LEDs
*/
void loadNextEvent();
#endif

View File

@ -0,0 +1,84 @@
/*
* Midi2Wave
*
* Implementation
*/
#include "midi2wave.h"
#define cbi(sfr, bit) (_SFR_BYTE(sfr) &= ~_BV(bit))
#define sbi(sfr, bit) (_SFR_BYTE(sfr) |= _BV(bit))
short ptr;
void setupMidi() {
for (int i=0; i<MAX_NOTE; ++i)
key_vels[i] = 0;
for (char i=0; i<KEYBUF_SIZE; ++i)
active_keys[i] = 0;
ptr = 0;
}
void renderWaveBuffer() {
unsigned char leds = 0;
note_count = 0;
// Update active key buffer with new keys
// Preserve original index if the key is not released
for (char i = 0; i < KEYBUF_SIZE; ++i)
if (key_vels[active_keys[i]]) {
key_vels[active_keys[i]] |= 32; // the 6th bit is used as a "key-not-released" flag
leds |= 1<<(active_keys[i]%6);
++note_count;
}
else {
active_keys[i] = 0; // Clear keys that are released
}
for (int i=MAX_NOTE-1; i>=0; --i) // Goes down: make sure the most significant note gets played
if ( key_vels[i] && !(key_vels[i]&32) ) {
for (char j=0; j<KEYBUF_SIZE; j++)
if (!active_keys[j])
{
active_keys[j] = i;
++note_count;
break;
}
leds |= 1<<(i%6);
}
for (char i = 0; i < KEYBUF_SIZE; ++i)
if (active_keys[i])
key_vels[active_keys[i]] &= 31; // Clear out the 6th bit "key-not-released" flag
// Set LEDs
for (char i = 0; i < 7; ++i)
if (leds & (1<<i))
sbi(PORTD, i+2);
else
cbi(PORTD, i+2);
}
void loadNextEvent() {
if (ptr >= SONG_LEN)
{
// Restart in 3s
Serial.println("Ended.");
setupMidi();
event_length = 3000;
for (int i = 0; i < 7; ++i)
sbi(PORTD, i+2);
return;
}
int new_length = NOTE_DELAY(ptr)*TEMPO;
key_vels[NOTE_NUMBER(ptr)-1] = NOTE_VEL(ptr);
++ptr;
if (new_length == 0)
loadNextEvent();
else {
renderWaveBuffer();
event_length = new_length;
}
}

View File

@ -0,0 +1,152 @@
/*
* SMF to SEQ
*
* Convert Standard MIDI file to event array
* Output file as sequence.h: to be compiled with ino files
*
* This program uses part of jasmid to decode and parse .mid files
* Please refer to jasmid/LICENSE for the jasmid license
*
* Run this file with node.js
* $ node smf2seq.js [SMF filename]
*
* 2016 by ilufang
*/
Midifile = require("./jasmid/midifile.js");
fs = require("fs");
// # Read and parse SMF
var filename = process.argv[2]?process.argv[2]:"song.mid";
var midi_blob = fs.readFileSync(filename);
var t = "";
for (var i=0; i<midi_blob.length; i++) {
t += String.fromCharCode(midi_blob[i] & 255);
}
try {
midi = Midifile(t);
} catch(e) {
console.error("Could not parse midi.");
process.exit(1);
}
if (midi.header.formatType != 1) {
console.error("MIDI Type not supported. Expect 1, got "+midi.header.formatType);
process.exit(1);
}
// fs.writeFileSync("midi.json",JSON.stringify(midi,null,'\t'));
// process.exit();
// # Process events
var ptr = []; // iteration pointer per track
seq = []; // merged result
// convert delta time to accumulative time
for (var t in midi.tracks) {
ptr.push(0); // Irrelevant to the calculation, just initialize ptr
var tick = 0;
var width = 0, maxwidth = 0;
for (var i in midi.tracks[t]) {
tick += midi.tracks[t][i].deltaTime;
midi.tracks[t][i].time = tick;
midi.tracks[t][i].track = parseInt(t); // Still need to keep track of the track
}
}
// Merge the tracks
var time = 0;
while(true) {
// 'Pop' front
var minTrack = 0;
for (var t in midi.tracks) {
if (!midi.tracks[t][ptr[t]]) {
if (minTrack == t) {
// In case a prior tracks are shorter, assign the default minTrack to a latter one
minTrack++;
}
continue;
}
if (midi.tracks[t][ptr[t]].time < midi.tracks[minTrack][ptr[minTrack]].time) { minTrack = t; }
}
if (minTrack==midi.tracks.length) {
// No tracks have events left
break;
}
seq.push(midi.tracks[minTrack][ptr[minTrack]]);
ptr[minTrack]++;
}
// Scan for consecutive notes
/*
time = 0;
var notes_off = {};
for (var i = 0; i < seq.length; i++) {
if (seq[i].time != time) {
time = seq[i].time;
notes_off = {};
}
if (seq[i].type=="channel") {
if (seq[i].subtype=="noteOff") {
notes_off[seq[i].noteNumber] = i;
} else if (seq[i].subtype=="noteOn") {
if (notes_off[seq[i].noteNumber]) {
seq[notes_off[seq[i].noteNumber]].time -= 20;
}
}
}
}
*/
// Regenerate deltatime
var tempo = 0;
var notes = [], note_params = [];
for (var i=0; i<seq.length; i++) {
if (seq[i+1]) {
seq[i].deltaTime = seq[i+1].time - seq[i].time;
} else {
seq[i].deltatime = 0;
}
prevTime = seq[i].time;
if (seq[i].type=="meta" && seq[i].subtype =="setTempo") {
tempo = 1.0*seq[i].microsecondsPerBeat/1000/midi.header.ticksPerBeat;
} else if (seq[i].type=="channel") {
if (seq[i].subtype=="noteOff") {
seq[i].velocity = 0;
}
if (seq[i].subtype=="noteOn" || seq[i].subtype=="noteOff") {
seq[i].velocity*=128/96;
if (seq[i].velocity > 127)
seq[i].velocity = 127;
notes.push(seq[i].noteNumber);
note_params.push((seq[i].deltaTime<<4)+(seq[i].velocity>>3));
}
}
}
fs.writeFileSync("midi.json", JSON.stringify(seq, null, '\t'));
// # Generate sin table
var file = "// MIDI events\n// Generated by smf2seq.js\n";
var sine_sample = [], sine_sample_size = 256;
for (var i = 0; i < sine_sample_size; i++) {
sine_sample.push(128+Math.round(128*Math.sin(2*Math.PI*i/sine_sample_size)));
}
file += "const unsigned char sine[] = {"+sine_sample.join(",")+"};\n";
file += "#define TEMPO "+tempo+"\n";
file += "#define SONG_LEN "+notes.length+"\n";
file += "PROGMEM const unsigned char notes[] = {"+notes.join(",")+"};\n";
file += "PROGMEM const int params[] = {"+note_params.join(",")+"};\n";
console.log("Using memory: "+(notes.length*3));
console.log("Total memory: 32256");
// # Write to file
fs.writeFileSync("sequence.h",file);

368
Midi/mg/AVR.INC Normal file
View File

@ -0,0 +1,368 @@
;------------------------------------------------;
; Constants
.equ RAMTOP = 0x60 ; SRAM top address
.equ RAMTOP100 = 0x100 ; For memory mapped I/O devices
.equ bit0 = 0b00000001
.equ bit1 = 0b00000010
.equ bit2 = 0b00000100
.equ bit3 = 0b00001000
.equ bit4 = 0b00010000
.equ bit5 = 0b00100000
.equ bit6 = 0b01000000
.equ bit7 = 0b10000000
.def T0L = r0
.def T0H = r1
.def T2L = r2
.def T2H = r3
.def T4L = r4
.def T4H = r5
.def T6L = r6
.def T6H = r7
.def T8L = r8
.def T8H = r9
.def T10L = r10
.def T10H = r11
.def T12L = r12
.def T12H = r13
.def T14L = r14
.def T14H = r15
.def AL = r16
.def AH = r17
.def BL = r18
.def BH = r19
.def CL = r20
.def CH = r21
.def DL = r22
.def DH = r23
.def EL = r24
.def EH = r25
;------------------------------------------------;
; Push/Pop register pair
;
; pushw Z
.macro pushw
push @0H
push @0L
.endm
.macro popw
pop @0L
pop @0H
.endm
;------------------------------------------------;
; Load/store word from/to direct memory/immediate
;
; ldsw Z,mem
; ldiw Z,imm
.macro ldiw
ldi @0L,low(@1)
ldi @0H,high(@1)
.endm
.macro ldsw
lds @0L,@1
lds @0H,@1+1
.endm
.macro stsw
sts @0+1,@1H
sts @0,@1L
.endm
.macro lddw
ldd @0L,@1
ldd @0H,@1+1
.endm
.macro stdw
std @0+1,@1H
std @0,@1L
.endm
.macro ldw
ld @0L,@1
ld @0H,@1
.endm
.macro stw
st @0,@1L
st @0,@1H
.endm
.macro inw
in @0L,@1L
in @0H,@1H
.endm
.macro outw
out @0H,@1H
out @0L,@1L
.endm
;------------------------------------------------;
; Store immediate into indirect memory via r16
;
; sti Z,imm
; stdi Z+d,imm
.macro sti
ldi r16,@1
st @0,r16
.endm
.macro stdi
ldi r16,@1
std @0,r16
.endm
.macro muli
ldi r16,@1
mul @0,r16
.endm
;------------------------------------------------;
; add/sub/subc/cp/cpc/lsl/lsr/rol/ror to register pair
;
.macro addiw
subi @0L,low(-(@1))
sbci @0H,high(-(@1))
.endm
.macro subiw
subi @0L,low(@1)
sbci @0H,high(@1)
.endm
.macro addw
add @0L,@1L
adc @0H,@1H
.endm
.macro adcw
adc @0L,@1L
adc @0H,@1H
.endm
.macro subw
sub @0L,@1L
sbc @0H,@1H
.endm
.macro sbcw
sbc @0L,@1L
sbc @0H,@1H
.endm
.macro cpw
cp @0L,@1L
cpc @0H,@1H
.endm
.macro cpcw
cpc @0L,@1L
cpc @0H,@1H
.endm
.macro cpiw
cpi @0L,low(@1)
ldi r16,high(@1)
cpc @0H,r16
.endm
.macro andw
and @0L,@1L
and @0H,@1H
.endm
.macro andiw
andi @0L,low(@1)
andi @0H,high(@1)
.endm
.macro orw
or @0L,@1L
or @0H,@1H
.endm
.macro oriw
ori @0L,low(@1)
ori @0H,high(@1)
.endm
.macro lslw
lsl @0L
rol @0H
.endm
.macro lsrw
lsr @0H
ror @0L
.endm
.macro asrw
asr @0H
ror @0L
.endm
.macro rolw
rol @0L
rol @0H
.endm
.macro rorw
ror @0H
ror @0L
.endm
.macro clrw
clr @0L
clr @0H
.endm
.macro comw
com @0L
com @0H
.endm
.macro negw
com @0H
neg @0L
brne PC+2
inc @0H
.endm
.macro movew
mov @0L, @1L
mov @0H, @1H
.endm
.macro lpmw
lpm @0L, @1
lpm @0H, @1
.endm
;------------------------------------------------;
; Store immediate into direct memory via r16
;
; stsi var,imm
.macro stsi
ldi r16,@1
sts @0,r16
.endm
;------------------------------------------------;
; Output port immediate via r16
;
; outi port,var
.macro outi
ldi r16,@1
out @0,r16
.endm
;------------------------------------------------;
; Add immediate to register
.macro addi
subi @0,-(@1)
.endm
;------------------------------------------------;
; Long branch
.macro rjne
breq PC+2
rjmp @0
.endm
.macro rjeq
brne PC+2
rjmp @0
.endm
.macro rjcc
brcs PC+2
rjmp @0
.endm
.macro rjcs
brcc PC+2
rjmp @0
.endm
.macro rjtc
brts PC+2
rjmp @0
.endm
.macro rjts
brtc PC+2
rjmp @0
.endm
.macro rjge
brlt PC+2
rjmp @0
.endm
.macro rjlt
brge PC+2
rjmp @0
.endm
.macro retcc
brcs PC+2
ret
.endm
.macro retcs
brcc PC+2
ret
.endm
.macro reteq
brne PC+2
ret
.endm
.macro retne
breq PC+2
ret
.endm
;------------------------------------------------;
; Move single bit between two registers
;
; bmov dstreg,dstbit,srcreg.srcbit
.macro movb
bst @2,@3
bld @0,@1
.endm

499
Midi/mg/mel.txt Normal file
View File

@ -0,0 +1,499 @@
;For Elise (3/8, 60bpm)
;<time tick> <note> <note> ...
; 1
120 E5
150 Dis5
; 2
180 E5
210 Dis5
240 E5
270 H5
300 D5
330 C5
; 3
360 A5 A3
390 E3
420 A4
450 C4
480 E4
510 A5
; 4
540 H5 E2
570 E3
600 Gis3
630 E4
660 Gis4
690 H5
; 5
720 C5 A3
750 E3
780 A4
810 E4
840 E5
870 Dis5
; 6
900 E5
930 Dis5
960 E5
990 H5
1020 D5
1050 C5
; 7
1080 A5 A3
1110 E3
1140 A4
1170 C4
1200 E4
1230 A5
; 8
1260 H5 E2
1290 E3
1320 Gis3
1350 E4
1380 C5
1410 H5
; 9
1440 A5 A3
1470 E3
1500 A4
1560 E5
1590 Dis5
; 10
1620 E5
1650 Dis5
1680 E5
1710 H5
1740 D5
1770 C5
; 11
1800 A5 A3
1830 E3
1860 A4
1890 C4
1920 E4
1950 A5
; 12
1980 H5 E2
2010 E3
2040 Gis3
2070 E4
2100 Gis4
2130 H5
; 13
2160 C5 A3
2190 E3
2220 A4
2250 E4
2280 E5
2310 Dis5
; 14
2340 E5
2370 Dis5
2400 E5
2430 H5
2460 D5
2490 C5
; 15
2520 A5 A3
2550 E3
2580 A4
2610 C4
2640 E4
2670 A5
; 16
2700 H5 E2
2730 E3
2760 Gis3
2790 E4
2820 C5
2850 H5
; 17
2880 A5 A3
2910 E3
2940 A4
2970 H5
3000 C5
3030 D5
; 18
3060 E5 C3
3090 G3
3120 C4
3150 G4
3180 F5
3210 E5
; 19
3240 D5 G2
3270 G3
3300 A4
3330 F4
3360 E5
3390 D5
; 20
3420 C5 A3
3450 E3
3480 A4
3510 E4
3540 D5
3570 C5
; 21
3600 H5 E2
3630 E3
3660 E4
3690 E4
3720 E5
3750 E4
; 22
3780 E5
3810 E5
3840 E6
3870 Dis5
3900 E5
3930 Dis5
; 23
3960 E5
3990 Dis5
4020 E5
4050 Dis5
4080 E5
4110 Dis5
; 24
4140 E5
4170 Dis5
4200 E5
4230 H5
4260 D5
4290 C5
; 25
4320 A5 A3
4350 E3
4380 A4
4410 C4
4440 E4
4470 A5
; 26
4500 H5 E2
4530 E3
4560 Gis3
4590 E4
4620 Gis4
4650 H5
; 27
4680 C5 A3
4710 E3
4740 A4
4770 E4
4800 E5
4830 Dis5
; 28
4860 E5
4890 Dis5
4920 E5
4950 H5
4980 D5
5010 C5
; 29
5040 A5 A3
5070 E3
5100 A4
5130 C4
5160 E4
5190 A5
; 30
5220 H5 E2
5250 E3
5280 Gis3
5310 E4
5340 C5
5370 H5
; 31
5400 A5 A3
5430 E3
5460 A4
5490 H5
5520 C5
5550 D5
; 32
5580 E5 C3
5610 G3
5640 C4
5670 G4
5700 F5
5730 E5
; 33
5760 D5 G2
5790 G3
5820 A4
5850 F4
5880 E5
5910 D5
; 34
5940 C5 A3
5970 E3
6000 A4
6030 E4
6060 D5
6090 C5
; 35
6120 H5 E2
6150 E3
6180 E4
6210 E4
6240 E5
6270 E4
; 36
6300 E5
6330 E5
6360 E6
6390 Dis5
6420 E5
6450 Dis5
; 37
6480 E5
6510 Dis5
6540 E5
6570 Dis5
6600 E5
6630 Dis5
; 38
6660 E5
6690 Dis5
6720 E5
6750 H5
6780 D5
6810 C5
; 39
6840 A5 A3
6870 E3
6900 A4
6930 C4
6960 E4
6990 A5
; 40
7020 H5 E2
7050 E3
7080 Gis3
7110 E4
7140 Gis4
7170 H5
; 41
7200 C5 A3
7230 E3
7260 A4
7290 E4
7320 E5
7350 Dis5
; 42
7380 E5
7410 Dis5
7440 E5
7470 H5
7500 D5
7530 C5
; 43
7560 A5 A3
7590 E3
7620 A4
7650 C4
7680 E4
7710 A5
; 44
7740 H5 E2
7770 E3
7800 Gis3
7830 E4
7860 C5
7890 H5
; 45
7920 A5 A3
7950 E3
7980 A4
8010 C5 E4 C4 B4
8040 C5 F4 C4 A4
8070 C5 G4 E4 B4 G3
; 46
8100 C5 F3
8130 A4
8160 C4
8190 A4
8220 F5 C4
8250 A4
8265 E5
; 47
8280 E5 F3
8310 B4
8340 D4
8370 B4
8400 B6 D4
8430 B4
8445 A6
; 48
8460 A6 F3
8490 G5 E4
8520 F5 B4 G3 F3
8550 E5 E4
8580 D5 B4 G3 F3
8610 C5 E4
; 49
8640 B5 F3
8670 A4
8700 A5 C4
8730 A4
8760 A5 C4
8775 G4
8790 A5 A4
8805 B5
; 50
8820 C5 F3
8850 A4
8880 C4
8910 A4
8940 D5 C4
8970 Dis5 A4
; 51
9000 E5 E3
9030 A4
9060 C4
9090 E5 A4
9120 F5 D4 D3
9150 A5 F3
; 52
9180 C5 G3
9210 E4
9240 G3
9270 E4
9300 D5 G3
9330 G4
9345 H5
; 53
9360 D5 E4 C4
9375 G5
9390 G4
9405 G5
9420 A5
9435 G5
9450 H5 G4 F4
9465 G5
9480 C5 G4 E4
9495 G5
9510 D5 G4 F4 D4
9525 G5
; 54
9540 E5 G4 E4 C4
9555 G5
9570 C6
9585 H6
9600 A6 A4 F3
9615 G5
9630 F5
9645 E5
9660 D5 H4 G3
9675 G5
9690 F5
9705 D5
; 55
9720 D5 E4 C4
9735 G5
9750 G4
9765 G5
9780 A5
9795 G5
9810 H5 G4 F4
9825 G5
9840 C5 G4 E4
9855 G5
9870 D5 G4 F4 D4
9885 G5
; 56
9900 E5 G4 E4 C4
9915 G5
9930 C6
9945 H6
9960 A6 A4 F3
9975 G5
9990 F5
10005 E5
10020 D5 H4 G3
10035 G5
10050 F5
10065 D5
; 57
10080 E5 A4 Gis3
10095 F5
10110 E5
10125 Dis5
10140 E5
10155 H5
10170 E5
10185 Dis5
10200 E5
10215 H5
10230 E5
10245 Dis5
; 58
10260 E5
10350 H5
10380 E5
10410 Dis5
; 59
10440 E5
10800 EoS

297
Midi/mg/mel1.txt Normal file
View File

@ -0,0 +1,297 @@
;c•êÆÌz¢<E2809A>o from DCTV (4/4 19bpm)
;<time tick> <note> <note> ...
; 1
0 B5
2 Dis3
100 B4
150 Gis4
175 G4
200 Dis4
; 2
400 C4
404 Dis4 G3
408 C3
600 B3
; 3
800 Gis3
804 Gis4
806 C4 F2
900 C3
950 G4
975 F4
1000 C4 F3
1150 Dis4
; 4
1200 D4
1202 B4
1203 F3
1205 B3
1400 F3
1450 D4
1500 C4
1550 B4
; 5
1600 B5
1602 G2
1650 D3
1700 G3
1750 D4
1800 D5
1900 B5
; 6
2000 B5
2003 C3
2100 G3
2197 C4
2200 E4
2201 G4
2203 C5 B4
; 7
2400 Gis4
2404 F3
2500 C4
2550 Dis4
2600 Gis4
2700 B5
2750 C5
; 8
2800 C5
2802 B3
2900 F3
2925 Dis4
2950 Gis4
2975 C5
2996 B3
2999 B4
3000 D4
3001 F4
3002 B5
; 9
3200 B5
3202 Dis3
3300 B4
3350 Gis4
3375 G4
3400 Dis4
3402 B4
; 10
3600 B4
3602 Dis4 C3
3700 G3
3800 B3
3900 D4
3950 Dis4
; 11
4000 C4
4002 Gis4
4006 F2
4100 C3
4150 G4
4175 F4
4200 C4
4202 F3
4300 C4
4350 Dis4
; 12
4400 D4
4401 F3
4402 B4 B3
4600 F3
4650 D4
4700 C4
4750 B4
; 13
4800 B5
4802 G3
4850 B4
4900 D4
4902 D3
4950 G4
5000 B5
5002 G3
5150 D5
; 14
5200 B5
5202 C3
5300 G3
5400 C4
5401 E4
5402 G4
5403 B4
5405 C5
; 15
5600 C4 F3
5602 Gis4 Gis3
5604 Dis4
5800 F3
5850 Gis4
5900 B5
5950 C5
; 16
6000 F4
6003 Gis4 Dis5
6005 B3
6100 F3
6200 F4
6203 B5
6206 D5 B4
; 17
6400 Dis4
6403 G4
6405 B5
6407 B4 Dis3
6600 Dis3
6650 G4
6700 Gis4
6750 B5
; 18
6800 C4
6801 Dis4
6802 B4 C5
7000 Gis3
; 19
7200 B3 D4
7202 F3 F4
7204 B4
7400 B4
7450 F4
7500 G4
7550 Gis4
; 20
7600 D4
7603 G4
7605 B5 G3
7800 D3
7900 G3
; 21
8000 C3 G3
8001 Dis4 C4
8200 Dis4
8203 B3
8250 Dis4
8300 F4
8350 G4
; 22
8400 C4
8402 Gis4 F4
8404 F2
8600 C3
8650 F3
8700 G4
8750 F4
; 23
8800 C4
8801 Gis3
8802 B3
9050 Gis3
9100 C4
9150 Dis4
; 24
9200 B3
9201 D4 B4
9202 F3
9400 F3
; 25
9600 B5 Dis3
9700 B4
9750 D4
9775 G4
9800 B5
9900 D5
; 26
10000 E4
10004 G4
10008 C5 C3
10100 G3
10200 C4
10204 E4
10208 G4
10210 C5
; 27
10400 Gis4
10402 F2
10500 C3
10550 C4
10575 Dis4
10600 Gis4 F3
10700 B5
10750 C5
; 28
10800 D4
10804 F4
10806 B5 B3
10900 F3
11000 B4
; 29
11200 D4
11204 F4
11206 B5 G2
11300 D3
11400 G3
11450 B5
11500 C5
11550 D5
; 30
11600 C3
11604 G3 E4
11606 B4 G4
11608 B5
11800 C5
; 31
12000 F2
12003 C3 C4
12006 F3
12009 Dis4 Gis4
12300 G4
12350 F4
; 32
12400 B3 C4
12402 Gis3 F4
12700 D4
; 33
12800 Gis2 B4
12803 Dis4 Gis3
13000 Dis3
; 34
13200 Dis2
13206 B3
13212 Dis3
13218 G3
13224 B4
13230 Dis4
14000 EoS

198
Midi/mg/mel2.txt Normal file
View File

@ -0,0 +1,198 @@
; Kanon (4/4 19bpm)
;1
0 C3
1 E4
2 A5
50 E3
75 H5
100 G3
150 H4 E4
200 G3
250 H4
300 E4
350 H4
;2
400 C3
401 E4
402 A5
450 E3
475 H5
500 G3
550 H4 E4
600 G3
650 H4
700 E4
750 H4
;3
800 H3
801 E4
802 A5
850 D3
875 H5
900 Fis3
950 A4 D5
1000 Fis3
1050 A4
1100 D4
1150 A4
;4
1200 H3
1201 E4
1202 A5
1250 D3
1275 H5
1300 Fis3
1350 A4 D5
1400 Fis3
1450 A4
1500 D4
1550 A4
;5
1600 C3
1601 E4
1602 A5
1650 E3
1675 H5
1700 G3
1750 H4 E4
1800 G3
1850 H4
1900 E4
1950 H4
;6
2000 C3
2001 E4
2002 A5
2050 E3
2075 H5
2100 G3
2150 H4 E4
2200 G3
2250 H4
2300 E4
2350 H4
;7
2400 H3
2401 E4
2402 A5
2450 D3
2475 H5
2500 Fis3
2550 A4 D5
2600 Fis3
2650 A4
2700 D4
2750 A4
;8
2800 H3
2801 E4
2802 A5
2850 D3
2875 H5
2900 Fis3
2950 A4 E4
2952 E5
3000 Fis3
3050 D4 D5
3100 A4 H5
3125 A5
3150 E3
;9
3200 E3
3201 A4
3202 G4
3250 G3
3300 H4
3350 D4
3400 H4
3450 Fis4
3500 G3
3550 H4 G4
;10
3600 Dis3
3602 G4
3650 G3
3700 H4
3750 Dis4
3800 H4 A5
3850 G3
3875 G4
3900 Dis4
3950 H4 A5
;11
4000 D3
4002 H5
4050 Fis3
4100 A4
4150 D4
4200 A4 H5
4250 Fis4
4275 D5
4300 Fis3
4350 A4 E5
;12
4400 Cis3
4402 H5
4450 E3
4500 G3
4550 H4
4600 G3
4650 H4 A5
4700 E4 G4
4750 H4 Fis4
;13
4800 C3
4802 E4
4850 E3
4900 G3
4950 H4
5000 G3 H5
5050 H4
5100 E4 A5
5150 H4
;14
5200 H3
5202 Fis4
5250 D3
5300 Fis3
5350 A4
5400 Fis3
5450 A4
5500 D4
5550 A4
;15
5600 E3
5602 E4
5650 D3
5700 Fis3
5750 A4
5752 A5
5800 Fis3
5850 A4
5900 D4 H5
5950 A4
;16
6000 E2
6004 D4
6007 E5
6012 H3
6016 E3
6800 EoS

33
Midi/mg/mel2asm.pl Normal file
View File

@ -0,0 +1,33 @@
# perl mel2asm.pl < mel.txt > melody.asm
foreach (<STDIN>) {
chop;
s/;.*$//;
@lst = split(/ /);
if(@lst < 2) { next; }
$n = $lst[0] & 255; &putb;
$n = $lst[0] >> 8; &putb;
$p = 1;
while($lst[$p] ne '') {
$n = $lst[$p++];
if($lst[$p] eq '') { $n .= "|en"; }
&putb;
}
}
print "\n;$cnt\n";
exit;
sub putb
{
$cnt++;
if($c == 0) {
print "\n\t.db $n";
} else {
print ", $n";
}
$c = ($c + 1) & 15;
}

80
Midi/mg/melody.asm Normal file
View File

@ -0,0 +1,80 @@
.db 120, 0, E5|en, 150, 0, Dis5|en, 180, 0, E5|en, 210, 0, Dis5|en, 240, 0, E5|en, 14
.db 1, H5|en, 44, 1, D5|en, 74, 1, C5|en, 104, 1, A5, A3|en, 134, 1, E3|en, 164
.db 1, A4|en, 194, 1, C4|en, 224, 1, E4|en, 254, 1, A5|en, 28, 2, H5, E2|en, 58
.db 2, E3|en, 88, 2, Gis3|en, 118, 2, E4|en, 148, 2, Gis4|en, 178, 2, H5|en, 208, 2
.db C5, A3|en, 238, 2, E3|en, 12, 3, A4|en, 42, 3, E4|en, 72, 3, E5|en, 102, 3
.db Dis5|en, 132, 3, E5|en, 162, 3, Dis5|en, 192, 3, E5|en, 222, 3, H5|en, 252, 3, D5|en
.db 26, 4, C5|en, 56, 4, A5, A3|en, 86, 4, E3|en, 116, 4, A4|en, 146, 4, C4|en
.db 176, 4, E4|en, 206, 4, A5|en, 236, 4, H5, E2|en, 10, 5, E3|en, 40, 5, Gis3|en
.db 70, 5, E4|en, 100, 5, C5|en, 130, 5, H5|en, 160, 5, A5, A3|en, 190, 5, E3|en
.db 220, 5, A4|en, 24, 6, E5|en, 54, 6, Dis5|en, 84, 6, E5|en, 114, 6, Dis5|en, 144
.db 6, E5|en, 174, 6, H5|en, 204, 6, D5|en, 234, 6, C5|en, 8, 7, A5, A3|en, 38
.db 7, E3|en, 68, 7, A4|en, 98, 7, C4|en, 128, 7, E4|en, 158, 7, A5|en, 188, 7
.db H5, E2|en, 218, 7, E3|en, 248, 7, Gis3|en, 22, 8, E4|en, 52, 8, Gis4|en, 82, 8
.db H5|en, 112, 8, C5, A3|en, 142, 8, E3|en, 172, 8, A4|en, 202, 8, E4|en, 232, 8
.db E5|en, 6, 9, Dis5|en, 36, 9, E5|en, 66, 9, Dis5|en, 96, 9, E5|en, 126, 9, H5|en
.db 156, 9, D5|en, 186, 9, C5|en, 216, 9, A5, A3|en, 246, 9, E3|en, 20, 10, A4|en
.db 50, 10, C4|en, 80, 10, E4|en, 110, 10, A5|en, 140, 10, H5, E2|en, 170, 10, E3|en
.db 200, 10, Gis3|en, 230, 10, E4|en, 4, 11, C5|en, 34, 11, H5|en, 64, 11, A5, A3|en
.db 94, 11, E3|en, 124, 11, A4|en, 154, 11, H5|en, 184, 11, C5|en, 214, 11, D5|en, 244
.db 11, E5, C3|en, 18, 12, G3|en, 48, 12, C4|en, 78, 12, G4|en, 108, 12, F5|en, 138
.db 12, E5|en, 168, 12, D5, G2|en, 198, 12, G3|en, 228, 12, A4|en, 2, 13, F4|en, 32
.db 13, E5|en, 62, 13, D5|en, 92, 13, C5, A3|en, 122, 13, E3|en, 152, 13, A4|en, 182
.db 13, E4|en, 212, 13, D5|en, 242, 13, C5|en, 16, 14, H5, E2|en, 46, 14, E3|en, 76
.db 14, E4|en, 106, 14, E4|en, 136, 14, E5|en, 166, 14, E4|en, 196, 14, E5|en, 226, 14
.db E5|en, 0, 15, E6|en, 30, 15, Dis5|en, 60, 15, E5|en, 90, 15, Dis5|en, 120, 15, E5|en
.db 150, 15, Dis5|en, 180, 15, E5|en, 210, 15, Dis5|en, 240, 15, E5|en, 14, 16, Dis5|en, 44
.db 16, E5|en, 74, 16, Dis5|en, 104, 16, E5|en, 134, 16, H5|en, 164, 16, D5|en, 194, 16
.db C5|en, 224, 16, A5, A3|en, 254, 16, E3|en, 28, 17, A4|en, 58, 17, C4|en, 88, 17
.db E4|en, 118, 17, A5|en, 148, 17, H5, E2|en, 178, 17, E3|en, 208, 17, Gis3|en, 238, 17
.db E4|en, 12, 18, Gis4|en, 42, 18, H5|en, 72, 18, C5, A3|en, 102, 18, E3|en, 132, 18
.db A4|en, 162, 18, E4|en, 192, 18, E5|en, 222, 18, Dis5|en, 252, 18, E5|en, 26, 19, Dis5|en
.db 56, 19, E5|en, 86, 19, H5|en, 116, 19, D5|en, 146, 19, C5|en, 176, 19, A5, A3|en
.db 206, 19, E3|en, 236, 19, A4|en, 10, 20, C4|en, 40, 20, E4|en, 70, 20, A5|en, 100
.db 20, H5, E2|en, 130, 20, E3|en, 160, 20, Gis3|en, 190, 20, E4|en, 220, 20, C5|en, 250
.db 20, H5|en, 24, 21, A5, A3|en, 54, 21, E3|en, 84, 21, A4|en, 114, 21, H5|en, 144
.db 21, C5|en, 174, 21, D5|en, 204, 21, E5, C3|en, 234, 21, G3|en, 8, 22, C4|en, 38
.db 22, G4|en, 68, 22, F5|en, 98, 22, E5|en, 128, 22, D5, G2|en, 158, 22, G3|en, 188
.db 22, A4|en, 218, 22, F4|en, 248, 22, E5|en, 22, 23, D5|en, 52, 23, C5, A3|en, 82
.db 23, E3|en, 112, 23, A4|en, 142, 23, E4|en, 172, 23, D5|en, 202, 23, C5|en, 232, 23
.db H5, E2|en, 6, 24, E3|en, 36, 24, E4|en, 66, 24, E4|en, 96, 24, E5|en, 126, 24
.db E4|en, 156, 24, E5|en, 186, 24, E5|en, 216, 24, E6|en, 246, 24, Dis5|en, 20, 25, E5|en
.db 50, 25, Dis5|en, 80, 25, E5|en, 110, 25, Dis5|en, 140, 25, E5|en, 170, 25, Dis5|en, 200
.db 25, E5|en, 230, 25, Dis5|en, 4, 26, E5|en, 34, 26, Dis5|en, 64, 26, E5|en, 94, 26
.db H5|en, 124, 26, D5|en, 154, 26, C5|en, 184, 26, A5, A3|en, 214, 26, E3|en, 244, 26
.db A4|en, 18, 27, C4|en, 48, 27, E4|en, 78, 27, A5|en, 108, 27, H5, E2|en, 138, 27
.db E3|en, 168, 27, Gis3|en, 198, 27, E4|en, 228, 27, Gis4|en, 2, 28, H5|en, 32, 28, C5
.db A3|en, 62, 28, E3|en, 92, 28, A4|en, 122, 28, E4|en, 152, 28, E5|en, 182, 28, Dis5|en
.db 212, 28, E5|en, 242, 28, Dis5|en, 16, 29, E5|en, 46, 29, H5|en, 76, 29, D5|en, 106
.db 29, C5|en, 136, 29, A5, A3|en, 166, 29, E3|en, 196, 29, A4|en, 226, 29, C4|en, 0
.db 30, E4|en, 30, 30, A5|en, 60, 30, H5, E2|en, 90, 30, E3|en, 120, 30, Gis3|en, 150
.db 30, E4|en, 180, 30, C5|en, 210, 30, H5|en, 240, 30, A5, A3|en, 14, 31, E3|en, 44
.db 31, A4|en, 74, 31, C5, E4, C4, B4|en, 104, 31, C5, F4, C4, A4|en, 134, 31
.db C5, G4, E4, B4, G3|en, 164, 31, C5, F3|en, 194, 31, A4|en, 224, 31, C4|en, 254
.db 31, A4|en, 28, 32, F5, C4|en, 58, 32, A4|en, 73, 32, E5|en, 88, 32, E5, F3|en
.db 118, 32, B4|en, 148, 32, D4|en, 178, 32, B4|en, 208, 32, B6, D4|en, 238, 32, B4|en
.db 253, 32, A6|en, 12, 33, A6, F3|en, 42, 33, G5, E4|en, 72, 33, F5, B4, G3
.db F3|en, 102, 33, E5, E4|en, 132, 33, D5, B4, G3, F3|en, 162, 33, C5, E4|en, 192
.db 33, B5, F3|en, 222, 33, A4|en, 252, 33, A5, C4|en, 26, 34, A4|en, 56, 34, A5
.db C4|en, 71, 34, G4|en, 86, 34, A5, A4|en, 101, 34, B5|en, 116, 34, C5, F3|en, 146
.db 34, A4|en, 176, 34, C4|en, 206, 34, A4|en, 236, 34, D5, C4|en, 10, 35, Dis5, A4|en
.db 40, 35, E5, E3|en, 70, 35, A4|en, 100, 35, C4|en, 130, 35, E5, A4|en, 160, 35
.db F5, D4, D3|en, 190, 35, A5, F3|en, 220, 35, C5, G3|en, 250, 35, E4|en, 24, 36
.db G3|en, 54, 36, E4|en, 84, 36, D5, G3|en, 114, 36, G4|en, 129, 36, H5|en, 144, 36
.db D5, E4, C4|en, 159, 36, G5|en, 174, 36, G4|en, 189, 36, G5|en, 204, 36, A5|en, 219
.db 36, G5|en, 234, 36, H5, G4, F4|en, 249, 36, G5|en, 8, 37, C5, G4, E4|en, 23
.db 37, G5|en, 38, 37, D5, G4, F4, D4|en, 53, 37, G5|en, 68, 37, E5, G4, E4
.db C4|en, 83, 37, G5|en, 98, 37, C6|en, 113, 37, H6|en, 128, 37, A6, A4, F3|en, 143
.db 37, G5|en, 158, 37, F5|en, 173, 37, E5|en, 188, 37, D5, H4, G3|en, 203, 37, G5|en
.db 218, 37, F5|en, 233, 37, D5|en, 248, 37, D5, E4, C4|en, 7, 38, G5|en, 22, 38
.db G4|en, 37, 38, G5|en, 52, 38, A5|en, 67, 38, G5|en, 82, 38, H5, G4, F4|en, 97
.db 38, G5|en, 112, 38, C5, G4, E4|en, 127, 38, G5|en, 142, 38, D5, G4, F4, D4|en
.db 157, 38, G5|en, 172, 38, E5, G4, E4, C4|en, 187, 38, G5|en, 202, 38, C6|en, 217
.db 38, H6|en, 232, 38, A6, A4, F3|en, 247, 38, G5|en, 6, 39, F5|en, 21, 39, E5|en
.db 36, 39, D5, H4, G3|en, 51, 39, G5|en, 66, 39, F5|en, 81, 39, D5|en, 96, 39
.db E5, A4, Gis3|en, 111, 39, F5|en, 126, 39, E5|en, 141, 39, Dis5|en, 156, 39, E5|en, 171
.db 39, H5|en, 186, 39, E5|en, 201, 39, Dis5|en, 216, 39, E5|en, 231, 39, H5|en, 246, 39
.db E5|en, 5, 40, Dis5|en, 20, 40, E5|en, 110, 40, H5|en, 140, 40, E5|en, 170, 40, Dis5|en
.db 200, 40, E5|en, 48, 42, EoS|en
;1238

380
Midi/mg/mg.asm Normal file
View File

@ -0,0 +1,380 @@
;----------------------------------------------------------;
; Melody Generator (C)ChaN, 2005
.include "tn45def.inc" ;This is included in "Atmel AVR Studio"
.include "avr.inc"
.include "mg.inc"
.def _0 = r15
.def _Sreg = r14
.def _Zreg = r12
.def _Yreg = r10
.def _TmrH = r9
.def _TmrL = r8
.def _TmrS = r7
.equ N_NOTE = 6
;----------------------------------------------------------;
; Work Area
.dseg
.org RAMTOP
NoteIdx:.byte 1 ; Note rotation index
Notes: .byte (2+3+1+1+1+1)*N_NOTE
.equ ns_freq = 0 ;Angular Speed
.equ ns_rptr = 2 ;Wave table read pointer (16.8 fraction)
.equ ns_lvl = 5 ;Level
.equ ns_wrap = 6 ;Loop Flag
.equ ns_loop = 7 ;Loop Count
.equ ns_lp = 8 ;Level Pointer
.equ nsize = 9 ;size of this structure
;----------------------------------------------------------;
; Program Code
.cseg
; Interrupt Vectors (ATtiny45)
rjmp reset ; Reset
rjmp 0 ; INT0
rjmp 0 ; PCINT0
rjmp 0 ; TC1_COMA
rjmp 0 ; TC1_OVF
rjmp 0 ; TC0_OVF
rjmp 0 ; EE_RDY
rjmp 0 ; ANA_COMP
rjmp 0 ; ADC
rjmp 0 ; TC1_COMB
rjmp isr_tc0_coma ; TC0_COMA
; rjmp 0 ; TC0_COMB
; rjmp 0 ; WDT
; rjmp 0 ; USI_START
; rjmp 0 ; USI_OVF
;--------------------------------------------------------------------;
; Program Code
reset:
clr _0
ldiw X, RAMTOP ;Clear RAM
ldi AL, 0 ;AL = 0
st X+, _0 ; X address of RAM = _0
dec AL ; AL = AL-1
brne PC-2 ;循环256次
; outi OSCCAL, 172 ;Adjust OSCCAL if needed.
outi PORTB, 0b001101 ;Initalize Port B
outi DDRB, 0b010010 ;/
outi PLLCSR, 0b00000110 ;Initialize TC1 in 250 kHz fast PWM mode.
outi TCCR1, 0b01100001 ;Connect TC1 to OC1A
outi GTCCR, 0b01100000 ;Connect TC1 to OC1B
outi OCR0A, 62 ;Initalize TC0 in 32 kHz interval timer.
outi TCCR0A, 0b00000010
outi TCCR0B, 0b00000010
outi TIMSK, (1<<OCIE0A)
start_play:
ldiw Z, score*2 ;score地址放到Z,*2是取低字节地址
cli ;清全局中断标志
clrw _Tmr ;清计数器
clr _TmrS ;清timers
sei ;开中断
pl_next:
lpmw B, Z+ ;//把Z的数放入B,然后z+1
rcall drv_decay ;//调用衰变包络生成函数,遍历每个通道包络值放到ns_lvl寄存器
cli ;//关中断
cpw _Tmr, B ;//比较两个字,
sei ;开中断
brcs PC-5 ;如果C flag==1跳转到pl_next这里<=B则继续循环
pl_note:
lpm CL, Z+ ;把Z地址的数放入CL,也就是乐谱
cpi CL, EoS ;EOS是乐谱结束标志
breq start_play ;结束就跳回start_play
mov AL, CL ;AL = CL
rcall note_on ;调用note_on函数
andi CL, en ;
breq pl_note ;if CL==0 jmp to pl_note
rjmp pl_next ;长跳转(+-2K wordsCL部位0调到pl_next
;--------------------------------------------------------------------;
; Note ON
;
;Call: AL[6:0] = key number
;AL是传递过来的乐谱数据也就是键值
note_on:
pushw Z
mov ZL, AL ;ZL = AL
lsl ZL ;左移一位
clr ZH ;ZH = 0
addiw Z, tbl_pitch*2 ;加载音高表地址
lpmw A, Z+ ;读取音高值到A
lds YL, NoteIdx ;读取NoteIdx音调循环索引到YL
addi YL, 9 ;YL+9
cpi YL, 9*N_NOTE ;比较YL和通道数的9倍
brcs PC+2 ;YL小于9*N_NOTE跳转到继续+9
clr YL ;清掉YL
sts NoteIdx, YL ;NoteIdx = YL
clr YH ;清掉YH
addiw Y, Notes ;YL+Notes
ldiw B, wt_attack*2 ;加载attach表地址到B寄存器
cli ;关中断
stdw Y+ns_freq, A ;把A也就是音高值放入ns_freq寄存器两个字节
stdw Y+ns_rptr+1, B ;把B也就是attach值放入ns_rpter+1(波表读取指针)寄存器,两个字节
sei ;开中断
stdi Y+ns_lvl, 255 ;255放入ns_lvl寄存器
std Y+ns_wrap, AL ;AL放入ns_warp
std Y+ns_loop, _0 ;_0放入ns_loop
std Y+ns_lp, _0 ;_0放入ns_lp
popw Z
ret
;--------------------------------------------------------------------;
; Decay envelope generation 衰变包络生成器
; 1.判断该通道循环标志ns_wrap如果等于255则不需要生成包络跳到下一通道
; 2.判断循环次数ns_loop如果循环次数小于12则不需要生成跳到下一通道
; 3.判断层指针如果层指针小于255则生成完成跳到下一通道否则根据层指针加载包络表数据并放入ns_lvl变量
; 4.判断是否所有通道处理完,处理完则退出
; 该函数也就是遍历所有通道并判断是否需要加载包络表需要的把包络表对应层数数据放到对应通道的ns_lvl变量里面。
; N1:对于Flash存储器的间址取数只能使用Z寄存器。由于程序存储器的地址是以字双字节为单位的因此16位地址指针寄存器Z的高15位为程序存储器的字地址最低位LSB为“0”时指字的低字节为“1”时指字的高字节。程序中使用伪指令db定义的七段码为一个字节他保存在一个字的低字节处。如果定义字应使用伪指令dw。
drv_decay:
pushw Z ;保存地址入栈
ldiw Y, Notes ;加载Notes地址
dd_lp:
ldd AL, Y+ns_wrap ;Has sustain loop not wrapped? 把循环标志数据放入AL
ldi AH, 255 ;把255放入AH
cp AL, AH ;比较AL和AH
breq dd_nxt ;/相等跳转,所以ns_wrap==255时该通道不需要生成包络
std Y+ns_wrap, AH ;Clear wrapped flag. AH的数保存到循环标志寄存器这样下次就不需要再生成包络
ldd AL, Y+ns_loop ;循环数放到AL
inc AL ;循环次数加1
cpi AL, 12 ;循环次数是否到1212大则C flag=1;
brcs PC+2 ;如果C flag==1跳转也就是小于12次
ldi AL, 0 ;大于等于12次则AL清0
std Y+ns_loop, AL ;AL数放到ns_loop循环次数寄存器
brcs dd_nxt ;循环次数小于12跳转到下一通道
ldd ZL, Y+ns_lp ;层指针放到ZL
inc ZL ;层指针+1, 如果溢出ZL=0;则Z flag=1;
breq dd_nxt ;Z flag==1跳转,即层指针溢出则跳到下一通道
std Y+ns_lp, ZL ;不溢出则更新层指针寄存器
clr ZH ;ZH = 0
addiw Z, envelope*2 ;加载包络表地址到Z因为包络表是16x16的单字节存在于Z地址的低8位所以*2。具体查看上面N1注释.
lpm AL, Z ;把Z地址的数据放入AL
std Y+ns_lvl, AL ;包络数据放入lvl层变量
dd_nxt: adiw YL, 9 ;切换到下一个通道的数组9是每通道的结构体长度
cpi YL, low(Notes+nsize*N_NOTE) ;比较是否处理完所有通道
brne dd_lp ;不等跳转,也就是通道还没处理完
popw Z ;出栈Z
ret
;--------------------------------------------------------------------;
; 32 kHz wave form synthesising interrupt
isr_tc0_coma:
in _Sreg, SREG ;Save regs...
movw _Zreg, ZL ;
movw _Yreg, YL ;/
ldiw Y, Notes ;Process all notes
clrw T2 ;Clear accumlator
tone_lp:
ldd EH, Y+ns_rptr ;Load wave table pointer
lddw Z, Y+ns_rptr+1 ;/
lpm EL, Z ;Get a sample
lddw T4, Y+ns_freq ;Load angular speed
add EH, T4L ;Increase wave table ptr (next angle)
adc ZL, T4H ;
adc ZH, _0 ;/
cpi ZH, high(wt_end*2) ;Repeat sustain area
brcs PC+4 ;
subiw Z, (wt_end-wt_loop)*2 ;
std Y+ns_wrap, _0 ;/
std Y+ns_rptr, EH ;Save wave table ptr
stdw Y+ns_rptr+1, Z ;/
ldd EH, Y+ns_lvl ;Apply envelope curve
MULT ;/
addw T2, T0 ;Add the sample to accumlator
adiw YL, 9 ;Next note
cpi YL, low(Notes+nsize*N_NOTE);
brne tone_lp ;/
asrw T2 ;Divide it by 4
asrw T2 ;/
ldiw E, 253 ;Clip it between -255 to 253
cpw T2, E ;
brlt PC+2 ;
movw T2L, EL ;
ldiw E, -255 ;
cpw T2, E ;
brge PC+2 ;
movw T2L, EL ;/
asrw T2 ;Set it to PWM modulator
ror T2H ;
mov EL, T2L ;
subi EL, 0x80 ;
mov EH, EL ;
com EH ;
sbrc T2H, 7 ;
inc EL ;
out OCR1A, EL ;
out OCR1B, EH ;/
sec ;Increment sequense timer
adc _TmrS, _0 ;
adc _TmrL, _0 ;
adc _TmrH, _0 ;/
movw ZL, _Zreg ;Restore regs...
movw YL, _Yreg ;
out SREG, _Sreg ;/
reti
;--------------------------------------------------------------------;
; Score table
;--------------------------------------------------------------------;
score:
.include "melody.asm"
;--------------------------------------------------------------------;
; Pitch number to angular speed conversion table
;--------------------------------------------------------------------;
;Since sustain area of wave table, a cycle of fundamental frequency, is sampled
;in 128 points, the base frequency becomes 32000/128 = 250 Hz. The wave table
;lookup pointer, 16.8 fraction, is increased every sample by these 8.8 fractional
;angular speed values.
tbl_pitch: ; A B H C Cis D Dis E F Fis G Gis
.dw 225, 239, 253, 268, 284, 301, 319, 338, 358, 379, 401, 425 ; 220Hz..
.dw 451, 477, 506, 536, 568, 601, 637, 675, 715, 758, 803, 851 ; 440Hz..
.dw 901, 955, 1011, 1072, 1135, 1203, 1274, 1350, 1430, 1515, 1606, 1701 ; 880Hz..
.dw 1802, 1909, 2023, 2143, 2271, 2406, 2549, 2700, 2861, 3031, 3211, 3402 ; 1760Hz..
.dw 3604, 3818, 4046, 4286, 4542, 4812, 5098, 5400 ; 3520Hz
;--------------------------------------------------------------------;
; Envelope Table
;--------------------------------------------------------------------;
envelope:
.db 255,252,250,247,245,243,240,238,235,233,231,228,226,224,222,219
.db 217,215,213,211,209,207,205,203,201,199,197,195,193,191,189,187
.db 185,183,182,180,178,176,174,173,171,169,168,166,164,163,161,159
.db 158,156,155,153,152,150,149,147,146,144,143,141,140,139,137,136
.db 134,133,132,130,129,128,127,125,124,123,122,120,119,118,117,116
.db 115,113,112,111,110,109,108,107,106,105,104,103,102,101,100,99
.db 98,97,96,95,94,93,92,91,90,89,88,87,87,86,85,84
.db 83,82,82,81,80,79,78,78,77,76,75,75,74,73,72,72
.db 71,70,69,69,68,67,67,66,65,65,64,64,63,62,62,61
.db 60,60,59,59,58,57,57,56,56,55,55,54,54,53,53,52
.db 51,51,50,50,49,49,48,48,48,47,47,46,46,45,45,44
.db 44,43,43,43,42,42,41,40,40,39,39,38,38,37,37,36
.db 35,35,34,34,33,33,32,31,31,30,30,29,29,28,28,27
.db 26,26,25,25,24,24,23,22,22,21,21,20,20,19,19,18
.db 17,17,16,16,15,15,14,13,13,12,12,11,11,10,10,9
.db 8,8,7,7,6,6,5,4,4,3,3,2,2,1,1,0
;--------------------------------------------------------------------;
; Wave Table
;--------------------------------------------------------------------;
; 8bit, 32 ksps, 250 Hz fundamental frequency
.org 3072/2 ; Bottom stored
wt_attack: ; Attack area
.db 0, 0, 0, 0, 0, 0, -1, -2, -2, -3, -2, -2, -1, 0, 0, 0
.db 0, 0, -1, -2, -3, -3, -4, -4, -3, -2, -1, 0, 0, 1, 0, 0
.db 0, -1, -2, -3, -3, -2, 0, 0, 2, 4, 5, 5, 5, 3, 1, 0
.db -2, -3, -4, -3, -2, 0, 1, 2, 3, 2, 0, -2, -6, -11, -15, -18
.db -19, -19, -16, -11, -5, 1, 8, 15, 20, 23, 24, 23, 20, 17, 13, 10
.db 7, 6, 6, 8, 10, 13, 16, 18, 20, 20, 20, 19, 18, 18, 18, 18
.db 19, 21, 24, 26, 27, 28, 27, 25, 22, 17, 11, 5, 0, -5, -9, -12
.db -13, -13, -11, -9, -5, -1, 1, 4, 6, 6, 4, 0, -5, -12, -21, -30
.db -39, -48, -56, -62, -66, -69, -70, -71, -70, -70, -70, -71, -72, -75, -77, -79
.db -80, -78, -75, -69, -61, -50, -38, -26, -13, -2, 7, 15, 21, 25, 28, 30
.db 33, 36, 40, 44, 49, 55, 59, 61, 62, 60, 56, 49, 42, 34, 27, 22
.db 20, 21, 25, 33, 42, 52, 63, 72, 80, 86, 89, 90, 89, 87, 84, 81
.db 79, 77, 75, 73, 72, 69, 66, 61, 55, 48, 39, 31, 22, 14, 6, 0
.db -5, -10, -14, -17, -20, -22, -24, -26, -28, -29, -30, -31, -32, -33, -34, -35
.db -36, -37, -39, -41, -44, -48, -52, -57, -63, -70, -77, -85, -94, -102, -110, -116
.db -121, -124, -124, -121, -116, -109, -99, -89, -78, -68, -60, -53, -48, -45, -43, -43
.db -43, -42, -41, -40, -37, -33, -29, -25, -22, -19, -17, -16, -15, -14, -12, -9
.db -4, 2, 11, 22, 34, 46, 57, 67, 75, 81, 84, 86, 87, 86, 86, 85
.db 85, 85, 86, 86, 87, 86, 84, 82, 78, 73, 69, 64, 60, 58, 56, 57
.db 59, 62, 66, 70, 75, 79, 83, 86, 89, 91, 92, 92, 92, 90, 86, 81
.db 73, 63, 52, 38, 24, 9, -5, -19, -31, -42, -50, -57, -61, -64, -66, -67
.db -68, -68, -68, -67, -66, -64, -61, -56, -52, -46, -41, -36, -32, -29, -28, -28
.db -30, -34, -39, -44, -50, -56, -62, -68, -74, -79, -84, -90, -95, -100, -104, -107
.db -108, -108, -107, -103, -98, -92, -84, -76, -67, -58, -49, -40, -32, -24, -16, -8
.db -1, 5, 11, 16, 20, 22, 22, 21, 18, 14, 10, 5, 1, -1, -3, -3
.db -2, 0, 1, 5, 9, 12, 16, 20, 24, 28, 34, 40, 47, 55, 64, 72
.db 81, 89, 96, 101, 105, 108, 108, 108, 107, 105, 103, 101, 100, 98, 96, 93
.db 90, 87, 83, 79, 75, 70, 66, 62, 59, 56, 55, 53, 52, 51, 50, 48
.db 46, 44, 42, 39, 37, 34, 31, 28, 24, 20, 15, 10, 3, -3, -12, -21
.db -30, -39, -48, -57, -65, -72, -79, -85, -90, -95, -99, -103, -106, -109, -110, -112
.db -112, -112, -111, -110, -109, -107, -106, -105, -104, -104, -103, -102, -101, -99, -97, -94
.db -90, -86, -82, -78, -75, -72, -69, -67, -65, -63, -61, -58, -54, -50, -44, -38
.db -31, -23, -16, -10, -4, 1, 6, 10, 14, 18, 23, 27, 32, 38, 43, 49
.db 54, 59, 63, 67, 70, 73, 75, 77, 79, 81, 83, 85, 88, 91, 93, 96
.db 99, 101, 103, 105, 107, 109, 110, 111, 112, 112, 112, 111, 109, 107, 104, 100
.db 96, 92, 88, 83, 79, 75, 70, 65, 60, 55, 49, 43, 36, 30, 24, 18
.db 12, 7, 3, 0, -3, -6, -8, -11, -14, -17, -20, -24, -28, -32, -37, -42
.db -46, -51, -55, -59, -63, -67, -71, -75, -79, -82, -85, -88, -91, -93, -95, -97
.db -98, -100, -101, -102, -103, -104, -104, -104, -103, -101, -99, -96, -93, -89, -86, -83
.db -80, -78, -76, -75, -74, -73, -72, -71, -70, -68, -65, -63, -59, -56, -52, -48
.db -44, -40, -35, -30, -24, -18, -11, -4, 3, 11, 19, 27, 34, 41, 48, 53
.db 58, 63, 67, 71, 75, 79, 82, 86, 89, 92, 94, 95, 96, 97, 98, 98
.db 99, 100, 101, 103, 105, 108, 110, 112, 114, 115, 115, 114, 113, 110, 107, 103
.db 99, 95, 91, 87, 83, 79, 74, 70, 65, 59, 53, 47, 41, 35, 29, 24
.db 19, 14, 11, 7, 4, 1, -1, -5, -9, -14, -19, -25, -31, -37, -43, -50
.db -56, -62, -68, -73, -78, -83, -88, -92, -97, -101, -105, -109, -112, -115, -117, -119
.db -120, -121, -120, -119, -118, -116, -114, -112, -109, -106, -104, -101, -99, -96, -94, -91
.db -88, -85, -81, -78, -74, -70, -66, -62, -57, -53, -49, -45, -41, -37, -32, -27
.db -22, -16, -10, -4, 1, 8, 14, 20, 25, 31, 36, 41, 46, 50, 55, 60
.db 64, 69, 73, 77, 81, 85, 88, 90, 93, 95, 97, 99, 101, 103, 106, 109
.db 112, 115, 118, 121, 123, 125, 126, 126, 125, 125, 123, 121, 119, 117, 115, 112
.db 110, 107, 103, 99, 94, 89, 83, 76, 69, 62, 54, 47, 39, 31, 24, 16
.db 9, 2, -4, -11, -18, -25, -31, -38, -44, -51, -57, -62, -68, -73, -79, -84
.db -88, -93, -97, -102, -106, -109, -113, -116, -119, -121, -123, -124, -125, -126, -127, -127
.db -127, -127, -126, -125, -125, -123, -122, -120, -118, -116, -114, -111, -107, -104, -100, -95
.db -91, -86, -80, -75, -69, -63, -58, -52, -46, -40, -34, -28, -22, -16, -10, -4
wt_loop: ; Sustain area
.db 0, 5, 11, 17, 23, 28, 34, 39, 45, 50, 55, 60, 65, 69, 74, 78
.db 82, 85, 89, 92, 95, 98, 100, 102, 104, 106, 107, 109, 109, 110, 110, 111
.db 110, 110, 109, 108, 107, 106, 104, 102, 100, 98, 95, 93, 90, 87, 83, 80
.db 76, 72, 68, 64, 59, 55, 50, 46, 41, 36, 31, 26, 21, 15, 10, 5
.db 0, -5, -10, -15, -21, -26, -31, -36, -41, -46, -50, -55, -59, -64, -68, -72
.db -76, -80, -83, -87, -90, -93, -95, -98, -100, -102, -104, -106, -107, -108, -109, -110
.db -110, -111, -110, -110, -109, -109, -107, -106, -104, -102, -100, -98, -95, -92, -89, -85
.db -82, -78, -74, -69, -65, -60, -55, -50, -45, -39, -34, -28, -23, -17, -11, -5
wt_end:

195
Midi/mg/mg.hex Normal file
View File

@ -0,0 +1,195 @@
:020000020000FC
:100000000AC0FECFFDCFFCCFFBCFFACFF9CFF8CFA0
:10001000F7CFF6CF73C0FF24A0E6B0E000E0FD927A
:100020000A95E9F70DE008BB02E107BB06E007BD52
:1000300001E600BF00E60CBD0EE309BD02E00ABD0B
:1000400002E003BF00E109BFEEEBF1E0F894882481
:100050009924772478942591359131D0F89482169B
:1000600093067894D0F345914F3F71F3042F03D05A
:100070004078C9F3F0CFFF93EF93E02FEE0FFF2707
:10008000EC56F94F05911591C0916000C75FC633DA
:1000900008F0CC27C0936000DD27CF59DF4F20E068
:1000A0003CE0F894198308833C832B8378940FEF0A
:1000B0000D830E83FF82F886EF91FF910895FF93E1
:1000C000EF93C1E6D0E00E811FEF011789F01E8388
:1000D0000F8103950C3008F000E00F8348F0E885AD
:1000E000E39531F0E887FF27EC5FF84F04910D832B
:1000F0002996C73941F7EF91FF910895EFB66F0147
:100100005E01C1E6D0E0222433249A81EB81FC8198
:10011000849148805980940DE51DFF1DF03118F041
:10012000E058F040FE829A83FC83EB839D81182E79
:1001300087FD8195002490FD080E069491FD080E20
:10014000069492FD080E069493FD080E002494FD7B
:10015000080E069495FD080E069496FD080E06946A
:1001600097FD080E110C1F2C10F401941108200C9F
:10017000311C2996C73949F635942794359427942C
:100180008DEF90E0281639060CF01C0181E09FEFFE
:10019000281639060CF41C01359427943794822DC7
:1001A0008058982F909537FC83958EBD9BBD089401
:1001B0007F1C8F1C9F1CF601E501EFBE189578008F
:1001C000AB9600AAB400ABD200AAF000AB0E01A619
:1001D0002C01A94A01A76801248C860193A40198E7
:1001E000C2019BE0019FFE01A41C0226873A0293F4
:1001F00058029776029F9402A3B202A6D002278CDF
:10020000EE02930C03982A039F4803AB6603AA846B
:1002100003ABA203AAC003ABDE03A6FC03A91A0426
:10022000A73804248C56049374049892049BB00459
:100230009FCE04A4EC0426870A059328059746055B
:100240009F6405A78205A6A005248CBE0593DC0546
:10025000981806AB3606AA5406AB7206AA9006ABEF
:10026000AE06A6CC06A9EA06A70807248C260793A3
:1002700044079862079B80079F9E07A4BC072687B8
:10028000DA0793F8079716089F3408A35208A67058
:1002900008278C8E0893AC0898CA089FE808AB061C
:1002A00009AA2409AB4209AA6009AB7E09A69C09E8
:1002B000A9BA09A7D809248CF60993140A98320A16
:1002C0009B500A9F6E0AA48C0A2687AA0A93C80A22
:1002D00097E60A9F040BA7220BA6400B248C5E0B0B
:1002E000937C0B989A0BA6B80BA7D60BA9F40B2BF3
:1002F0008F120C96300C9B4E0CA26C0CAC8A0CAB83
:10030000A80C298AC60C96E40C98020DA0200DAB0F
:100310003E0DA95C0D278C7A0D93980D98B60D9F14
:10032000D40DA9F20DA7100E26872E0E934C0E9F0A
:100330006A0E9F880EABA60E9FC40EABE20EAB00FA
:100340000FB71E0FAA3C0FAB5A0FAA780FAB960F30
:10035000AAB40FABD20FAAF00FAB0E10AA2C10ABA1
:100360004A10AA6810AB8610A6A410A9C210A7E074
:1003700010248CFE10931C11983A119B58119F76F3
:1003800011A494112687B21193D01197EE119F0CEE
:1003900012A32A12A64812278C661293841298A2DE
:1003A000129FC012ABDE12AAFC12AB1A13AA3813AA
:1003B000AB5613A67413A99213A7B013248CCE13B3
:1003C00093EC13980A149B28149F4614A4641426D3
:1003D00087821493A01497BE149FDC14A7FA14A666
:1003E0001815248C3615935415987215A69015A7D8
:1003F000AE15A9CC152B8FEA159608169B2616A2CA
:100400004416AC6216AB8016298A9E1696BC1698C6
:10041000DA16A0F816AB1617A93417278C521793C3
:100420007017988E179FAC17A9CA17A7E8172687C9
:1004300006189324189F42189F6018AB7E189F9C43
:1004400018ABBA18ABD818B7F618AA1419AB3219EA
:10045000AA5019AB6E19AA8C19ABAA19AAC819AB64
:10046000E619AA041AAB221AAA401AAB5E1AA67C95
:100470001AA99A1AA7B81A248CD61A93F41A9812A1
:100480001B9B301B9F4E1BA46C1B26878A1B93A8AB
:100490001B97C61B9FE41BA3021CA6201C278C3E97
:1004A0001C935C1C987A1C9F981CABB61CAAD41C8D
:1004B000ABF21CAA101DAB2E1DA64C1DA96A1DA7D0
:1004C000881D248CA61D93C41D98E21D9B001E9FB1
:1004D0001E1EA43C1E26875A1E93781E97961E9FAA
:1004E000B41EA7D21EA6F01E248C0E1F932C1F989C
:1004F0004A1F271F1B99681F27201B98861F27222A
:100500001F1996A41F2794C21F98E01F9BFE1F98D7
:100510001C202C9B3A20984920AB58202B94762005
:100520009994209DB22099D020319DEE2099FD20F4
:10053000B00C2130942A212E9F48212C1916946644
:10054000212B9F842129191694A221279FC02125A0
:1005500094DE2198FC21249B1A22983822249B4760
:1005600022A2562224986522A574222794922298CA
:10057000B0229BCE2298EC22299B0A232A9828237A
:100580002B9346239864239B82232B98A0232C1D16
:1005900091BE232494DC232796FA239F18249636B1
:1005A000249F542429967224A28124A69024291FD2
:1005B0009B9F24AEAE24A2BD24AECC24A4DB24AEEB
:1005C000EA242622A0F924AE082527229F1725AE6B
:1005D00026252922209D3525AE44252B221F9B53FD
:1005E00025AE6225B37125B280253018948F25AED3
:1005F0009E25ACAD25ABBC25291A96CB25AEDA25B8
:10060000ACE925A9F825291F9B0726AE1626A225A9
:1006100026AE3426A44326AE52262622A06126AE5C
:10062000702627229F7F26AE8E262922209D9D267A
:10063000AEAC262B221F9BBB26AECA26B3D926B250
:10064000E826301894F726AE0627AC1527AB2427EA
:10065000291A963327AE4227AC5127A960272B18B9
:10066000976F27AC7E27AB8D27AA9C27ABAB27A61D
:10067000BA27ABC927AAD827ABE727A6F627AB0529
:1006800028AA1428AB6E28A68C28ABAA28AAC828AA
:10069000AB302AFFE100EF00FD000C011C012D0131
:1006A0003F01520166017B019101A901C301DD01F6
:1006B000FA011802380259027D02A302CB02F602A7
:1006C000230353038503BB03F30330046F04B30414
:1006D000FA0446059605EB054606A5060A077507C2
:1006E000E7075F08DF086609F5098C0A2D0BD70BB1
:1006F0008B0C4A0D140EEA0ECE0FBE10BE11CC129A
:10070000EA131815FFFCFAF7F5F3F0EEEBE9E7E46E
:10071000E2E0DEDBD9D7D5D3D1CFCDCBC9C7C5C3B6
:10072000C1BFBDBBB9B7B6B4B2B0AEADABA9A8A698
:10073000A4A3A19F9E9C9B999896959392908F8D30
:100740008C8B89888685848281807F7D7C7B7A788A
:10075000777675747371706F6E6D6C6B6A696867AC
:10076000666564636261605F5E5D5C5B5A595857A1
:100770005756555453525251504F4E4E4D4C4B4B71
:100780004A49484847464545444343424141404021
:100790003F3E3E3D3C3C3B3B3A39393838373736B3
:1007A000363535343333323231313030302F2F2E2D
:1007B0002E2D2D2C2C2B2B2B2A2A29282827272697
:1007C00026252524232322222121201F1F1E1E1D12
:1007D0001D1C1C1B1A1A1919181817161615151492
:1007E00014131312111110100F0F0E0D0D0C0C0B12
:1007F0000B0A0A0908080707060605040403030292
:0408000002010100F0
:100C0000000000000000FFFEFEFDFEFEFF000000F1
:100C10000000FFFEFDFDFCFCFDFEFF0000010000EA
:100C200000FFFEFDFDFE00000204050505030100B6
:100C3000FEFDFCFDFE000102030200FEFAF5F1EEEE
:100C4000EDEDF0F5FB01080F1417181714110D0A3C
:100C5000070606080A0D10121414141312121212A9
:100C60001315181A1B1C1B1916110B0500FBF7F4A2
:100C7000F3F3F5F7FBFF010406060400FBF4EBE2D7
:100C8000D9D0C8C2BEBBBAB9BABABAB9B8B5B3B18D
:100C9000B0B2B5BBC3CEDAE6F3FE070F15191C1EC2
:100CA0002124282C31373B3D3E3C38312A221B166B
:100CB000141519212A343F485056595A595754513E
:100CC0004F4D4B494845423D3730271F160E060011
:100CD000FBF6F2EFECEAE8E6E4E3E2E1E0DFDEDD9A
:100CE000DCDBD9D7D4D0CCC7C1BAB3ABA29A928C33
:100CF000878484878C939DA7B2BCC4CBD0D3D5D531
:100D0000D5D6D7D8DBDFE3E7EAEDEFF0F1F2F4F781
:100D1000FC020B16222E39434B515456575656554A
:100D200055555656575654524E4945403C3A383917
:100D30003B3E42464B4F5356595B5C5C5C5A5651A6
:100D4000493F34261809FBEDE1D6CEC7C3C0BEBD6E
:100D5000BCBCBCBDBEC0C3C8CCD2D7DCE0E3E4E4BD
:100D6000E2DED9D4CEC8C2BCB6B1ACA6A19C9895DF
:100D7000949495999EA4ACB4BDC6CFD8E0E8F0F8A1
:100D8000FF050B1014161615120E0A0501FFFDFDC6
:100D9000FE000105090C1014181C22282F374048AA
:100DA00051596065696C6C6C6B6967656462605D04
:100DB0005A57534F4B46423E3B3837353433323027
:100DC0002E2C2A2725221F1C18140F0A03FDF4EBD2
:100DD000E2D9D0C7BFB8B1ABA6A19D999693929026
:100DE00090909192939596979898999A9B9D9FA28F
:100DF000A6AAAEB2B5B8BBBDBFC1C3C6CACED4DA0F
:100E0000E1E9F0F6FC01060A0E12171B20262B3131
:100E1000363B3F4346494B4D4F515355585B5D6000
:100E2000636567696B6D6E6F7070706F6D6B686412
:100E3000605C58534F4B46413C37312B241E1812EF
:100E40000C070300FDFAF8F5F2EFECE8E4E0DBD67E
:100E5000D2CDC9C5C1BDB9B5B1AEABA8A5A3A19F3F
:100E60009E9C9B9A99989898999B9DA0A3A7AAADA0
:100E7000B0B2B4B5B6B7B8B9BABCBFC1C5C8CCD0AA
:100E8000D4D8DDE2E8EEF5FC030B131B2229303544
:100E90003A3F43474B4F5256595C5E5F6061626216
:100EA00063646567696C6E7072737372716E6B6781
:100EB000635F5B57534F4A46413B352F29231D182B
:100EC000130E0B070401FFFBF7F2EDE7E1DBD5CED4
:100ED000C8C2BCB7B2ADA8A49F9B9793908D8B89D5
:100EE000888788898A8C8E909396989B9DA0A2A5CE
:100EF000A8ABAFB2B6BABEC2C7CBCFD3D7DBE0E5A3
:100F0000EAF0F6FC01080E14191F24292E32373C92
:100F10004045494D5155585A5D5F616365676A6D3B
:100F2000707376797B7D7E7E7D7D7B79777573703E
:100F30006E6B67635E59534C453E362F271F181062
:100F40000902FCF5EEE7E1DAD4CDC7C2BCB7B1AC1B
:100F5000A8A39F9A96938F8C8987858483828181A9
:100F600081818283838586888A8C8E9195989CA1C5
:100F7000A5AAB0B5BBC1C6CCD2D8DEE4EAF0F6FC77
:100F800000050B11171C22272D32373C41454A4ED4
:100F90005255595C5F626466686A6B6D6D6E6E6F08
:100FA0006E6E6D6C6B6A686664625F5D5A57535013
:100FB0004C4844403B37322E29241F1A150F0A058E
:100FC00000FBF6F1EBE6E1DCD7D2CEC9C5C0BCB878
:100FD000B4B0ADA9A6A3A19E9C9A9896959493921D
:100FE0009291929293939596989A9C9EA1A4A7AB66
:100FF000AEB2B6BBBFC4C9CED3D9DEE4E9EFF5FBD0
:00000001FF

105
Midi/mg/mg.inc Normal file
View File

@ -0,0 +1,105 @@
;----------------------------------------------------------;
; Melody Generator Include File
.equ A2 = 0 ;220Hz
.equ B2 = 1
.equ H2 = 2
.equ C2 = 3
.equ Cis2 = 4
.equ D2 = 5
.equ Dis2 = 6
.equ E2 = 7
.equ F2 = 8
.equ Fis2 = 9
.equ G2 = 10
.equ Gis2 = 11
.equ A3 = 12 ;440Hz
.equ B3 = 13
.equ H3 = 14
.equ C3 = 15
.equ Cis3 = 16
.equ D3 = 17
.equ Dis3 = 18
.equ E3 = 19
.equ F3 = 20
.equ Fis3 = 21
.equ G3 = 22
.equ Gis3 = 23
.equ A4 = 24 ;880Hz
.equ B4 = 25
.equ H4 = 26
.equ C4 = 27
.equ Cis4 = 28
.equ D4 = 29
.equ Dis4 = 30
.equ E4 = 31
.equ F4 = 32
.equ Fis4 = 33
.equ G4 = 34
.equ Gis4 = 35
.equ A5 = 36 ;1760Hz
.equ B5 = 37
.equ H5 = 38
.equ C5 = 39
.equ Cis5 = 40
.equ D5 = 41
.equ Dis5 = 42
.equ E5 = 43
.equ F5 = 44
.equ Fis5 = 45
.equ G5 = 46
.equ Gis5 = 47
.equ A6 = 48 ;3520Hz
.equ B6 = 49
.equ H6 = 50
.equ C6 = 51
.equ Cis6 = 52
.equ D6 = 53
.equ Dis6 = 54
.equ E6 = 55
.equ EoS = 255 ;End of score
.equ en = 128 ;End of line flag
;--------------------------------------------------------------------;
; T0 = int8(EL) x .uint8(EH), 32clks
.macro MULT
mov T0H, EL
sbrc EL, 7
neg EL
clr T0L
sbrc EH, 0
add T0L, EL
lsr T0L
sbrc EH, 1
add T0L, EL
lsr T0L
sbrc EH, 2
add T0L, EL
lsr T0L
sbrc EH, 3
add T0L, EL
clr T0L
sbrc EH, 4
add T0L, EL
lsr T0L
sbrc EH, 5
add T0L, EL
lsr T0L
sbrc EH, 6
add T0L, EL
lsr T0L
sbrc EH, 7
add T0L, EL
lsl T0H
mov T0H, _0
brcc PC+3
neg T0L
sbc T0H, T0H
.endm

13
Midi/mg/mg.tuo Normal file
View File

@ -0,0 +1,13 @@
<?xml version="1.0" encoding="Windows-1252" ?>
<TKStudioOptions Version="3.00" Author="YinHandong[Òüº®¶¬]">
<Projects OPTPES="96,0,0,0,2,0,0,">
<Project ProjectGUID="{B5E5CA21-3769-4e16-8D6B-2558BD6CC37A}" Name="mg" ACTCFG="DebugRel">
<TARGOPT Name="DebugRel" OPTDF="0">
<OPTFFF VAL="&lt;.\mg.asm&gt; {0,1,-1,-1,234,234,804,863,215,3062}" />
<OPTFFF VAL="&lt;.\mg.inc&gt; {0,1,-1,-1,208,208,752,834,37,0}" />
<OPTFFF VAL="&lt;.\melody.asm&gt; {0,1,-1,-1,260,260,830,889,12,6700}" />
<OPTFFF VAL="&lt;.\avr.inc&gt; {2,3,-1,-1,286,286,856,915,0,0}" />
</TARGOPT>
</Project>
</Projects>
</TKStudioOptions>

23
Midi/mg/mg.xmp Normal file
View File

@ -0,0 +1,23 @@
<?xml version="1.0" encoding="Windows-1252" ?>
<TKStudioProject Name="mg" ProjectGUID="{B5E5CA21-3769-4e16-8D6B-2558BD6CC37A}" BuildTool="8" ToolVer="" Version="3.00" Author="YinHandong[Òüº®¶¬]">
<Configurations>
<Configuration Name="DebugRel" F_CPU="0" XROM="0,0,0,0#0,0,0,0#0,0,0,0" XRAM="0,0,0,0#0,0,0,0#0,0,0,0" OldName="DebugRel" CLK="20.000000" IROM="1,0x00000000,0x00004000,1#0,0,0,0" IRAM="1,0x00000000,0x00000400,0#0,0,0,0" OldCPU="ATmega168" OPTDBG="1,-1,1,1,1,0,()" DEVICE="ATmega168" VENDOR="Atmel" FAMINY="8" SIMCLK="20.000000">
<AVR_Output OutName="0,.\DebugRel\mg" OutType="1" OutMK="0" OutHex="0" OutList="0,.\DebugRel" Debug="1" />
<AVR_User BfC="0,&lt;&gt;#0,&lt;&gt;" BfB="0,&lt;&gt;#0,&lt;&gt;" AfB="0,&lt;&gt;#0,&lt;&gt;" Beep="1" SDebug="0" />
<AVR_CParam Def="" uDef="" Inc="" Misc="" Opt="0" Code="4" Language="0,0,0,0,0,0" List="0" />
<AVR_AsmParam Def="" uDef="" Inc="" Misc="" Code="0,0,0,2" Language="0" List="1" />
<AVR_Linker Misc="" UseDef="1" Code="0,0" Sct="" List="1,1" Lib="0,0,0,0,0,0" />
<AVR_Debug DbgType="0" sfSIM="1,1,&lt;&gt;,&lt;&gt;" hwSIM="1,1,1,&lt;&gt;" Drv="(),&lt;&gt;" SrvOpt="" />
<DeviceProperties Item0="CPU=IRAM(0-0x3FF) IROM(0-0x3FFF) CLOCK(20000000) CPUTYPE(AVR 8-RISC) INFO(311)" Item1='MON=SAVR.DLL(&quot;-pATmega168&quot;)' Item2='SIM=SAVR.DLL(&quot;-pATmega168&quot;)' />
<DeviceDescription Description="High Performance, Low Power AVR? 8-Bit Microcontroller&#x0D;&#x0A;Advanced RISC Architecture&#x0D;&#x0A;¨C 131 Powerful Instructions &#x0D;&#x0A;¨C 32 x 8 General Purpose Working Registers&#x0D;&#x0A;¨C Fully Static Operation&#x0D;&#x0A;¨C Up to 20 MIPS Throughput at 20 MHz&#x0D;&#x0A;¨C On-chip 2-cycle Multiplier&#x0D;&#x0A;High Endurance Non-volatile Memory segments&#x0D;&#x0A;¨C 16K Bytes of In-System Self-programmable Flash program memory&#x0D;&#x0A;¨C 512 Bytes EEPROM&#x0D;&#x0A;¨C 1K Bytes Internal SRAM&#x0D;&#x0A;¨C Write/Erase cyles: 10,000 Flash/100,000 EEPROM&#x0D;&#x0A;I/O and Packages&#x0D;&#x0A;¨C 23 Programmable I/O Lines&#x0D;&#x0A;¨C 28-pin PDIP, 32-lead TQFP, 28-pad QFN/MLF and 32-pad QFN/MLF" />
</Configuration>
</Configurations>
<Files>
<Filter Name="Source Files" />
<File RelativePath="AVR.INC" FileType="5" />
<File RelativePath="melody.asm" FileType="2" Output="melody.o" />
<File RelativePath="mg.asm" FileType="2" Output="mg.o" />
<File RelativePath="mg.inc" FileType="5" />
<Filter Name="DebugRel" />
</Files>
</TKStudioProject>

BIN
Midi/mg/p1.wav Normal file

Binary file not shown.

58
Midi/mg/wav2asm.pl Normal file
View File

@ -0,0 +1,58 @@
# waveform to ASM converter
if(!open(RHA, "p1.wav")) # source file
{ die "File could not opend." }
binmode RHA;
read(RHA, $sign, 4);
if($sign ne "RIFF") { die "Not wav file"; }
read(RHA, $dmy, 4);
read(RHA, $sign, 4);
if($sign ne "WAVE") { die "Not wav file"; }
read(RHA, $sign, 4);
if($sign ne "fmt ") { die "Not fmt"; }
read(RHA, $siz, 4);
$lfmt = unpack('L4', $siz);
if($lfmt > 100) { die "Invalid format"; }
read(RHA, $cfmt, $lfmt);
$id = unpack('S2', substr($cfmt, 0, 2));
$nchan = unpack('S2', substr($cfmt, 2, 2));
$nsamp = unpack('L4', substr($cfmt, 4, 4));
$nrate = unpack('L4', substr($cfmt, 8, 4));
$nblk = unpack('S2', substr($cfmt, 12, 2));
$nbit = unpack('S2', substr($cfmt, 14, 2));
print "id = $id\n";
print "channels = $nchan ch\n";
print "sampling freq = $nsamp Hz\n";
print "data rate = $nrate bytes/sec\n";
print "block size = $nblk bytes\n";
print "bit/sample = $nbit bit\n";
if($id != 1) { die "Invalid format (not LPCM)"; } # linear?
if($nchan != 1) { die "Invalid format (not Mono)"; } # mono?
if($nbit != 16) { die "Invalid format (not 16bit)"; } # 16bit?
read(RHA, $sign, 4);
if($sign ne "data") { die "No data"; }
read(RHA, $siz, 4);
$ldata = unpack('L4', $siz) / 2;
print "samples = $ldata\n";
$c = 0;
while ($ldata--) {
read(RHA, $bdat, 2);
$val = int(unpack('s2', $bdat) / 256);
if($c == 0) {
print "\n\t.db $val";
} else {
print ", $val";
}
$c = ($c+1) & 15;
}
print "\n";
close RHA;
exit;

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,2 @@
midi-to-hex.exe -l midiFilieList.txt
pause

View File

@ -0,0 +1,121 @@
:020000020000FC
:100000000AC0FECFFDCFFCCFFBCFFACFF9CFF8CFA0
:10001000F7CFF6CF8FC0FF24A0E6B0E000E0FD925E
:100020000A95E9F70DE008BB02E107BB06E007BD52
:1000300001E600BF00E60CBD0EE309BD02E00ABD0B
:1000400002E003BF00E109BFE0E0F8E0F894882493
:1000500099247724AEE8B0E0FD92FC927894F8946D
:100060004F2C5F2C0591400E5F1C0F3FD9F3AEE87B
:10007000B0E02D913C91240D351DAEE8B0E02D93FC
:100080003C93789438D0F894821693067894D0F301
:1000900045914F3F29F0042F0AD04078C9F3DFCFB4
:1000A00005B70774006305BF00E007BB8895FF93A1
:1000B000EF93E02FEE0FFF27EA50FE4F05911591C9
:1000C000C0916000C75FCD3208F0CC27C0936000BC
:1000D000DD27CF59DF4F26E633E0F89419830883F4
:1000E0003C832B8378940FEF0D830E83FF82F88679
:1000F000EF91FF910895FF93EF93C1E6D0E00E8159
:100100001FEF011789F01E830F8103950C3008F053
:1001100000E00F8348F0E885E39531F0E887FF279A
:10012000EA59FD4F04910D832996CE3841F7EF919E
:10013000FF910895EFB66F015E01C1E6D0E0222481
:1001400033249A81EB81FC81849148805980940DFD
:10015000E51DFF1DF73018F0E058F040FE829A834D
:10016000FC83EB839D81182E87FD8195002490FDF3
:10017000080E069491FD080E069492FD080E069452
:1001800093FD080E002494FD080E069495FD080EBC
:10019000069496FD080E069497FD080E110C1F2C70
:1001A00010F401941108200C311C2996CE3849F620
:1001B00035942794359427948DEF90E028163906CE
:1001C0000CF01C0181E09FEF281639060CF41C018D
:1001D000359427943794822D8058982F909537FC2A
:1001E00083958EBD9BBD08947F1C8F1C9F1CF601C0
:1001F000E501EFBE1895E100EF00FD000C011C01C8
:100200002D013F01520166017B019101A901C3014A
:10021000DD01FA011802380259027D02A302CB0265
:10022000F602230353038503BB03F30330046F0477
:10023000B304FA0446059605EB054606A5060A072B
:100240007507E7075F08DF086609F5098C0A2D0BBB
:10025000D70B8B0C4A0D140EEA0ECE0FBE10BE113A
:10026000CC12EA131815FFFCFAF7F5F3F0EEEBE900
:10027000E7E4E2E0DEDBD9D7D5D3D1CFCDCBC9C718
:10028000C5C3C1BFBDBBB9B7B6B4B2B0AEADABA903
:10029000A8A6A4A3A19F9E9C9B99989695939290A3
:1002A0008F8D8C8B89888685848281807F7D7C7B05
:1002B0007A78777675747371706F6E6D6C6B6A692E
:1002C0006867666564636261605F5E5D5C5B5A5926
:1002D00058575756555453525251504F4E4E4D4CFD
:1002E0004B4B4A49484847464545444343424141B0
:1002F00040403F3E3E3D3C3C3B3B3A393938383745
:100300003736363535343333323231313030302FC1
:100310002F2E2E2D2D2C2C2B2B2B2A2A292828272B
:10032000272626252524232322222121201F1F1EA4
:100330001E1D1D1C1C1B1A1A191918181716161524
:10034000151414131312111110100F0F0E0D0D0CA4
:100350000C0B0B0A0A090808070706060504040324
:10036000030202010100000000000000FFFEFEFD8C
:10037000FEFEFF0000000000FFFEFDFDFCFCFDFE98
:10038000FF000001000000FFFEFDFDFE0000020472
:10039000050505030100FEFDFCFDFE000102030250
:1003A00000FEFAF5F1EEEDEDF0F5FB01080F141784
:1003B000181714110D0A070606080A0D1012141456
:1003C0001413121212121315181A1B1C1B191611D2
:1003D0000B0500FBF7F4F3F3F5F7FBFF010406064A
:1003E0000400FBF4EBE2D9D0C8C2BEBBBAB9BABABA
:1003F000BAB9B8B5B3B1B0B2B5BBC3CEDAE6F3FEA5
:10040000070F15191C1E2124282C31373B3D3E3C7B
:1004100038312A221B16141519212A343F48505608
:10042000595A595754514F4D4B494845423D373021
:10043000271F160E0600FBF6F2EFECEAE8E6E4E30F
:10044000E2E1E0DFDEDDDCDBD9D7D4D0CCC7C1BA56
:10045000B3ABA29A928C878484878C939DA7B2BCFD
:10046000C4CBD0D3D5D5D5D6D7D8DBDFE3E7EAEDFB
:10047000EFF0F1F2F4F7FC020B16222E39434B5148
:1004800054565756565555555656575654524E492A
:1004900045403C3A38393B3E42464B4F5356595BF8
:1004A0005C5C5C5A5651493F34261809FBEDE1D695
:1004B000CEC7C3C0BEBDBCBCBCBDBEC0C3C8CCD211
:1004C000D7DCE0E3E4E4E2DED9D4CEC8C2BCB6B106
:1004D000ACA6A19C9895949495999EA4ACB4BDC6E5
:1004E000CFD8E0E8F0F8FF050B1014161615120E21
:1004F0000A0501FFFDFDFE000105090C1014181C82
:1005000022282F37404851596065696C6C6C6B69C3
:1005100067656462605D5A57534F4B46423E3B38B5
:100520003735343332302E2C2A2725221F1C18143D
:100530000F0A03FDF4EBE2D9D0C7BFB8B1ABA6A157
:100540009D99969392909090919293959697989862
:10055000999A9B9D9FA2A6AAAEB2B5B8BBBDBFC1DA
:10056000C3C6CACED4DAE1E9F0F6FC01060A0E12DF
:10057000171B20262B31363B3F4346494B4D4F51ED
:100580005355585B5D60636567696B6D6E6F707026
:10059000706F6D6B6864605C58534F4B46413C37DD
:1005A000312B241E18120C070300FDFAF8F5F2EFA8
:1005B000ECE8E4E0DBD6D2CDC9C5C1BDB9B5B1AE7A
:1005C000ABA8A5A3A19F9E9C9B9A99989898999B4C
:1005D0009DA0A3A7AAADB0B2B4B5B6B7B8B9BABC1E
:1005E000BFC1C5C8CCD0D4D8DDE2E8EEF5FC030B22
:1005F000131B222930353A3F43474B4F5256595C23
:100600005E5F6061626263646567696C6E7072737D
:100610007372716E6B67635F5B57534F4A46413B22
:10062000352F29231D18130E0B070401FFFBF7F2CA
:10063000EDE7E1DBD5CEC8C2BCB7B2ADA8A49F9BA5
:100640009793908D8B89888788898A8C8E909396D2
:10065000989B9DA0A2A5A8ABAFB2B6BABEC2C7CBAD
:10066000CFD3D7DBE0E5EAF0F6FC01080E14191F42
:1006700024292E32373C4045494D5155585A5D5F2B
:10068000616365676A6D707376797B7D7E7E7D7D43
:100690007B79777573706E6B67635E59534C453E1B
:1006A000362F271F18100902FCF5EEE7E1DAD4CD4A
:1006B000C7C2BCB7B1ACA8A39F9A96938F8C898709
:1006C00085848382818181818283838586888A8CE7
:1006D0008E9195989CA1A5AAB0B5BBC1C6CCD2D825
:1006E000DEE4EAF0F6FC00050B11171C22272D3280
:1006F000373C41454A4E5255595C5F626466686AB0
:100700006B6D6D6E6E6F6E6E6D6C6B6A686664623B
:100710005F5D5A5753504C4844403B37322E292492
:100720001F1A150F0A0500FBF6F1EBE6E1DCD7D244
:10073000CEC9C5C0BCB8B4B0ADA9A6A3A19E9C9AB1
:100740009896959493929291929293939596989A63
:100750009C9EA1A4A7ABAEB2B6BBBFC4C9CED3D931
:06076000DEE4E9EFF5FB09
:00000001FF

View File

@ -0,0 +1,175 @@
:020000020000FC
:100000000C9428000C9400000C9400000C94000048
:100010000C9400000C9400000C9400000C94000060
:100020000C9400000C9400000C94BF000C94000091
:100030000C9400000C9400000C9400000C94000040
:100040000C9400000C9400000C9400000C94000030
:10005000FF24A0E0B1E000E0FD920A95E9F70DE091
:1000600005B907E004B901EA0093800009E00093B4
:10007000810001E1009383000EE308BD02E005BDAD
:1000800002E006BD02E000936E00E4ECFAE0F894B2
:100090008824992466247724A3E3B1E0FD92FD929D
:1000A000FC927894F8944F2C5F2C0591400E5F1CC5
:1000B0000F3FD9F3A3E3B1E02D913D916C91240D55
:1000C000351D6F1DA3E3B1E02D933D936C937894A0
:1000D00037D0F8948216930666067894C8F3459153
:1000E0004F3F29F0042F08D04078C9F3DBCF05E05B
:1000F00003BF00E004B98895FF93EF93E02FEE0F64
:10010000FF27EA58FD4F05911591C0910001C65F88
:10011000C23308F0CC27C0930001DD27CF5FDE4F4C
:1001200026EE33E0F894198308833C832B8378947C
:100130000FEF0D830E83FF82F886EF91FF910895F4
:10014000FF93EF93C1E0D1E00E811FEF011789F01B
:100150001E830F810395053008F000E00F8348F0FF
:10016000E885E39531F0E887FF27EA51FD4F0491D8
:100170000D832A96C33341F7EF91FF910895EFB6AF
:100180006F015E01C1E0D1E0222433249A81EB812A
:10019000FC81849148805980940DE51DFF1DFA3043
:1001A00018F0E058F040FE829A83FC83EB839D8137
:1001B000182E87FD8195002490FD080E069491FD70
:1001C000080E069492FD080E069493FD080E002476
:1001D00094FD080E069495FD080E069496FD080EF3
:1001E000069497FD080E110C1F2C10F401941108B1
:1001F000200C311C2A96C33349F68DEF90E0281667
:1002000039060CF01C0181E09FEF281639060CF42A
:100210001C01359427943794822D8058982F9095FF
:1002200037FC83958093880090938A0008947F1C04
:100230008F1C9F1C6F1CF601E501EFBE1895000096
:1002400000000000000000000000000000000000AE
:100250000001010101010202020202020202020285
:100260000202030303030303030303030303030360
:10027000030303030303E100EF00FD000C011C0175
:100280002D013F01520166017B019101A901C301CA
:10029000DD01FA011802380259027D02A302CB02E5
:1002A000F602230353038503BB03F30330046F04F7
:1002B000B304FA0446059605EB054606A5060A07AB
:1002C0007507E7075F08DF086609F5098C0A2D0B3B
:1002D000D70B8B0C4A0D140EEA0ECE0FBE10BE11BA
:1002E000CC12EA131815FFFCFAF7F5F3F0EEEBE980
:1002F000E7E4E2E0DEDBD9D7D5D3D1CFCDCBC9C798
:10030000C5C3C1BFBDBBB9B7B6B4B2B0AEADABA982
:10031000A8A6A4A3A19F9E9C9B9998969593929022
:100320008F8D8C8B89888685848281807F7D7C7B84
:100330007A78777675747371706F6E6D6C6B6A69AD
:100340006867666564636261605F5E5D5C5B5A59A5
:1003500058575756555453525251504F4E4E4D4C7C
:100360004B4B4A494848474645454443434241412F
:1003700040403F3E3E3D3C3C3B3B3A3939383837C4
:100380003736363535343333323231313030302F41
:100390002F2E2E2D2D2C2C2B2B2B2A2A29282827AB
:1003A000272626252524232322222121201F1F1E24
:1003B0001E1D1D1C1C1B1A1A1919181817161615A4
:1003C000151414131312111110100F0F0E0D0D0C24
:1003D0000C0B0B0A0A0908080707060605040403A4
:1003E0000302020101000000000001010000000101
:1003F00003030202040506050302020303020000D0
:10040000030606030100010302FFFCFE03060501CB
:100410000000030401FDFAFE040603FFFDFEFFFDDC
:10042000F4EBE8EFF6F7F3EFEFF2F4F1E8DFE1ECED
:10043000F6F4EEECEFF4F5F0E6E1E8F5FCF8F2F3B3
:10044000FB0204FEF5F3FF0B0D0500050F1411056B
:10045000FCFE0D1A170D0B1622251C0C0106141A92
:100460000D00021422201407030E1B1A09FE0618A1
:10047000211A0A000210180EFCF504171B120705BA
:100480000E1A1A04EDEC00110D00F8FD09120BF024
:10049000DAE0F804F8E9E6F1FF00EDCEBECCE3E8DF
:1004A000D6CAD4E9F8F4DEC6C3DAECE3CDC5D8F198
:1004B000FFF7DECCD5F1FBE5CDCDE7FF02F6E1DAC3
:1004C000EE0809EAD5E302161100F4FB16291EFE18
:1004D000F30F364333201A2842482E0C0B2E4B497B
:1004E000321F22364B4217F9052F44361E15233A88
:1004F000463407F30930371D0A0D243A3A1FFAF241
:100500000C2214EEDBE8011106E9CED3EFF7D9B2E5
:10051000AAC3E0ECDEC0B2C4E3E1BFA6B1D6F3F8F3
:10052000EAD5D5EF06F8CDBBCEF100F8E6D9E4FE6A
:1005300007EDC3BBD9FA00EEDFDDF30D0EF0D0D42A
:10054000F50A06F6EEFD1B362E0DFB0B2B3424119F
:10055000102542523F190F27413C23141B334A4BAD
:100560003212122C3D2D0E05142D3D33150009239A
:100570002811F8F80D252E1D01F7081E13F3DBDFF7
:10058000F60403F1DBDFFA0BF8D1C1CDE2ECE4D3E2
:10059000C8D7F4FDE4C1BFD7EEF2E5D7D8F00A0919
:1005A000EDD3D7EFFBF5E2D5DDF80BFEDDCDDAF2CA
:1005B000F7EADAD4E60111FDDCD7EBFEF8E6DAE083
:1005C000FA151B06EFF8132213FCF4FF192F2C1653
:1005D000091B34361F06001028362914122C433903
:1005E0001C080A1D2F331E09112F3F2C0F040E2348
:1005F0002F27110210292E13F6F300101302EEE834
:10060000FD140EF2DBDFF1FCF7E2D1D8F60AFEE1D1
:10061000D3DCECEFE4D2CCE0000DF7DBD7E7F4EE6F
:10062000DCCAC8DEF7FAE2CED9F1FCEED8CACFE7D1
:10063000FCF7E1D9ED0407F5DED4E0F805F8E6EAC9
:10064000051C1704F5F504161A04F5011E2C1E09E5
:1006500000051825200C0318343C2815141F2E30D3
:10066000200C0A243B3823131826322E19070E2794
:1006700036281107101D1F14FEF200191E06F2F194
:10068000FF0A06F6E2DDF10604EDDFEC0008FEEA03
:10069000DADCF200F9E6E3F70909F8DED1D7EBF08E
:1006A000DFCED3E9F8F1DECCC8D7E9E9D2C6D5EF81
:1006B000FAF1E2DAE0F2FDF3DBD5EB050CFFF3F340
:1006C000FF0E1101EEF1091D1A090004121F1A0490
:1006D000F7011C291E0F0C1829302710081B34396C
:1006E000291D22323F3E2E19172C3F3A2319223062
:1006F000362B1503071B241602FF0C1A1B0CF7EDF3
:10070000F70A0AF7E6EAFD0803F4E2E0F100FAE18D
:10071000D6E2F5FBF2E3D9DFEFF5E5C9C2D3E4E5B4
:10072000D8CCCAD6E6E6D2BFC3DCEDEBDED6DCEC35
:10073000FAF5E1D7E5FE05FDF0EDF8070F04EEEB65
:10074000FD101001F9FD0B1A1B0BF9FB0F1E180809
:10075000061325302B1B0E16292F22141628393F7D
:1007600034231C293A3724181D2C363222100E1C33
:10077000261A03FD0614180EFFF4FA0A0EFFE8E825
:10078000F80404F8ECE9F40200ECDCE2F5FEF9EB25
:10079000E2E5F2FBEFD9CFDAEBEEE4D7D3DCEAF017
:1007A000E2CDCCDCEBE8DCD6DAE9F8FAEBDBE1F41D
:1007B000FDF4E6E5EFFF0904F5EBF50506F9EBEDD1
:1007C000FB0A1007F9F705120CFDF5FC0C17190DC3
:1007D00002091C261B0B08132229251B1724373B53
:1007E0002A191B283332281D1B27322B16070D1AF6
:1007F0001F180B0206141C0FFDF7010E0E05FBF669
:10080000000C0FFFEEEFFC0400F4ECEDF90300ED3B
:10081000DDE3F0F2E7DAD7DEECF3EBDBD4DEEAE897
:10082000DBD0D3E0EEF2E8DBDDECF6EFE2DBE1ED8E
:10083000F7F6EAE2EBFD01F5E7E4ECF7FCF7ECE9AB
:10084000F80708F9EEF2FD060700F9FC0C19150788
:10085000010C191F1C130F192B332A1D1D283232AE
:10086000291E1C283635241618222720150D0F1B8B
:10087000241D0A010914150A00FD020F1409FCF9D0
:10088000050E0AFDF3F3FC0403F6EAEDFAFEF4E6C6
:10089000DEE2EDF3EFE0DBE6F5F6E9DEDCE2EBECE1
:1008A000E3D7D6E5F2EFE1D9DEE7EFEDE4DCE1F204
:1008B000FAF3E5E1E9F3F6EFE4E1EBFAFDF2E7E85C
:1008C000F3FCFCF5ECEEFD0A0AFFFA010E15110926
:1008D000040B1C27221513202A2C231A171F2B2F39
:1008E000241819262C271A11121B2421150D142047
:1008F000231A0F0A0F191F180A07111C1A0F0503D4
:10090000080F0E02F4F4000600F4EDEEF4F8F3E73D
:10091000DEE2F0F3EADDDAE0E7E9E2D7D3DDEAEBA5
:10092000E1DADCE5EBEAE1D7D9E7F1EEE3DFE4EC8D
:10093000EFE9E0DAE1EFF5EEE4E4EEF6F7F1EAE90B
:10094000F2FE00F9F3F9050D0D0702050F18160E5A
:100950000C142025211A171B23272016161E2625C6
:100960001E18181D24241C13161F24201916181EC7
:10097000221F1712161F2019110E1114150E050231
:10098000060B07FFF8F7FAFCF9F0E9E8EEF1ECE501
:10099000E2E5EAECE9E2DEE2E9EBE7E2E3E9EEEFE9
:1009A000EBE7E5E9EEEDE7E3E5EAEDECE7E4E5E9C1
:1009B000ECE9E4E2E6ECEEECE9E8ECF2F4F1EFF17C
:1009C000F7FDFFFEFDFF03090A0705090E12110FCF
:1009D0000E10141715110F121718161414171A1ACF
:1009E000181515181B1B1918191C1F1F1D1B1D1F5F
:1009F000211F1C1B1C1D1D1B17141414120D09068E
:100A000005040200FCFAFAF9F7F3F0EFEFEFEEEC71
:100A1000EBEBEDEEEEECECEDEEEFEEEDEDEDEEEE04
:100A2000EDEBEAEAEBEBE9E8E7E7E7E7E6E4E4E544
:100A3000E6E6E6E6E7E8E9EAEAEAEBEEEFF1F2F409
:100A4000F6FAFDFF0001030405050607090B0C0C6F
:100A50000D0E0F10100F0F10111212121314161783
:100A600018191A1B1D1E1E1F20212323222121219C
:100A700021201F1D1C1A1816120F0D0C0A08050341
:100A80000100FEFCF9F7F7F6F5F4F3F2F2F2F2F2F8
:100A9000F1F1F2F2F1F0EFEFEFEFEEEDECEBEBEA6C
:100AA000E9E8E7E7E7E7E6E5E4E4E4E3E3E3E4E5F0
:100AB000E6E8E9E9EAECEDEEEFF0F2F4F6F8FAFB3D
:040AC000FDFEFF0038
:00000001FF

View File

@ -0,0 +1,861 @@
:020000020000FC
:100000000C9434000C9400000C9400000C9400003C
:100010000C9400000C9400000C9400000C94000060
:100020000C9400000C9400000C9400000C94000050
:100030000C9400000C9400000C94CC000C94000074
:100040000C9400000C9400000C9400000C94000030
:100050000C9400000C9400000C9400000C94000020
:100060000C9400000C940000FF24A0E0B1E000E03C
:10007000FD920A95E9F70FEF0DBF08E00EBF0DE006
:1000800005B907E004B901EA0093800009E0009394
:1000900081000EE307BD02E004BD02E005BD02E001
:1000A00000936E00E4EAF5E3F8948824992466242A
:1000B0007724A1E5B1E0FD92FD92FC927894F8944A
:1000C0004F2C5F2C0591400E5F1C0F3FD9F3A1E52B
:1000D000B1E02D913D916C91240D351D6F1DA1E571
:1000E000B1E02D933D936C93789437D0F8948216B9
:1000F000930666067894C8F345914F3F29F0042F84
:1001000008D04078C9F3DBCF05E003BF00E004B9B5
:100110008895FF93EF93E02FEE0FFF27E459FD4FF3
:1001200005911591C0910001C65FC03508F0CC273C
:10013000C0930001DD27CF5FDE4F2CED33E0F89454
:10014000198308833C832B8378940FEF0D830E83F0
:10015000FF82F886EF91FF910895FF93EF93C1E03E
:10016000D1E00E811FEF011789F01E830F810395E7
:10017000053008F000E00F8348F0E885E39531F0A2
:10018000E887FF27E452FD4F04910D832A96C1357D
:1001900041F7EF91FF910895EFB66F015E011F9354
:1001A0000F93C1E0D1E0222433249A81EB81FC81BA
:1001B000849148805980940DE51DFF1DF53318F09A
:1001C000E058F040FE829A83FC83EB839D818C0192
:1001D0000103210C80E017FC8FEF381E2A96C135F1
:1001E00021F78FEF90E0281639060CF01C0181E012
:1001F0009FEF281639060CF41C0137FC0C940601FD
:10020000F092880020928A000C940F012094309480
:1002100008942F1C3F1C20928800F0928A000894BA
:100220007F1C8F1C9F1C6F1CF601E501EFBE0F9118
:100230001F91189500000000000000000000000061
:1002400000000000000000010101010102020202A1
:100250000202020202020202030303030303030376
:10026000030303030303030303030303E100EF009A
:10027000FD000C011C012D013F01520166017B01B3
:100280009101A901C301DD01FA01180238025902E6
:100290007D02A302CB02F602230353038503BB03B3
:1002A000F30330046F04B304FA0446059605EB0526
:1002B0004606A5060A077507E7075F08DF0866090F
:1002C000F5098C0A2D0BD70B8B0C4A0D140EEA0E78
:1002D000CE0FBE10BE11CC12EA131815FFFCFAF7B0
:1002E000F5F3F0EEEBE9E7E4E2E0DEDBD9D7D5D3D6
:1002F000D1CFCDCBC9C7C5C3C1BFBDBBB9B7B6B4DC
:10030000B2B0AEADABA9A8A6A4A3A19F9E9C9B9999
:100310009896959392908F8D8C8B89888685848210
:1003200081807F7D7C7B7A78777675747371706F4E
:100330006E6D6C6B6A696867666564636261605F55
:100340005E5D5C5B5A59585757565554535252513B
:10035000504F4E4E4D4C4B4B4A49484847464545F9
:1003600044434342414140403F3E3E3D3C3C3B3B99
:100370003A3939383837373636353534333332321F
:1003800031313030302F2F2E2E2D2D2C2C2B2B2B8E
:100390002A2A2928282727262625252423232222FE
:1003A0002121201F1F1E1E1D1D1C1C1B1A1A19197E
:1003B00018181716161515141413131211111010FE
:1003C0000F0F0E0D0D0C0C0B0B0A0A09080807077E
:1003D00006060504040303020201010000000000F8
:1003E00000000000000000FFFFFFFFFFFFFFFFFF16
:1003F000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0D
:10040000FFFFFFFFFFFFFF000000000000000000F3
:1004100000000000000101010101020202020303C9
:10042000030404040505050606060707070808096E
:10043000090A0A0A0B0B0B0B0A0806040301000049
:10044000FFFEFEFDFDFDFEFEFEFFFFFF00000000C3
:100450000000000000000000000000010101010098
:1004600000FFFDFAF7F4F2F0EEEDECECECECEDED64
:10047000EEEFEFF0F1F1F2F3F3F4F4F5F5F6F7F750
:10048000F8F8F9FAFAFBFCFCFDFDFEFFFF000000A6
:100490000101020303040506070808090A0B0C0DF5
:1004A0000E0F101111121314161718191A1B1C1DF8
:1004B0001E1F20212222211F1C17110B0501FFFCEA
:1004C000FAF8F7F6F6F7F8F9FAFBFCFDFEFF000084
:1004D00000000101010102020304050607080705E7
:1004E00002FFF9F2EBE5E0DCD8D6D4D4D4D5D6D8E7
:1004F000D9DBDDDEE0E1E3E4E6E7E9EAEBECEEEFB1
:10050000F0F1F3F4F5F7F8F9FAFCFDFEFF00000155
:10051000020304050708090A0C0D0E101112131529
:100520001617191A1B1D1E1F212224252628292AC9
:100530002C2D2E2F2E2B27231F19120B04FFFBF817
:10054000F5F4F3F2F2F3F5F6F8F9FBFCFEFF000028
:10055000010102030304040607080A0B0C0D0C0A30
:100560000701FAF1E9E1DBD5D1CFCDCCCDCECFD1AA
:10057000D3D5D7D9DBDDDFE0E2E4E5E7E8EAEBED70
:10058000EEF0F1F3F4F6F7F9FAFCFDFEFF000102DC
:1005900003040607080A0B0D0E1011121415171884
:1005A0001A1B1D1E202123242627292A2B2D2E30FD
:1005B0003132312E2A26221E1A16100902FDF8F5B4
:1005C000F2F0EFEFF0F1F2F4F6F8FAFCFDFF0001C3
:1005D000020305060708090B0C0E0F111213131066
:1005E0000C05FCF1E7DED6D0CCC8C7C6C6C7C9CB60
:1005F000CDCFD2D4D6D9DBDDDFE1E3E4E6E8EAEB28
:10060000EDEFF0F2F4F6F7F9FBFCFDFF000002035A
:10061000040607090A0C0D0F1012141517181A1BDF
:100620001D1F2022242527282A2B2D2F303233343A
:10063000332F2A26211D191613110D0700FBF6F280
:10064000EFEDECECEDEEF0F2F4F7F9FCFE00010456
:100650000607090B0D0E101113151617191A1A1784
:10066000120AFFF2E6DBD2CBC6C2C0C0C0C1C3C50E
:10067000C8CACDD0D2D5D8DADCDEE0E2E4E6E8EADA
:10068000ECEEF0F2F3F5F7F9FBFDFE0000010304D8
:100690000507090A0C0E0F1113141618191B1D1E3D
:1006A0002022242527292B2C2E3031333436343088
:1006B0002B26211C181512100F0E0D0802FDF7F342
:1006C000EFEDECECECEDEFF1F4F6F9FCFE000205D9
:1006D00007090B0D0F1012141517181A1B1C1D1BE0
:1006E000170D00F3E6DBD1C9C4C0BEBDBDBFC1C399
:1006F000C6C8CBCED1D4D6D9DBDDE0E2E4E6E8EA69
:10070000ECEEF0F2F4F6F8FAFCFDFF00010204054D
:1007100007080A0C0D0F1113141618191B1D1E20A3
:10072000222426282A2B2D2F3132343534312B2503
:10073000201B1713110F0D0D0C0C0C0A0500FAF5F8
:10074000F1EEEDECECEDEFF1F4F6F9FCFF00030552
:10075000080A0C0E1012141517191A1C1D1F201F41
:100760001A1003F5E7DBD0C8C2BEBCBBBBBDBFC11E
:10077000C4C7CACDD0D2D5D8DADDDFE1E3E5E7EAF8
:10078000ECEEF0F2F4F6F8FAFCFE000102030506C6
:10079000080A0B0D0F1112141618191B1D1F202209
:1007A0002426282A2C2E3032343534302B251F1A9B
:1007B00015120F0D0B0B0A0A0B0C0D0C0903FEF89A
:1007C000F4F0EEEDEDEEEFF1F4F6F9FCFF010406C6
:1007D000090B0E1012141517191A1C1E1F212222A4
:1007E0001E1405F7E8DBD0C8C2BDBBBABABCBEC098
:1007F000C3C6C9CCCFD2D5D7DADCDFE1E3E5E8EA7E
:10080000ECEEF0F2F5F7F9FBFDFF0002030406073A
:10081000090B0C0E1012141517191A1C1E20222376
:100820002527292B2D2F3133322F29231D18131063
:100830000D0A0908080808090A0B0D0E0C0701FC2F
:10084000F7F3F1EFEEEFF0F2F4F7F9FCFF01040734
:100850000A0C0E1012141617191B1D1E2022242418
:10086000201607F9EADDD2C9C3BFBCBBBCBDBFC2FD
:10087000C4C7CBCDD0D3D6D8DBDDE0E2E4E6E9EBEC
:10088000EDEFF1F4F6F8FAFCFE00010304060708A8
:100890000A0C0D0F1113141618191B1D1F212224E9
:1008A00026282A2C2E30302D27221C16110D0A083E
:1008B00006050505050607090A0B0D0F0F0B0600B7
:1008C000FBF7F3F1F0F0F1F2F4F7FAFD000205079F
:1008D0000A0C0F11131416181A1C1D1F212325268C
:1008E00023190AFBECDFD4CBC5C0BEBDBDBEC0C35F
:1008F000C6C8CBCED1D4D7D9DCDEE0E3E5E7E9EC5E
:10090000EEF0F2F4F7F9FBFDFF0002040507080919
:100910000B0C0E1012131517181A1C1E1F2123255D
:1009200027282A2C2D2B26201A15100B0806040325
:1009300002020303040607090A0C0E10110F0A0431
:1009400000FBF7F4F2F2F2F3F5F7FAFD0002050806
:100950000A0C0F11131517191B1C1E202224262701
:10096000251B0CFDEEE1D6CDC7C2BFBEBEBFC1C4C4
:10097000C7CACCCFD2D5D8DADDDFE1E4E6E8EAEDCC
:10098000EFF1F3F5F8FAFCFE000103050607090A8A
:100990000C0D0F1012141617191B1C1E20222325D4
:1009A00027292A29241F19130E0A06040200000011
:1009B00000000102040507090B0D0E1012120F09A9
:1009C00003FFFAF7F4F3F3F4F6F8FBFD0002050871
:1009D0000A0C0F11131517191B1D1F21232527287A
:1009E000261C0EFFF0E3D8CFC8C4C1C0C0C1C3C528
:1009F000C8CBCED1D3D6D9DBDDE0E2E4E7E9EBEE3C
:100A0000F0F2F4F6F9FBFDFF0002040607080A0BFA
:100A10000C0E0F11131416181A1B1D1F202224254B
:100A20002727231E18120D08050200FFFEFEFEFFF9
:100A300000000102040608090B0D0F111314120D1A
:100A40000702FEFAF7F5F5F5F7F9FBFE00020508D7
:100A50000A0D0F121416181A1C1E202224262729EC
:100A6000271E0F00F2E4D9D0CAC5C3C1C1C2C4C693
:100A7000C9CCCFD2D4D7D9DCDEE1E3E5E8EAECEEAD
:100A8000F1F3F5F7FAFCFE000103050708090A0B6C
:100A90000D0E1012131517181A1C1D1F20222425C5
:100AA000221D17110C070300FFFDFCFCFCFCFDFEE2
:100AB000FF0001030406080A0C0E1012141615128A
:100AC0000C0600FDFAF8F7F7F8FAFCFE000205083C
:100AD0000A0D10121517191B1D1F21232527282A5F
:100AE000281F1001F3E6DBD2CCC7C4C3C3C4C6C8F9
:100AF000CBCDD0D3D5D8DADDDFE1E4E6E8EBEDEF1E
:100B0000F1F3F6F8FAFCFF000204060708090B0CE3
:100B10000D0F1012141517181A1C1D1F2122211D4C
:100B200018120C070200FDFBFAF9F9F9FAFBFCFDBB
:100B3000FF0001030507090B0D0F111314161715FC
:100B4000100A0500FDFAF9F9F9FAFCFE00020508A1
:100B50000B0D101315181A1C1E2022242627292AD3
:100B6000281F1203F5E8DDD4CDC9C6C5C5C5C7C960
:100B7000CCCED1D4D6D9DBDEE0E2E4E7E9EBEEF08F
:100B8000F2F4F6F9FBFDFF0002040607090A0B0C5C
:100B90000E0F1112141517181A1C1D1F201D1913E2
:100BA0000D0702FFFCFAF8F7F7F7F7F8F9FAFCFD82
:100BB000FF0002040607090B0D0F11131517191872
:100BC000140F090400FDFBFAFAFBFCFE0002050805
:100BD0000B0E111316181A1D1F21222426282A2B4A
:100BE00028201304F6E9DED6CFCBC8C6C6C7C8CBCB
:100BF000CDCFD2D5D7DADCDEE1E3E5E7EAECEEF003
:100C0000F2F5F7F9FBFD000103050608090A0B0DD3
:100C10000E0F1112141617191A1C1E1D1A140E0885
:100C200003FFFCF9F7F5F4F4F4F5F6F7F9FAFCFE36
:100C30000001020406080A0C0E1012141618191AE4
:100C400018130D070200FDFBFBFCFDFF0003050868
:100C50000B0E111416191B1D1F21232527292A2BC2
:100C6000281F1305F8EBE0D7D1CCC9C8C8C8CACC37
:100C7000CED1D3D6D8DBDDDFE1E4E6E8EAECEFF174
:100C8000F3F5F7F9FCFE000103050708090B0C0D4D
:100C90000E101113141617191B1C1B16110B05002F
:100CA000FCF8F6F4F3F2F2F2F3F4F6F7F9FBFCFEDB
:100CB0000001030507090B0D0F11131517181A1C56
:100CC0001B17110B0601FFFDFCFCFDFF00030609CD
:100CD0000C0E111417191B1E2022242527292B2B3B
:100CE000271F1406F9ECE1D9D2CECBCACACACBCDA4
:100CF000CFD2D4D7D9DCDEE0E2E4E6E8EBEDEFF1E9
:100D0000F3F5F7FAFCFE000103050708090B0C0DCB
:100D10000E1011131516181A1A19140E0802FEF9DE
:100D2000F6F3F2F0F0F0F0F1F2F4F5F7F9FBFDFF75
:100D300000020406080A0C0E0F11131517191B1DCB
:100D40001E1B150F090400FFFDFDFE00010306092F
:100D50000C0E111416191B1E20222426282A2B2BB8
:100D6000271F1407FAEEE3DBD4D0CDCBCBCBCDCE0F
:100D7000D0D3D5D7DADCDEE1E3E5E7E9EBEDEFF15F
:100D8000F3F5F7FAFCFE0001030507080A0B0C0D4A
:100D90000F1012131517181917120C0600FCF7F490
:100DA000F1F0EEEEEEEEEFF0F2F4F5F7F9FBFDFF09
:100DB00000020406080A0C0E10121416181A1C1E43
:100DC0001F1E19130D070300FFFEFF000103060994
:100DD0000C0E111416191B1E20222426282A2C2B37
:100DE000261E1408FCEFE5DCD6D1CFCDCDCDCECF7D
:100DF000D1D4D6D8DADDDFE1E3E5E7E9EBEDEFF1D9
:100E0000F3F5F7FAFCFE0001030507080A0B0C0EC8
:100E10000F11121416171816100A04FFFAF6F2F042
:100E2000EEEDECECEDEDEFF0F2F4F5F7F9FBFE0092
:100E300001030507090B0D0F11131517191B1D1FB2
:100E400020201C16100A050200FFFF0001030608FF
:100E50000B0E111416191B1E20222527292A2C2BB4
:100E6000251D1408FDF1E6DED7D3D0CFCECECFD1ED
:100E7000D3D5D7D9DBDDDFE2E4E6E8EAECEEEFF14B
:100E8000F3F5F7F9FCFE0001030507080A0B0D0E48
:100E900010111315161715100A03FFF9F5F1EEEDF1
:100EA000EBEBEBEBECEDEEF0F2F4F6F8FAFCFE0017
:100EB000010305070A0C0E10121416181A1B1D1F29
:100EC00021221F19130D0804010000000103060868
:100ED0000B0E111316191B1E20232527292B2C2B33
:100EE000241C1308FDF2E8DFD9D4D2D0CFD0D1D260
:100EF000D4D5D8DADCDEE0E2E4E6E8EAECEEF0F2C3
:100F0000F3F5F7F9FBFE0001030507080A0B0D0FC7
:100F10001012131516140F0903FEF9F4F0EEEBEAA4
:100F2000EAE9EAEAEBEDEEF0F2F4F6F8FAFCFE009C
:100F3000020406080A0C0E10121416181A1C1E1FA2
:100F40002122211D18120C070402010102030507CA
:100F50000A0D101215181B1D20222527292B2C2BBA
:100F6000251D140B00F6ECE4DDD8D4D2D2D1D2D3B7
:100F7000D4D6D8DADCDEE0E2E4E6E8EAEBEDEFF145
:100F8000F2F4F6F8FAFCFE0002040607090B0D0E57
:100F90001012131514100A04FEF9F4F0EDEBE9E851
:100FA000E8E8E8E9EAECEDEFF1F3F5F7FAFCFE002A
:100FB000010406080A0C0E10121416181A1B1D1F25
:100FC000202223221F1A140E09060302020304061C
:100FD000080B0E101316191C1E212426282B2C2C4E
:100FE0002820170F06FDF3EAE2DCD8D5D4D3D3D4FA
:100FF000D5D6D8DADCDEDFE1E3E5E7E9EAECEEEFCF
:10100000F1F3F5F7F9FBFDFF01030507090A0C0EE3
:1010100010111313100B05FFFAF5F0EDEAE8E7E6FF
:10102000E6E6E7E8EAEBEDEFF1F3F5F7F9FCFE00B1
:10103000010306080A0C0E10121416181A1B1D1EA6
:101040002021232424201A140E0A06040303040575
:10105000070A0D0F1215181B1E212326282B2D2DD4
:101060002820170F0800F6EDE5DFDAD7D5D5D5D55E
:10107000D6D7D9DADCDEE0E1E3E5E7E8EAECEDEF4C
:10108000F1F2F4F6F8FAFDFF00020507080A0C0E6B
:10109000101112100C0600FBF5F1EDEAE8E6E5E5AB
:1010A000E5E6E7E8EAECEDEFF1F3F5F8FAFCFF002E
:1010B000020406080A0C0E10121416181A1C1D1F22
:1010C0002021232425231D17110C090604040406DE
:1010D000080A0C0F1215181B1E212426292B2D2C53
:1010E000271E160E0700F7EEE7E0DCD8D7D6D6D6D7
:1010F000D7D8D9DBDCDEE0E2E3E5E6E8EAEBEDEFCA
:10110000F0F2F4F6F8FAFDFF00020506080A0C0EEC
:101110001011110D0701FCF6F1EDEAE8E6E5E4E453
:10112000E5E6E7E8EAECEEF0F2F4F6F8FBFDFF00A6
:10113000020406080B0D0F11131517191A1C1D1F99
:10114000202223242625211B150F0B080605050642
:10115000080A0C0F1215181B1E212427292B2D2CD1
:10116000261D140C0600F8F0E8E2DDDAD8D7D7D750
:10117000D8D9DADBDDDEE0E2E3E5E6E8EAEBEDEE46
:10118000F0F2F4F6F8FAFCFF00020406080A0C0E6E
:1011900010100D0802FDF7F2EEEAE7E5E4E3E3E400
:1011A000E5E6E7E9EAECEEF0F2F4F7F9FBFDFF0122
:1011B000030507090B0D0F11131517191A1C1D1F15
:1011C000202223252627241E18120D0A07060607AB
:1011D000080A0C0F1215181B1E212427292B2D2B52
:1011E000241C130B0500F9F1EAE4DFDBD9D8D8D8C9
:1011F000D9DADBDCDDDFE0E2E3E4E6E8E9EBEDEEC3
:10120000F0F2F4F6F8FAFCFF00020406080A0C0EED
:101210000F0E0904FEF8F3EEEBE8E5E4E3E2E3E3A6
:10122000E4E6E7E9EBEDEFF1F3F5F7F9FBFD00019B
:10123000030507090B0D0F11131517191A1C1D1F94
:1012400020222325262726211B15100C0907070716
:10125000080A0C0F1215181B1E212427292B2D2AD2
:10126000231A120A0400FAF2EBE5E1DDDBDAD9D940
:10127000DADBDCDDDEDFE0E2E3E4E6E8E9EBEDEE3D
:10128000F0F2F4F6F8FAFCFF00020406080A0C0E6D
:101290000E0B0500FAF4EFEBE8E5E3E2E2E2E2E34D
:1012A000E4E6E7E9EBEDEFF1F3F5F7F9FCFE000119
:1012B000030507090B0D0F11141617191B1C1E1F10
:1012C00020222325262828241E18130E0B0908087F
:1012D000090A0D0F1215181B1E212427292B2C2952
:1012E000211910090300FAF4EDE7E2DFDCDBDADABA
:1012F000DBDCDCDDDEDFE1E2E3E5E6E8E9EBEDEEB9
:10130000F0F2F4F6F8FAFCFF00020406080A0C0DED
:101310000B0600FBF5F0ECE8E5E3E2E1E1E1E2E3F6
:10132000E4E6E7E9EBEDEFF1F3F5F8FAFCFE000196
:10133000030507090C0E1012141617191B1C1E1F8B
:101340002022232527282927221C16110D0B0909E5
:101350000A0B0D0F1215181B1E212427292B2C28D0
:1013600020180F0803FFFBF5EFE9E4E1DEDDDCDC2C
:10137000DCDDDDDEDFE0E1E2E3E4E6E8E9EBECEE34
:10138000F0F2F4F6F8FAFCFE0002040608090B0B72
:101390000701FCF6F1ECE8E5E3E1E1E0E0E1E2E39E
:1013A000E4E6E8E9EBEDEFF1F4F6F8FAFCFE000113
:1013B0000306080A0C0E1012141617191A1C1D1F0A
:1013C0002022232527282A2925201A14100D0B0A4C
:1013D0000A0C0D101215181B1E212427292B2C274F
:1013E0001F170F0802FFFCF7F1EBE7E3E0DEDDDD9E
:1013F000DDDDDEDFDFE0E1E2E3E5E6E7E9EBECEEB1
:10140000F0F2F4F6F8FAFCFE0002040607090A07F7
:1014100002FDF7F2EDE9E5E3E1E0DFDFE0E0E1E343
:10142000E4E6E8EAECEEF0F2F4F6F8FAFCFE00018D
:101430000406080A0C0E1012141617191A1C1D1F88
:101440002022232527282A2B29231D18130F0D0CB2
:101450000C0C0E101215181B1E212426292B2B26CE
:101460001E160E0702FFFCF8F3EDE9E5E2E0DFDE11
:10147000DEDEDFDFE0E1E1E2E3E5E6E8E9EBECEE2A
:10148000F0F2F4F6F8FAFCFE000103050708070283
:10149000FEF8F2EDE9E5E2E0DFDFDEDFDFE0E1E3E9
:1014A000E5E6E8EAECEEF0F2F4F6F8FAFCFE00020B
:1014B0000406080A0C0E1012141617191A1C1D1F08
:1014C0002022232527292A2C2B27211B16120F0D1A
:1014D0000D0D0E101215181B1E212326292B2A254F
:1014E0001D150D0601FFFDFAF5F0EBE7E4E2E0E083
:1014F000DFDFE0E0E0E1E2E3E4E5E6E8E9EBECEEA3
:10150000F0F2F4F6F8FAFCFE00010305070602FE0D
:10151000F8F2EDE8E5E2E0DEDEDDDEDEDFE0E1E38D
:10152000E5E6E8EAECEEF0F2F4F6F8FAFDFF000288
:101530000406080B0D0F1112141617191A1C1D1F83
:101540002022242527292A2C2D2A251F1915120F80
:101550000E0E0F101215171A1D202326292B2A24D0
:101560001C140C0601FFFDFBF7F2EEEAE6E4E2E1F3
:10157000E0E0E0E1E1E2E2E3E4E5E6E8E9EBEDEE1C
:10158000F0F2F4F6F8FAFCFE000103050502FEF89D
:10159000F2EDE8E4E1DFDDDDDCDCDDDEDFE0E1E330
:1015A000E5E6E8EAECEEF0F2F4F6F8FBFDFF000207
:1015B0000407090B0D0F1112141617191A1C1D1F01
:1015C0002022242527292B2C2E2D29231D181412E7
:1015D000100F10111315171A1D202326282B29234D
:1015E0001B130C0601FFFEFCF9F4F0ECE8E6E4E264
:1015F000E1E1E1E1E1E2E3E3E4E5E6E8E9EBEDEF97
:10160000F0F2F4F6F8FAFCFE0001030401FDF7F233
:10161000ECE7E3E0DEDCDBDBDBDBDCDDDEE0E1E3D3
:10162000E5E6E8EAECEEF0F2F4F6F9FBFDFF010383
:101630000507090B0D0F1112141617191A1C1D1F7F
:101640002122242627292B2D2F2F2D27211C17144B
:10165000121111111315171A1D202326282A2923C8
:101660001B130C0601FFFEFDFBF7F3EEEBE8E5E4D0
:10167000E3E2E2E2E2E2E3E4E4E5E7E8EAEBEDEF0D
:10168000F1F2F4F6F8FAFCFE00010200FCF7F1EBCF
:10169000E6E3DFDDDBDADADADADBDCDDDEE0E1E36C
:1016A000E5E6E8EAECEEF0F2F5F7F9FBFE000103FF
:1016B0000507090C0E0F1113141617191A1C1E1FFB
:1016C0002122242628292B2D2F31302B25201B17B2
:1016D000141212121315171A1C1F2225282A292248
:1016E0001A120B060100FEFEFDF9F5F1EDEAE7E541
:1016F000E4E3E2E2E2E3E3E4E5E6E7E8EAEBEDEF88
:10170000F1F3F5F7F8FAFCFE000100FBF5EFEAE56E
:10171000E1DEDBDAD9D8D8D9D9DADBDDDEE0E1E306
:10172000E5E6E8EAECEEF0F3F5F7FAFCFE00020479
:1017300006080A0C0E101113141617191B1C1E2074
:1017400021232526282A2C2E3031322F29241E1A17
:10175000171413131415171A1C1F2225282A2821C1
:1017600019120B050100FFFFFEFBF7F3EFEBE9E6B3
:10177000E5E4E3E3E3E3E4E4E5E6E7E9EAECEDEFFF
:10178000F1F3F5F7F9FBFDFF00FEF9F3EDE8E3DF18
:10179000DCDAD8D7D7D7D7D8D9DADBDDDEE0E1E39A
:1017A000E5E7E9EBEDEFF1F3F6F8FAFDFF000305ED
:1017B00007090B0D0E101113141618191B1D1E20EE
:1017C00022232527282A2C2E303233322E28221D80
:1017D000191715141516171A1C1F2225282A282137
:1017E00019120B060200FFFFFFFDF9F5F1EDEAE823
:1017F000E6E5E4E4E4E4E4E5E5E6E8E9EAECEEEF76
:10180000F1F3F5F7F9FBFDFEFCF7F1EBE5E0DCD9D0
:10181000D7D6D5D5D5D5D6D7D8DADBDDDEE0E2E32D
:10182000E5E7E9EBEDEFF1F4F6F9FBFE0001030566
:1018300007090B0D0E1012131516181A1B1D1F2168
:1018400022242527292B2C2E30323434322C2621E9
:101850001D1917161616181A1C1F2225282A2721AB
:1018600019110B060200FF0000FFFCF8F4F0ECE990
:10187000E7E6E5E4E4E4E5E5E6E7E8E9EBECEEF0ED
:10188000F2F4F6F7F9FBFCF9F4EEE8E3DEDAD7D58B
:10189000D3D3D3D3D4D4D5D7D8D9DBDDDEE0E2E4BB
:1018A000E5E7E9EBEEF0F2F4F7F9FCFE00020406DE
:1018B00008090B0D0E1012131517181A1C1E1F21E4
:1018C00023242627292B2D2F3133353635312B254F
:1018D000201C19181717181A1C1F2225282A272020
:1018E00019110B06020000000000FEFAF6F2EEEB02
:1018F000E9E7E6E5E5E5E5E6E7E7E8EAEBEDEEF062
:10190000F2F4F6F8F9F9F6F1EBE5DFDBD7D4D2D152
:10191000D0D0D1D2D3D4D5D7D8DADBDDDFE0E2E442
:10192000E6E8EAECEEF1F3F5F8FAFDFF010305074E
:10193000080A0B0D0F1012141517191B1C1E20225C
:10194000232526282A2B2D2F3133353738352F29BB
:10195000241F1C1A1818191B1D1F2225292A27208D
:1019600018110A0502000000000100FCF8F4F0ED77
:10197000EAE8E7E6E6E6E6E7E7E8E9EAECEDEFF1D4
:10198000F2F4F6F8F7F3EDE7E1DCD7D4D1CFCECE21
:10199000CECFD0D1D2D4D5D7D8DADCDDDFE1E3E5C4
:1019A000E7E9EBEDEFF1F4F6F9FBFE0001040507C2
:1019B000090A0C0D0F11121416181A1B1D1F2022D4
:1019C000242527282A2C2E30323436383938342E24
:1019D00028231F1C1A1A1A1C1D202326292A2720F7
:1019E00018100A0502000000000201FFFAF6F2EFEB
:1019F000ECEAE8E7E7E6E7E7E8E9EAEBECEEEFF147
:101A0000F3F4F5F3EEE8E2DDD8D3D0CECCCBCBCBFC
:101A1000CCCDCFD0D2D4D5D7D9DADCDEE0E2E4E643
:101A2000E8EAECEEF0F2F5F7FAFCFF000204060734
:101A3000090A0C0E0F11131517191A1C1E1F21234A
:101A4000242627292B2C2E31333537393A3B38338E
:101A50002D27231F1D1C1C1D1E202326292A261F5F
:101A600018100A050200000001020200FDF9F5F25B
:101A7000EEECEAE9E8E8E8E8E9EAEAECEDEEEFF1B5
:101A8000F2F2EEE8E2DDD7D3CFCCCAC8C8C8C8C9E5
:101A9000CACCCED0D1D3D5D7D9DADCDEE0E2E4E6C9
:101AA000E8EAECEFF1F3F5F8FAFCFF0002040607B0
:101AB000090A0C0E0F11131517191B1C1E1F2123C9
:101AC000242628292B2D2F31333537393B3C3D3BFC
:101AD00036312B2723211F1F2021232528292822A7
:101AE0001B130D07030100000002030302FFFBF7B5
:101AF000F4F0EEECEAE9E9E9EAEAEBECEDEEEFEF1F
:101B0000EBE6E0DAD4D0CCC9C7C5C4C4C4C4C5C7E9
:101B1000C8CACCCFD1D3D5D7D8DADCDEE0E2E4E74F
:101B2000E9EBEDEFF1F3F6F8FAFCFE00010305072F
:101B3000090A0C0E1012131517191B1C1E20212345
:101B40002526282A2B2D2F31333537393B3D3F4071
:101B50003F3B36302B2724222222232527292A25E2
:101B60001E160F090501000000010305060300FD14
:101B7000F8F5F1EFEDECEBEBEBEBECEDEDEDE9E394
:101B8000DDD7D1CDC9C6C3C2C1C0C0C0C1C2C4C6E1
:101B9000C8CACCCED0D3D5D7D9DBDDDFE1E3E5E7CA
:101BA000EAECEEF0F2F4F6F8FBFDFF0002030507A5
:101BB000090B0D0E10121416181A1C1D1F202224BA
:101BC0002627292B2C2E30323436383A3C3E4041E1
:101BD00042403B35302B282524242426272929253B
:101BE0001E160F090401000000010306070602FF8C
:101BF000FBF7F4F1EFEDECECECECEDEDEAE4DDD726
:101C0000D1CBC7C4C1BFBEBEBEBEBEBFC0C2C3C5AE
:101C1000C8CACCCED1D3D5D8DADCDEE0E2E4E6E93E
:101C2000EBEDEFF1F3F5F7F9FBFDFF000204060819
:101C30000A0B0D0F11131517191B1C1E202123252C
:101C400026282A2C2D2F31333537393B3D3F414251
:101C50004444403A35302B2827262626282A2A2590
:101C60001D160F0904010000000103060808050104
:101C7000FEFAF6F3F1EFEEEDEDECEAE5DED7D1CBCF
:101C8000C6C2BFBDBCBBBBBBBCBDBDBFC0C2C4C662
:101C9000C8CACDCFD1D4D6D9DBDDDFE1E3E6E8EAAF
:101CA000ECEEF0F2F4F6F8F9FBFDFF000204060892
:101CB0000A0C0E1012141617191B1D1F20222426A1
:101CC00027292B2D2F30323436383A3C3E404243C0
:101CD000454644403A342F2C29282728292A2925EB
:101CE0001D150E080401000000020406090A08047C
:101CF00000FDF9F6F3F1EFEEEBE6DFD8D2CBC6C18B
:101D0000BEBBB9B8B8B8B9BABBBCBDBFC0C2C4C607
:101D1000C8CBCDD0D2D5D7DADCDEE0E2E5E7E9EB1F
:101D2000EDEFF1F3F5F6F8FAFCFE00010305070903
:101D30000B0D0F11131516181A1C1E1F2123252712
:101D4000282A2C2E3031333537393B3D3F4143452E
:101D5000464848443F39342F2C2A2929292A2A2445
:101D60001D150E080300000000020407090B0B07F5
:101D70000300FCF8F5F2EFE9E1DAD2CCC6C1BDBA56
:101D8000B8B6B5B5B6B6B8B9BBBCBDBFC1C2C4C79D
:101D9000C9CBCED0D3D6D8DBDDDFE2E4E6E8EAEC8F
:101DA000EEF0F2F3F5F7F9FAFCFE00010305080A7C
:101DB0000C0E1012131517191B1D1F202224262884
:101DC000292B2D2F31323436383A3C3E404244459F
:101DD00047494A48443E38332F2C2B2A2A2B2A24A1
:101DE0001C140D0703000000000204070A0C0D0A72
:101DF0000602FFFBF6EFE6DDD4CDC7C1BDBAB7B52D
:101E0000B4B3B3B3B4B6B7B9BBBDBEC0C1C3C5C725
:101E1000CACCCFD2D4D7D9DCDEE1E3E5E7E9EBEDFC
:101E2000EFF1F2F4F6F8F9FBFDFF00020406080AF0
:101E30000C0E10121416181A1C1E202123252729F7
:101E40002A2C2E3032343537393B3D3F414344460E
:101E5000484A4B4C48433D37332F2D2C2B2B2A24FB
:101E60001C140C0702000000000204070A0D0E0DEE
:101E7000090500F9EFE4DAD1C9C3BEBAB7B5B3B208
:101E8000B2B2B2B3B4B6B8BABBBDBFC0C2C4C6C8A2
:101E9000CBCDD0D3D5D8DADDE0E2E4E7E9EAECEE69
:101EA000F0F1F3F5F7F8FAFCFE0001030507090B62
:101EB0000D0F11131517191B1D1E20222426282A69
:101EC0002B2D2F31333536383A3C3E40424345477F
:101ED000494A4C4D4C48423C3733302E2C2C2A2456
:101EE0001B130C0602000000000205070A0D100F6C
:101EF0000C05FBF0E4D9D0C7C1BCB8B5B3B2B1B1E1
:101F0000B1B1B2B3B4B6B8BABCBEC0C1C3C5C7C91B
:101F1000CCCED1D4D6D9DBDEE1E3E5E8E9EBEDEEDA
:101F2000F0F2F4F6F7F9FBFDFF0001030507090BDA
:101F30000D0F121416181A1B1D1F21232527292BDC
:101F40002C2E3032343637393B3D3F4142444648EF
:101F5000494B4D4E4F4C47413B3632302E2D2A24B3
:101F60001B130C060200FF00000205080A0E100EEB
:101F700007FDF1E5DAD0C7C0BBB7B4B2B0B0B0B0BE
:101F8000B0B1B2B3B5B7B9BBBDBFC0C2C4C6C8CA91
:101F9000CDCFD2D5D7DADDDFE2E4E6E8EAECEDEF4B
:101FA000F1F3F5F6F8FAFCFEFF00020406080A0C4D
:101FB0000E10121417191B1C1E20222426282A2C4E
:101FC0002E2F31333537383A3C3E4041434547495F
:101FD0004A4C4D4F51504B453F3A35322F2E2B2412
:101FE0001B130B050200FF00000205080A0B080383
:101FF000FBF0E5DAD0C7C0BBB6B3B1B0AFAFAFB09E
:10200000B1B2B3B4B6B8BABCBEC0C1C3C5C7C9CB00
:10201000CED0D3D6D9DBDEE0E3E5E7E9EBECEEF0BA
:10202000F2F4F6F7F9FBFDFF0001030507090B0DBC
:102030000F11131517191B1D1F21232527292B2DC0
:102040002F3032343638393B3D3F414244464849CF
:102050004B4D4E505252504A443E393532302C2569
:102060001C130B060100FFFF000204050300FBF632
:10207000EFE6DCD3CAC3BDB8B4B1B0AFAFAFB0B157
:10208000B2B3B4B5B7B8BABCBEC0C2C4C6C8CACC75
:10209000CFD2D4D7DADCDEE1E3E5E7E9EBEDEFF12F
:1020A000F3F4F6F8FAFCFEFF00020406080A0C0E30
:1020B00010121416181A1C1E20222426282A2C2E30
:1020C0003031333537393A3C3E4041434547484A41
:1020D0004C4D4F515253534E48423D3834322E26C8
:1020E0001C130B050100FFFF0000FEFAF6F2EEEAFA
:1020F000E5DFD7CFC7C1BBB7B4B1B0AFAFB0B1B2F6
:10210000B3B4B5B6B8B9BBBDBFC1C3C5C7C9CBCEE3
:10211000D0D3D5D8DADCDFE1E3E6E8EAECEEF0F2A2
:10212000F3F5F7F9FBFDFF0001030507080A0C0EA4
:1021300010131517191B1D1F21232527292B2D2FA0
:102140003032343638393B3D3F4042444647494BB4
:102150004C4E5051525455524D47413B3734302725
:102160001D140C050100FFFDFAF6F1ECE8E5E2E0D4
:10217000DEDAD4CDC6C0BBB7B4B2B1B0B0B1B1B382
:10218000B4B5B6B7B9BBBCBEC0C2C4C6C8CACDCF51
:10219000D1D4D6D8DBDDDFE1E4E6E8EBEDEFF1F218
:1021A000F4F6F8FAFCFEFF0002040607090B0D0F17
:1021B000111315181A1C1E20232426282A2C2E3011
:1021C00031333537383A3C3D3F41434446484A4B2A
:1021D0004D4F505253545655514B453F3A37312885
:1021E0001E140C0501FEF9F3EDE8E3E0DDDBDADABD
:1021F000D9D7D3CDC7C2BDB9B6B4B3B2B2B2B3B4F6
:10220000B5B6B7B9BABCBEC0C2C4C5C8CACCCED0B8
:10221000D2D4D6D9DBDDE0E2E4E7E9EBEDEFF1F390
:10222000F5F7F9FBFDFE0001030506080A0C0E1088
:10223000121416181B1D1F21242527292B2D2F3082
:1022400032343637393B3C3E4042434547484A4C9E
:102250004D4F505253555657555049433E39342AE5
:102260001F150C05FEF4ECE5DFDBD7D5D4D4D4D5AF
:10227000D6D6D3CEC9C4BFBBB8B6B4B3B3B3B4B566
:10228000B6B7B9BABBBDBFC1C3C5C7C9CBCDCFD126
:10229000D3D5D7D9DBDEE0E3E5E7EAECEEF0F2F404
:1022A000F6F8FAFCFEFF0002040608090B0D0F11F8
:1022B000131517191C1E20222426282A2C2D2F31F5
:1022C00033343638393B3D3F4042444647494B4C16
:1022D0004E4F51525355565757544E48423D362C47
:1022E00021160AFEF2E7DFD8D3D0CECECECFD0D2A1
:1022F000D4D5D4D0CCC7C2BEBBB8B6B5B5B5B5B6CB
:10230000B7B9BABBBDBEC0C2C4C6C8CACCCDCFD196
:10231000D3D5D7DADCDEE1E3E6E8EAEDEFF1F3F579
:10232000F7F9FBFCFE0001030507080A0C0E10126A
:102330001416181A1D1F21232527292A2C2E303266
:10234000333537383A3C3E3F4143444648494B4C8D
:102350004E4F5152545556585957534D47413A2FA5
:10236000211100F2E5DBD3CDCAC8C8C9CACCCED092
:10237000D3D5D5D3CFCAC5C1BEBBB9B7B7B7B7B828
:10238000B9BABBBDBEC0C2C3C5C7C9CACCCED0D204
:10239000D4D6D8DADCDFE1E4E6E8EBEDEFF2F4F6F0
:1023A000F7F9FBFDFF0002040507090B0D0F1113E0
:1023B0001517191B1D1F22242628292B2D2F3032DB
:1023C000343637393B3C3E4042434547484A4B4D03
:1023D0004E50515254555758595A57514B453C2D10
:1023E0001906F5E6DAD0CAC6C4C3C4C5C7CACCCF7D
:1023F000D2D5D7D6D2CDC9C4C0BDBBB9B9B8B8B98A
:10240000BABBBDBEC0C1C3C5C6C8C9CBCCCED0D275
:10241000D4D6D9DBDDDFE2E4E6E9EBEEF0F2F4F668
:10242000F8FAFCFE0000020406080A0C0E10121452
:1024300016181A1C1E20222426282A2C2D2F313350
:10244000343638393B3D3F4042444547484A4B4D7E
:102450004E505153545657585A5B5A564F4638258A
:1024600010FDEBDDD1C9C3C0BFBFC0C3C5C8CCCF51
:10247000D2D5D8D8D5D1CCC8C4C0BEBCBABABABAE5
:10248000BBBCBEBFC1C3C4C6C7C8CACBCDCFD1D3E6
:10249000D5D7D9DCDEE0E2E5E7E9ECEEF0F2F5F7DE
:1024A000F9FAFCFE0001030507090B0D0F111315C6
:1024B00017191B1D1F21232527292B2C2E303133C3
:1024C0003537383A3C3D3F4142444547494A4C4DF7
:1024D0004E505153545657585A5B5C584E41311D1B
:1024E00008F5E4D6CBC4BFBCBCBDBEC1C4C8CBCF0D
:1024F000D2D5D8DAD8D4D0CBC7C3C0BEBDBCBCBC43
:10250000BDBEBFC1C2C4C5C6C8C9CACBCDCFD1D359
:10251000D5D8DADCDEE0E3E5E7E9ECEEF0F3F5F759
:10252000F9FBFDFF00020406080A0C0E101113153A
:1025300017191B1D1F21232527292B2D2E3032343F
:102540003537393A3C3E3F4142444647494A4C4D73
:102550004E505153545657595A5B5A54493B2B17B6
:1025600003F0E0D2C8C1BCBABABBBDC0C3C7CBCFB1
:10257000D2D6D9DBDBD8D3CFCAC6C3C0BFBEBEBE9E
:10258000BEBFC0C2C3C4C6C7C8C9CBCCCED0D2D4CC
:10259000D6D8DADDDFE1E3E5E7EAECEEF1F3F5F7D3
:1025A000F9FBFDFF00020406080A0D0E10121416B6
:1025B00017191B1D1F21232527292B2D2F303234BE
:1025C0003537393A3C3D3F4142444547484A4B4DF7
:1025D0004E505153545657595956514A423729185B
:1025E00004F2E2D4C9C1BCB9B8B9BBBEC2C5C9CD39
:1025F000D1D5D8DBDDDCD9D5D0CCC8C5C3C1C0C0EE
:10260000C0C1C1C2C3C5C6C7C8CACBCCCED0D1D445
:10261000D6D8DADCDEE0E2E4E7E9EBEDF0F2F4F75D
:10262000F9FBFDFF00020406090B0D0E1012141534
:1026300017191B1D1F21232526282A2C2E30323343
:102640003537383A3B3D3E404143444647494A4C82
:102650004D4F505254555756524C46403A342B1E0B
:102660000DFCEADBCEC4BEBAB8B8B9BCBFC3C7CB99
:10267000CFD3D7DADDDFDFDCD8D3CFCBC8C6C4C336
:10268000C2C2C2C2C3C4C6C7C9CACBCCCECFD1D3C3
:10269000D5D7D9DBDDE0E2E4E6E8EAECEFF1F3F6EA
:1026A000F8FAFDFF00020406080A0C0E10121415B9
:1026B00017191B1C1E20222426282A2C2E303133C9
:1026C000353638393B3C3E3F4142444547484A4B0A
:1026D0004D4E50525355534F49433D37332F2A22C5
:1026E0001402F1E1D3C8C0BBB8B8B9BBBEC2C6CAF8
:1026F000CED2D6DADDE0E2E0DCD8D3CFCBC8C6C597
:10270000C3C3C3C3C4C5C6C8C9CACCCDCED0D1D338
:10271000D5D7D9DBDEE0E2E4E6E8EAECEFF1F3F668
:10272000F8FBFDFF01030507090B0D0F101214162E
:1027300017191B1D1E20222426282A2C2E30313347
:10274000353638393B3C3D3F4142444547484A4B8A
:102750004D4F505253524D47413B36312D2A27227F
:102760001605F5E4D6CAC2BCB9B8B9BBBEC2C6CA62
:10277000CED2D6DADDE0E3E3E0DBD7D2CECBC8C6FB
:10278000C5C4C3C3C4C5C6C8C9CBCCCDCFD0D2D3B2
:10279000D5D7D9DBDEE0E2E4E6E8EAECEFF1F3F6E8
:1027A000F8FBFE0001030507090B0D0F11121416AB
:1027B00017191B1D1E20222426282A2C2E303133C7
:1027C000353638393A3C3D3F4042434547484A4B0D
:1027D0004D4F5152504C46403A35302C2926252138
:1027E0001708F7E7D8CDC4BEBAB9B9BBBEC2C6CACE
:1027F000CED2D6DADDE1E4E5E2DEDAD5D1CDCAC764
:10280000C6C5C4C4C5C6C7C8CACBCDCECFD0D2D327
:10281000D5D7D9DBDEE0E2E4E6E8EAEDEFF1F4F665
:10282000F9FCFE0001030507090B0D0F1113141627
:1028300018191B1D1F20222426282A2C2E2F313345
:10284000343637393A3C3D3F4042434547484A4B8E
:102850004D4F504F4B453F39342F2B2826242320F2
:10286000180AFAEADBCFC6BFBBBABABBBEC2C6CA39
:10287000CED2D6DADEE1E4E6E5E1DCD8D3CFCCC9CE
:10288000C7C6C5C5C5C6C7C9CACCCDCECFD1D2D49F
:10289000D5D7D9DBDEE0E2E4E6E8EAEDEFF1F4F7E4
:1028A000F9FCFE00020406080A0C0E0F111315169F
:1028B00018191B1D1F21232426282A2C2D2F3133C4
:1028C000343637393A3B3D3E4042434547484A4C0F
:1028D0004D4F4E4B453F39342F2B27252322211FA7
:1028E000180CFEEEDFD2C9C1BDBBBABCBEC2C5C9A1
:1028F000CED2D6DADDE1E4E6E6E4DFDBD6D1CECB3C
:10290000C8C7C6C6C6C7C8C9CACCCDCED0D1D2D416
:10291000D5D7D9DBDEE0E2E4E6E8EBEDEFF2F4F761
:10292000F9FCFE00020406080A0C0E10111315161D
:1029300018191B1D1F21232426282A2B2D2F313245
:10294000343637383A3B3D3E4041434547484A4C90
:102950004D4E4B46403A342F2B2724232120201E56
:10296000180E01F2E3D6CCC4BFBCBCBCBFC2C5C903
:10297000CDD1D5D9DDE0E4E7E8E6E2DDD8D4D0CCAE
:10298000CAC8C7C6C7C7C8C9CBCCCDCFD0D1D2D48F
:10299000D5D7D9DBDEE0E2E4E6E9EBEDEFF2F4F7E0
:1029A000F9FCFE00020406080A0C0E10111315169D
:1029B000181A1B1D1F2123242628292B2D2E3032C7
:1029C00033353738393B3C3E4041434547484A4C14
:1029D0004D4B46413B352F2B272422201F1F1E1D08
:1029E000170F03F6E8DACFC7C1BEBDBDBFC2C5C968
:1029F000CDD1D5D9DCE0E3E6E8E8E5E0DBD6D2CE20
:102A0000CBC9C8C7C7C8C9CACBCCCECFD0D1D2D406
:102A1000D5D7D9DBDEE0E2E4E7E9EBEDF0F2F4F65E
:102A2000F9FCFE00020406080A0C0E10111315161C
:102A3000181A1B1D1F2122242627292B2C2E30314A
:102A400033353638393B3C3E3F41434547484A4C95
:102A50004B48423C36302C272422201F1E1E1E1CB1
:102A6000170E05F9ECDED3CAC4C0BEBEBFC2C5C8CE
:102A7000CCD0D4D8DCE0E3E6E9EAE7E2DED9D4D092
:102A8000CDCBC9C8C8C8C9CACBCCCDCFD0D1D3D47F
:102A9000D6D7D9DBDDE0E2E4E7E9EBEDEFF2F4F6DF
:102AA000F9FBFE00020406080A0C0E10111315179C
:102AB000181A1C1D1F2122242627292A2C2E2F31CB
:102AC00033343638393B3C3E3F41434547484A4B17
:102AD00048433E37322D282522201E1D1D1D1D1C5A
:102AE000170E05FCF0E3D7CEC7C2C0BFC0C2C5C831
:102AF000CCD0D4D8DBDFE3E6E9EBE9E5E0DBD6D206
:102B0000CFCCCAC9C9C9C9CACBCCCDCFD0D1D3D4F7
:102B1000D6D7D9DBDEE0E2E5E7E9EBEDEFF1F4F65D
:102B2000F9FBFE00020406080A0C0E10121315171A
:102B3000181A1C1D1F2122242527282A2C2D2F314D
:102B400032343637393A3C3E3F41434547484A499B
:102B500045403A342E2925221F1E1D1C1C1C1C1CFE
:102B6000170E05FDF3E7DCD2CBC5C2C1C1C2C5C893
:102B7000CBCFD3D7DBDEE2E5E9EBEBE7E3DED9D57C
:102B8000D1CECCCAC9C9C9CACBCCCDCED0D1D3D471
:102B9000D6D7D9DBDEE0E2E4E7E9EBEDEFF1F4F6DE
:102BA000F8FBFE00020406080A0C0E10121315179B
:102BB000191A1C1D1F2022242527282A2B2D2E30D0
:102BC00032343537393A3C3D3F414345474949471F
:102BD000423C36302B2623201E1C1B1B1B1B1C1BA0
:102BE000170F05FEF6ECE1D7CEC8C4C2C2C3C5C8F4
:102BF000CBCED2D6DADEE2E5E8EBECEAE5E0DBD7F5
:102C0000D3CFCDCBCACACACACBCCCDCED0D1D3D4E8
:102C1000D6D8DADCDEE0E2E4E6E9EBEDEFF1F3F65C
:102C2000F8FBFD00010406080A0C0E10121315171C
:102C3000191A1C1D1F202223252628292B2C2E3053
:102C400031333537383A3C3D3F41434547484844A6
:102C50003F39322D2824201E1C1B1A1A1A1B1B1B3D
:102C6000160E05FEF6EEE4DAD2CBC7C4C3C3C5C860
:102C7000CBCED2D6DADDE1E5E8EBEDEBE8E3DED969
:102C8000D5D1CECCCBCACACACBCCCDCED0D1D3D461
:102C9000D6D8DADCDEE0E2E4E6E8EBEDEFF1F3F5DE
:102CA000F8FAFD00010306080A0C0E10121415179D
:102CB000191A1C1D1F202123242627292A2C2D2FD9
:102CC00031333537383A3C3D3F414345474846412B
:102CD0003C352F2A25211E1C1A1A19191A1A1B1BDA
:102CE000160E05FEF7F0E8DFD6CFCAC6C5C5C6C8C2
:102CF000CACED1D5D9DDE1E4E8EAEDEDEAE5E0DBE5
:102D0000D7D3D0CDCCCBCBCBCBCCCDCECFD1D3D5D5
:102D1000D6D8DADCDEE0E2E4E6E8EAEDEFF1F3F55E
:102D2000F8FAFDFF010306080A0C0E10121416171C
:102D3000191A1C1D1F202123242527282A2B2D2F5B
:102D400031333436383A3C3D3F4143454747443EB2
:102D500038322C27221F1C1A19181819191A1B1B74
:102D6000170E05FEF7F1EBE3DAD3CDC9C7C6C7C826
:102D7000CBCED1D5D9DCE0E4E7EAECEEECE8E3DE5B
:102D8000D9D5D1CFCDCCCBCBCCCCCDCED0D1D3D54A
:102D9000D6D8DADCDEE0E2E4E6E8EAECEFF1F3F5DF
:102DA000F8FAFDFF010306080A0C0E10121416179C
:102DB000191A1B1D1E1F212223252628292B2D2EE3
:102DC00030323436383A3C3E3F4143454645413B3C
:102DD000352F2924201D1A191817171819191A1A0E
:102DE000160F06FEF7F1ECE6DED7D1CCC9C8C8C98C
:102DF000CBCED1D4D8DCE0E3E6E9ECEEEDEAE5E0D9
:102E0000DBD7D3D0CECDCCCCCCCDCECFD0D1D3D5BB
:102E1000D7D8DADCDEE0E2E4E6E8EAECEEF1F3F55E
:102E2000F7FAFCFF010306080A0C0E10121416171D
:102E3000191A1B1C1E1F202223242627292A2C2E68
:102E400030323436383A3C3D3F41434545433E37C6
:102E5000312B26211D1A18171616171718191A1AAA
:102E6000170F06FEF7F1ECE8E2DBD5D0CCCAC9CAF1
:102E7000CCCED1D4D8DCDFE2E6E8EBEEEEECE8E352
:102E8000DED9D5D2CFCECDCCCDCDCECFD0D1D3D52E
:102E9000D7D8DADCDEE0E2E4E6E8EAECEEF1F3F5DE
:102EA000F7FAFCFF000306080A0D0F11121415179C
:102EB000181A1B1C1D1F202122242527282A2C2EEE
:102EC00030323436383A3C3D3F414345443F3A3353
:102ED0002D27221E1B1817161515161718191A1A42
:102EE000160F06FEF7F1ECE9E5DFD9D4CFCDCCCC57
:102EF000CDCFD1D4D8DBDEE2E5E8EBEDEFEEEAE5CD
:102F0000E0DBD7D4D1CFCECDCDCECFCFD0D2D3D59D
:102F1000D7D8DADCDEE0E2E4E6E8EAECEEF0F3F55E
:102F2000F7FAFCFF000306080B0D0F11121415171A
:102F300018191B1C1D1E202122242527282A2C2E6F
:102F400030323436383A3C3E3F414343413B352FE3
:102F500029231F1B18161514141515161718191ADE
:102F6000160F06FEF7F1ECE9E7E3DDD8D3D0CECEBD
:102F7000CED0D2D5D8DBDEE1E4E7EAEDEFEFECE846
:102F8000E3DED9D6D3D1CFCECECFCFD0D1D2D3D509
:102F9000D6D8DADCDEE0E2E4E5E8EAECEEF0F3F5E0
:102FA000F7FAFCFF000306080B0D0F10121415169C
:102FB00018191A1B1D1E1F2122232526282A2B2DF6
:102FC0002F31333637393B3D3F4143423D37312A7C
:102FD00025201C1916141313131415161718191A73
:102FE000170F06FFF7F1EDEAE8E6E2DDD8D4D2D01C
:102FF000D0D1D3D5D7DADDE0E3E6E9ECEEF0EEEAC6
:10300000E6E1DCD8D5D2D1D0CFCFD0D0D1D2D3D574
:10301000D6D8DADCDEE0E2E4E6E8EAECEEF0F3F55E
:10302000F7FAFCFF010306080B0D0E10121315161C
:1030300017181A1B1C1E1F2022232526282A2B2D79
:103040002F31333537393B3D3F41413E38322C2615
:10305000211C19161413121212131415161819190B
:10306000160F07FFF7F1EDEAE9E8E6E2DDD8D5D380
:10307000D2D3D4D5D7DADCDFE2E5E8EBEEF0F0ED41
:10308000E8E4DFDBD7D4D2D1D0D0D0D0D1D2D3D5E1
:10309000D6D8DADCDEE0E2E4E6E8EAECEEF0F3F5DE
:1030A000F7FAFCFF010306080A0C0E1011131415A1
:1030B0001718191B1C1D1F202223242628292B2DFD
:1030C0002F31333537393B3D3F403E39332D2721B2
:1030D0001D191614121111111112131516181919A0
:1030E000171007FFF8F2EDEAE9E9E9E6E2DDD9D7E2
:1030F000D5D4D5D6D7DADCDFE2E5E8EBEDF0F1EFB9
:10310000EBE6E1DDD9D6D4D2D1D1D1D1D2D2D4D54A
:10311000D7D8DADDDFE0E2E4E6E8EAECEEF1F3F559
:10312000F8FAFDFF010306080A0C0E10111314151E
:103130001718191A1C1D1F2022232526282A2B2D7B
:103140002F31333637393B3D3F3D39332D27211C55
:1031500019151311100F0F10101213141617191937
:1031600017100700F8F2EEEBEAEAEBEAE6E2DEDA45
:10317000D8D7D6D7D8DADCDEE1E4E7EAEDF0F2F131
:10318000EEE9E4E0DCD8D6D4D3D2D2D2D2D3D4D5AF
:10319000D7D9DBDDDFE1E3E4E6E8EAECEFF1F3F6D3
:1031A000F8FBFDFF010305080A0C0E0F11121415A0
:1031B0001618191A1C1D1F2022232526282A2C2EFA
:1031C0003032343537393B3D3C38332D27211C18FC
:1031D0001512100F0E0E0E0F1011131416171819CA
:1031E00017100800F9F3EEECEAEAEBECEBE7E2DFAC
:1031F000DBD9D8D8D8DADBDEE1E4E7EAEDF0F2F3A8
:10320000F0ECE7E2DEDAD8D5D4D3D3D3D3D3D4D617
:10321000D7D9DBDDDFE1E3E5E7E9EBEDEFF1F4F64C
:10322000F8FBFDFF01030507090B0D0F1112131524
:103230001617191A1C1D1F2122232526282A2C2E79
:103240003032333537393B3B37322C26201B1714AD
:10325000110F0E0D0C0D0D0E0F1112141517181A5B
:1032600018110900FAF4EFECEBEBECEEEEEBE7E310
:10327000DFDCDAD9D9DADCDEE0E3E6E9ECEFF2F420
:10328000F2EFEAE5E1DDDAD7D5D4D4D3D4D4D5D67C
:10329000D7D9DBDDDFE1E3E5E7E9EBEDEFF1F4F6CC
:1032A000F8FBFDFF00020507090B0D0F10121315A7
:1032B0001617191A1C1D1F2122242527282A2C2EF7
:1032C0003031333537393935302A251F1A16121067
:1032D0000E0C0B0B0B0B0C0D0F1012141517191AEB
:1032E00018120A02FBF5F0EDEBEBECEEF0EFECE779
:1032F000E3E0DDDBDBDBDCDEE0E3E6E9ECEFF2F490
:10330000F5F2EEE9E5E1DDDBD9D7D6D6D6D6D7D8CA
:10331000D9DBDDDEE0E2E4E6E8EAECEEF0F2F4F63A
:10332000F8FBFDFF00020507090B0D0F1012141525
:103330001618191B1C1E20212324252728292B2C75
:103340002E2F31323434312C27211C1814100D0B40
:103350000908080808090A0C0E0F11131517181A86
:1033600018120A02FBF4EFECEAEAEBECEFF0EFEBF9
:10337000E7E3E0DEDDDDDEDFE1E4E7EAEDF0F3F5F3
:10338000F7F5F2EEEAE6E3E0DEDDDCDBDBDBDBDCFF
:10339000DDDDDFE0E1E3E4E6E8EAECEEF0F2F4F6AE
:1033A000F8FBFDFF00020507090B0D0F11131416A2
:1033B00017191A1C1D1F21222325262728292A2AEE
:1033C0002B2C2E2F2F2C27221D1915120F0C0A081B
:1033D000070605050607090A0C0E11131517181A1A
:1033E00019130B02FBF4EEEBE9E9EAEBEDF0F1EE79
:1033F000EAE7E3E1E0DFE0E1E3E5E8EBEEF1F3F655
:10340000F8F8F6F3EFEBE8E5E3E1E0DFDFDEDEDE40
:10341000DEDEDFDFE0E2E4E6E8EAECEEF0F2F4F62E
:10342000F8FBFDFF00030507090B0E10111315171C
:10343000181A1B1D1F202223252626272828292964
:103440002A2A2B2926221D1915120F0D0B090807F0
:1034500006050403040507090B0E10121517191AA7
:1034600019140C03FCF4EEEAE8E8E8EAECEFF0F0FB
:10347000EEEAE7E5E3E2E2E3E5E7E9ECEFF1F4F7B2
:10348000F9FBFAF7F3F0EDEAE8E6E4E2E1E0DFDE8B
:10349000DDDDDDDDDFE1E4E6E8EAECEEF0F2F4F6B6
:1034A000F8FAFDFF00030507090C0E101214161898
:1034B000191B1C1E202123242626272828282828DB
:1034C000292825201C1814110E0C0B0A09080707BF
:1034D00006050403030406080B0D10121517191B2B
:1034E0001A150D05FDF5EEE9E7E7E7E9EBEDF0F17B
:1034F000F0EEEBE8E6E6E5E6E7E9EBEDF0F2F5F80D
:10350000FAFCFCFAF7F4F1EEEBE8E6E4E1DFDDDCEF
:10351000DADADADCDFE1E3E6E8EAECEEF0F2F4F640
:10352000F8FAFD00FF00020407090C0E111315172D
:103530001A1B1D1F212324262728292A2B2B2B2940
:10354000251F19120C070301010203050608090BC8
:103550000C0C0C0B0A09070606080C0F1215181A9A
:103560001C1C1B150E05FDF4ECE6E4E4E5E7E9EBB5
:10357000EEF1F3F5F4F2F1EFEFEEEFF0F1F3F4F634
:10358000F8FAFCFDFEFDFAF6F1ECE6E1DCD8D5D464
:10359000D5D6D7D9DADDDFE2E4E6E9EBEDEFF1F3FA
:0435A000F5F7F9FB47
:00000001FF

Some files were not shown because too many files have changed in this diff Show More