FamiTone is an open source audio library for NES/Famicom. It is designed to provide easy way of adding music and sound effects into homebrew games and demos for NES/Famicom. It is not meant to be the best, the fastest, or the most powerful thing, it is pretty simple but it does the job.
The library allows to create both music and sound effects using popular music cross editor
FamiTracker, and then export them into library's internal formats. It supports all the standart channels of 2A03: two pulse, triangle, noise, and DPCM. Expansion sound chips are not supported.
The library is open source and released into the Public Domain. This means you can use it for any purposes without restrictions: redistribute, modify, use for commercial and non-commercial projects. You could provide credits for the author, inform the author about your project, donate, etc, but nothing is obligatory, you could do it at free will. Obviously, the library provided AS IS without any warranties, the author is not responsible for anything.
Download FamiTone (latest version for NESASM, CA65, Asm6)
Ports of older versions made by other people also available:
CA65 port by ManicGenius
Asm6 port by UncleSporky
Warning: you should use FamiTracker version 0.3.6 or higher to be able to use exporter plugin!
(this thread is continuation of
two previous, new thread is to separate unrelated and obsolete information, so the release could be found easily)
So good! Music is always my worst, I'll try to adapt it to NESHLA and include it on the framework, hope it works
Superb job Shiru.
It's not something I'll make use of but I can appreciate how you've put the whole thing together into a nice tidy package.
Anyone want the source converting to CA65?
I actually liked tepples's idea about a tool that would automatically create a source for few assemblers from a single master source. I'm thinking about something like this, but that would require to learn details about some popular assemblers first (voting shows that there are three the most popular), and I would like to work on other things now, so it goes to future plans.
Another part of problem of support for other assemblers is that text2data and nsf2data tools generate assembler listings (that is needed to allow easy relocation of data at compile-time, there are absolute addresses in the data), and it has NESASM syntax. Currently you have to use Replace function of a text editor for other assemblers, and as general solution, I think a parameter should be added to these tools, so they could produce output for few assemblers.
neilbaldwin wrote:
Superb job Shiru.
Anyone want the source converting to CA65?
I would like the source in ca65. I will convert it myself if I need to. I'm not ready to add the sound engine to my game yet, but when I am I will try Shiru's first.
Shiru, if I convert your code to ca65, I'll send my changes back to you. I really appreciate the work that you've put into this project, and that you are releasing it with such a liberal license (commercial use allowed). If I use your engine in any of my games, you'll surely get your name in the credits, and I'll return any changes that I make to the community.
It may be too late to switch out my own sound engine, but I might look into using this one in future games. Good work Shiru!
I've updated the archive without changing version number, but the update is important. First, sound effects converter was broken (altough it wasn't noticeable in the demo). Second, text exporter plugin was recompiled to work with FamiTracker 0.3.6, which was released recently. Third, short demo 'song' with DPCM (just few quickly made patterns) was replaced with actual song.
Wow!
This is superb.
It even supprots sounds.
Any chances for VRC7 and Tempo feature?
No chances for VRC7. Tempo - maybe, however I don't consider it as important feature for a simple demo/game sound engine, and I'm lazy to figure out it's exact behaviour in FamiTracker.
CA65 Famitone Download
Ported to CA65 today. I just wanted to get this thing working, so it still uses the whole "=" format for defining RAM variables. For my own edition I'm going to switch that over to RAM segments instead. Just wanted to get this out there before I forgot.
Also didn't port the code that generates from Famitracker, so you'll need to do some regex wizardry like I did to convert a file (or you could port the thing instead).
I stuck the notetable in a odd segment at the end near vectors and banktable.
Thanks Shiru!
I have a mostly completed tool that will directly convert FTM into ca65 syntax to feed into famitone. But I began changing the data and famitone to suit my own tastes. However, my code can be changed back.
I've decided that I'm not going to use a traditional tracker to make music in my current project, so I've put the FTM->ca65 converter on hold. If anyone wants to finish it, I'll post the C code somewhere. Its a single source file.
Honestly the format is not that different...
All it needs is the .db -> .byte, .dw -> .word
and every .whatever after the first label to use @ instead of .
It's a pain in the ass but it does work.
I hadn't actually checked this out until now and now that I did, great job Shiru. You might want to add a small note about how to use the TextExporter plugin though... the "Plugins" directory had to be created manually for example. And the exporter is under "Create NSF" menu, not so obvious.
I've made a minor update, without changing version number. Now text2data and nsf2data can output files in NESASM, CA65, and Asm6 formats. More details about TextExporter usage added into readme.txt, as thefox suggested.
Shiru wrote:
I've made a minor update, without changing version number. Now text2data and nsf2data can output files in NESASM, CA65, and Asm6 formats. More details about TextExporter usage added into readme.txt, as thefox suggested.
That's really cool (supporting the syntax of multiple assemblers). If I ever resume work on my FTM -> ca65 converter, it would also target Famitone using the syntax of those three main assemblers.
I think there's a bug on Famitone, at least on CA65 port.
On line 781: jsr FamiToneSampleStartS
Shouldn't this be a jmp like on line 776?
Seems it is just an unnecessary line, added by some reason. It still works the same.
I'll have to try this out when I get a chance. The demo ROM sounds nice.
Shiru wrote:
Seems it is just an unnecessary line, added by some reason. It still works the same.
I think it will do twice FamiToneSampleStartS.
Didn't noticed it is jsr, not jmp. Well, ManicGenius probably had reasons to add this. It wasn't like this in the original version.
Shiru wrote:
Didn't noticed it is jsr, not jmp. Well, ManicGenius probably had reasons to add this. It wasn't like this in the original version.
Dunno. My current version has progressed a little beyond what I submitted, uses structs n' such. However I'm moving my code over to NESHLA so anyone who want's to improve/fix the CA65 version go ahead. TBH I just tried to port it as fast as possible and potentially massacred the code in the process.
However that JSR I think is definitely a bug. Technically it looks like it could just fall-through.
Just tested Famitone on a PowerPak. Works fantastically on real NES NTSC hardware at least.
I've got a problem that not all the sound effects converts correctly, sometimes converter can't detect end of an effect (marked with Zxx). Also, this problem varied between NSFs made with different FamiTracker versions, so I decided to change detection method.
Now you should use C00 effect in end of every effect (C00 just stops playback). Converter changed, archive is updated.
I'm trying to convert Famitone to get it to work in asm6. Admittedly I am probably not the best person for this job, as I'm rusty with this stuff and also was never that smart to begin with.
There were four main things that stopped asm6 from compiling.
First was the labels - they're all meant to be local, but asm6 handles its local labels differently. I went through and added + and - to the beginning of all labels accordingly, and I think this problem is fixed.
Secondly, lines like lda [FT_TEMP],y resulted in a "label not found" error. I changed the brackets to parenthesis and the errors stopped. Still not sure whether this was a mistake because I'm having trouble prior to reaching one of these statements...
Third was NESASM's LOW() function. From what I can tell, asm6's version of this is the < operator, so I replaced instances of LOW with <. However, this may not be working correctly.
I tried to get Famitone working with an existing program of mine, but upon calling FamiToneInit, the program seems to hang. When I step through it, it gets to the line ldx #<(FT_CHANNELS) which evaluates to ldx #<($600+6)...and for some reason, this loads the value 6 into x, even though that RAM location is empty and I'd expect 0 from the low bits.
The final problem I had was that there were two lines with a "value out of range" error. This one from the envelopeStep routine:
Quote:
-readByte
lda ($40),y ;read byte of the envelope
iny ;increase pointer
ora #0
bpl +special ;if it is below 127, it is special code
clc ;otherwise it is an output value+192
adc #-192
*** Value out of range.
sta $0600+0,x
tya
sta $0600+4,x ;remember the pointer and return
rts
And this one from FamiToneSfxUpdate:
Quote:
-readByte
lda ($40),y ;read byte of effect
iny
cmp #$10 ;if it is less than $10, it is register write
bcc +getData
cmp #$ff ;if it is $ff, it is end of the effect
bcs +eof
adc #-$10 ;otherwise it is number of repeats +$10
*** Value out of range.
Since they both appeared to be attempting to add a negative, I just changed each into subtracting a positive and that eliminated the error. I haven't gotten far enough that I can test this yet to make sure it's not causing any problems.
---
As a side note to this, using text2data to convert a song to asm6 format resulted in errors for me. The resulting file contained references to a nonexistent .env_default, when I'm sure it meant @env_default:
Quote:
...
@ins
dw @env_default,@env_default,@env_default
db $30,$00
dw @env_vol0,@env_arp2,.env_default
db $30,$00
dw @env_vol1,.env_default,@env_pitch0
db $70,$00
dw @env_vol2,@env_arp0,.env_default
db $70,$00
dw @env_vol2,@env_arp1,.env_default
db $70,$00
dw @env_vol3,.env_default,.env_default
db $30,$00
dw @env_vol4,@env_arp0,.env_default
db $70,$00
dw @env_vol4,@env_arp1,.env_default
db $70,$00
dw @env_vol5,.env_default,.env_default
db $30,$00
...
Possibly a bug in text2data? It compiled fine after I changed them to @s instead of .s.
Actually, FamiTone is full of minor bugs (mostly in tools, not in the sound code), which aren't found and not fixed yet because no one used it in an actual project.
Today I'm fixed a problem with sound effects converter, some bugs in TextExporter (weren't noticeable on old computer by some reason), and a bug in text2data reported by UncleSporky above.
I still use NESASM, so don't know about Asm6 much. LOW/HI functions are value&255 and value/256. So, LOW($600+6) is $06.
That must not be the problem at all, then...I'll keep looking and see if I can get it to work.
Specifically what is happening now is that my main loop is supposed to spin on $2002, waiting for vblank. After I add in a line to call FamiToneInit during the regular initialization, after I turn IRQs on and read $2002 once it jumps to IRQ (which is just rti) and stays there forever.
Definitely something due to my own ignorance, I'll keep at it.
EDIT: Disabling IRQs gets past this, but I'd rather fix the problem than leave it like that. I'm assuming it's DMC related, though I thought I turned off Famitone's DMC related code.
In any case, in a few minutes I should be able to see if I can at least get the music playing.
EDIT: Awesome, I got the music working! Except my entire background is now bouncing up and down for some reason. Ah well.
One common cause of endless IRQs like that is an APU frame IRQ that isn't getting acknowledged. To disable that:
Code:
lda #$40
sta $4017
Thanks a lot tepples, that was all it took to stop the IRQs. I'm surprised I never saw that in anyone's startup code before.
EDIT: My screen was jumping to the music because I was updating Famitone during vblank instead of the main loop.
Here is my port of FamiTone to asm6.
Thank you so much for this tool Shiru, it's going to be extremely helpful to people like me who don't want to mess with the nitty gritty of audio and just want to play some music and sound effects.
Another bug in sound effects converter fixed, file is updated.
Link to UncleSporky's Asm6 port added to the first post of this thread.
As the source states, all the FamiTone variables take up 112 + (15 * the number of SFX streams). By default (with 4 streams) this should be 172 bytes, which means that by default the first available byte after FamiTone's data is $3AC. Correct?
It's just not always immediately obvious what the limits are by checking a debugger. Just wanted to confirm it before I go changing stuff and end up with hard-to-fix bugs.
Check formats.txt, there is full list of all the variables. Should be 174 bytes (was 172 at some point, before adding PAL adjust).
Is there an option within FamiTracker to compensate for the swapped duty cycles on clone systems?
As far as I know, no. And I actually haven't ever seen such a clone, out of hundreds of them. I've heard there are some, but probably they aren't so common.
hi, trying to use this program for adding music in an nes game.
While texttodata created my asm6-asm-file I recieved 8 warning messages. It says:
the texttodata tool program wrote:
Warning! Note out of supported range, frame 2 row 14 channel 1
But that note is A-3.
I think i read that it allows octaves 1 through 5. ...is that because i set, inside FamiTracker, my octave to 3... and so it adds 3 to A-3? Octave 6 is out of range, I think.
The rest of the warnings say the same thing pretty much... I looked at the last one and it was saying F-3 is out of range.
Have to go mow now.
A-3 is in supported range. Octave in FamiTracker is exists only in the editor, so it does not affect to note text. Are you sure you looking into correct place? These numbers are hex.
Edit: whoops, actually, the numbers are messed: frame is dec, row is hex.
Shiru wrote:
A-3 is in supported range. Octave in FamiTracker is exists only in the editor, so it does not affect to note text. Are you sure you looking into correct place? These numbers are hex.
Edit: whoops, actually, the numbers are messed: frame is dec, row is hex.
there are 8 errors... 2 of them are in frame 2, 2 of them are in frame 3, 2 of them are in frame 9, and the last two are in frame 10. None of the numbers have an a, or a b, or a c, or a d, or an e, or a f in them. And they are all reported on channel 1. I found a C-6 in frame 0 row 1e... on channel 1. I tried converting the number, from one of the errors, 30 to hex and got 1e. Honestly, there are 10 C-6 notes in frame 0 and 10 C-6 notes are in frame 7. None of the errors are located in frame 0 or frame 7. Don't understand what I've done wrong.
Could you, Shiru and some others, help me with this?
You can send me text file, and I'll check what's wrong with the error reporting, converter, or the song.
I dont think I will be able to send you any file right now... sorry.
Thank you though for trying to help me.
Here is an image and i tried to make my penultimate post, up there, be moore understandable below.
Quote:
there are 8 errors... 2 of them are in frame 2, 2 of them are in frame 3, 2 of them are in frame 9, and the last two are in frame 10. None of the numbers have an a, or a b, or a c, or a d, or an e, or a f in them. And they are all reported on channel 1. I found a C-6 in frame 0 row 1e... on channel 1. I tried converting the number, from one of the errors, 30 to hex and got 1e. Honestly, there are 10 C-6 notes in frame 0 and 10 C-6 notes are in frame 7. But, none of the errors are located in frame 0 or frame 7. Don't understand what I've done wrong.
^Green text is describing the image abovee ^Purple text sounds interesting... to me ^Yellow text is reporting a problem.
Important update for FamiTone's PAL support. It fixes a problem that music doesn't play correctly after changing a song in PAL mode.
Another update, music pause functionality is added. I.e., you can pause and resume current music, often needed for games.
Shiru, it finally worked! Sometimes the text file isn't created again by the 2text program that runs after you click "Create NSF..." in FamiTracker.
Thank you God for helping me!
Now I am lost as to where do I include famitone.asm in my game code? I tried placing
Code:
.include "famitone.asm"
in the main file underneath the includes of prg.asm and chr.asm... and so I tried to build my nes file and I got
famitone.asm(986): PC out of range. There are errors like that on the whole vertical command prompt; one on every line with a different number in the parenthesis. Every now and then there's also a
famitone.asm(935): Value out of range. What should I do?
I don't know what is on row 938, because library was updated few times after your first questions, and I don't have previous versions. You surely should not place include after including chr. Check source file of demo, it is in /src/.
Value out of range could be probably related to negative numbers, you can convert them to positive (-10 = 256-10).
Shiru wrote:
Check source file of demo, it is in /src/.
Thank you!
I found where all the includes are. There is some code like this:
Code:
nmi
inc FRAME_CNT
rti
.include "controller.asm"
.include "rle.asm"
screenData
.incbin "screen.rle"
.include "famitone.asm"
.include "music1.asm"
.include "music_dpcm.asm"
.include "sounds.asm"
.bank 2
.org FT_DPCM_OFF
.incbin "music_dpcm.bin"
.bank 3
.org $e000
.include "music2.asm"
.org $fffa
.dw nmi
.dw reset
.bank 4
.incbin "screen.chr"
I don't understand what
.bank does. There is an
.org $e000 but that is almost near the end... what do you think the address is around this area? Wanting to know what .org value would be best... and or maybe what does
.bank 2 do? Thanks for reading all of this. I'm sorry it isn't very clear.
This question is not related to FamiTone, it is related to NESASM and answered in its docs. In short, .bank selects 8K bank in a ROM file, number of banks defined through .ines*** defines in the beginning of the source file.
Updated the asm6 version of FamiTone to 1.23.
http://www.mediafire.com/?cnc3bbwekmyr6g8
Shiru wrote:
This question is not related to FamiTone, it is related to NESASM and answered in its docs. In short, .bank selects 8K bank in a ROM file, number of banks defined through .ines*** defines in the beginning of the source file.
ah ok i got it now, the FamiTone code is NESASM.
Thank you.
Have another question and hope it is related to FamiTone.
How can I get FamiToneUpdate to run on every frame.................................. wait that's probably answered in demo.asm... yes it is!
Thanks though.
It is related to NES programming in general, and actually it is not the simplest question. You need to call it after VRAM updates, so the most common way is to put sound update call in the NMI handler, after all the video related code.
Shiru, have you ever recieved a small bunch of Unknown label. errors followed by a lot of Can't determine address. errors? These errors have been reported by asm6 while trying to build my nes file to test with. All of the errors have been reported from music32101.asm, the first music file created by famitone. I did add the -asm6 before its creation.
No, I haven't got any mails regarding FamiTone at all.
I don't know anything about asm6.
Made progress... yes. All of the errors dissappeared and the rom build successfully once I recieved some understanding and so we figured out that all of the
Code:
.env_default
things needed to be changed to
Code:
@env_default
. I guess something needs to be changed in the text2data program? Remember I'm using asm6.
The rom kind of works... there is a lot of wierd things... I think it's my code problem somewhere, but Shiru, do you think you could help me with some hints as to why the song doesn't play? Have to look at the code now... help if you can.
text2data supports asm6 syntax, so you did something wrong. Old version of the tool, -asm6 in a wrong place, etc.
Sorry, I don't like to figure out what is wrong with other's code, I always have megabytes of my own code to work with. If you have problems with NES programming in general, ask on NESdev section of this forum, other people could help. In this thread I only answer to questions related to FamiTone usage, issues, bugs, not obvious things (not mentioned in docs), etc.
I had thoughts about native multiple assemblers support in FamiTone for long time, similar to the idea tepples once suggested. Ports by ManicGenius and UncleSporky gave me idea how it should look, so here is my attempt to solve the problem: a tool that converts NESASM source code to CA65 and ASM6 source code (not arbitrary code, just FamiTone).
As I'm not a user of these assemblers, try it and tell me if anything is wrong. CA65 output compiles without errors, at least.
Edit: now included into the main archive
Additionally, text2data and nsf2data tools were updated to produce correct ca65 output.
FamiTone is updated. Many minor fixes, some optimizations, code to work correctly in situation when you call update in NMI and start sound effects from the main code.
ca65 version converted with the tool is tested, it works correctly.
Fixed a bug in text2data with incorrect RLE compression in envelopes (encoded 3+ as 5+ frames).
Another update. Fixes some things in text2data, and also adds two switches -onlyins and -noins. Using these switches you can export instrument and music data separately, it is useful when you need to save some space by using the same instruments data with few songs.
Warning: text2data don't like songs with patterns of different weird lengths (with effects D00 and Bxx), in some cases it can create wrong music data. Needs to be fixed.
I went to Shiru's website, It seems to be down, Maybe permanently.
Just thought I'd let you know.
Thanks to my hoster for my new signature. Just wait a day, it will work again. FTP links works always, though.
FYI, I've added FamiTone text export option in
Pornotracker.
I just wanted to say Famitone is a really nice library/package. I've got my Famitracker music running (with DPCM drums) and multichannel tri/noise sound effects I made from .ftm->.nsf->famitone data.
One small possible bug report, I'm using ca65, and I had to fix one small bug to get my sound effects working. I needed to change
.if(~FT_SFX_ENABLE)
from using bitwise not "~" to logical not "!"
.if( !FT_SFX_ENABLE)
Expected, or something else I should have done?
In my version it is logical not, and it haven't change for long time, so maybe you got some older version (current is 1.24)?
I just realized: No duty envelope means no realistic hi-hats that alternate looped noise and regular noise. I can provide a sample of what I mean from another music engine, which maps pulse duty onto the volume envelopes and noise duty onto the arpeggio envelopes.
I know what you mean. I used it in my very first NES song, don't use it anymore, because it does not sounds realistic or good to me (should be noise+tone to be realistic). Certainly not that useful to be worth extra CPU time to process an extra envelope.
Hi.
I recently was forced to format my PC.I had backup of most files so I lost like, nothing.
But there's something odd.I can't use exporter plugin anymore.
Every time I try to export music, no file is produced.Also, by some weird reason, Text exporter is named "Custom exporter" when you want to export your music.Just no file is produced when I try to export music.
Yes, I downloaded famitone and famitracker, but it's still the same.Since Famitracke is working fine I wanted to ask for help here before famitracker's forum.
Any thoughts why this happens?
Edit:
Almost forgot: other files types exports just fine(NFS, NES etc).
Which version of FamiTracker you have now?
I tried 3 versions.(3.5, 3.6, and 3.7).
None works.It's same problem with every version.
3.5 certainly won't work. 3.6 and above should work. Just tested the version I have currently, 0.3.8 beta 4 - it works fine. So I have no idea why it does not work for you, sorry.
Eureka!
I found solution.
If anyone have same problem:
This problem was (probably) caused by
Virut virus. After removing it, everything works perfectly.
Hey, I've downloaded Famitone today and I've found out that demo doesn't behave when region is set to PAL in Nestopia (if switched when rom is running, it changes in pitch, if switched before it doesn't run). Is it problem with demo ROM or Famitone? If latter, when it'll be fixed?
//edit: From famitone.s
Code:
;reset APU, initialize FamiTone
;in: A 0 for PAL, not 0 for NTSC
FamiToneInit:
cmp #0
beq @pal
lda #$ff
@pal:
sta FT_PAL_ADJUST
lda #$0f ;enable channels, stop DMC
sta APU_SND_CHN
lda #$81 ;disable triangle length counter
sta APU_TRI_LINEAR
lda #$01 ;load noise length
sta APU_NOISE_HI
lda #$30 ;volumes to 0
sta APU_PL1_VOL
sta APU_PL2_VOL
sta APU_NOISE_VOL
lda #$08 ;no sweep
sta APU_PL1_SWEEP
sta APU_PL2_SWEEP
lda #$ff
sta FT_PULSE1_PREV
sta FT_PULSE2_PREV
;stop music that currently plays (it is a part of FamiToneInit as well)
FamiToneMusicStop:
I don't know much of assembly yet, but is FamitoneInit supposed to fall through into FamitoneMusicStop? Or is there missing rts?
You should not switch PAL/NTSC in an emulator while a program run, because detection only happens at start up. Nestopia actually resets the program when you switch the region, isn't? Region detection does not work there indeed, don't know why. It works in FCEUX and Nintendulator, so maybe it is something with Nestopia itself?
PAL support in Famitone does not correct pitch, only speed.
Yes, the code falls through, it is how it supposed to be. Otherwise it would be just an extra jsr:rts, makes not much sense.
Also, would be possible to write plugin for Famitracker that would directly export to format used by Famitone, removing middleman (converting from text to data)? Because converter fails with "could not find frames" error or something like that. Here's text file generated by TextExporter:
Code:
# FamiTracker text export 0.4.2
# Song information
TITLE "Advanced Adventure"
AUTHOR "Chris"
COPYRIGHT ""
# Song comment
COMMENT ""
# Global settings
MACHINE 0
FRAMERATE 0
EXPANSION 0
VIBRATO 1
SPLIT 32
# Macros
MACRO 0 0 -1 -1 0 : 15 15 14 14 13 13 12 12 11 11 10 10 9 9 8 8 7 7 6 6 5 5 4 4 3 3 2 2 1 1 0 0
MACRO 0 1 -1 -1 0 : 1 1 2 2 3 3 4 4 5 5 6 6 5 5 4 4
MACRO 0 2 -1 -1 0 : 10 10 8 6 4 2 0
MACRO 1 0 -1 -1 0 : 2 0 -3 0
MACRO 2 0 -1 -1 0 : 13 8 15 21 13 15
MACRO 2 1 -1 -1 0 : 0 0 0 0
MACRO 3 0 -1 -1 0 : -5 -5 -6 -6
MACRO 4 0 -1 -1 0 : 1 2 2 1
# DPCM samples
# Instruments
INST2A03 0 0 -1 -1 -1 -1 "Tri Angle"
INST2A03 1 1 -1 -1 -1 -1 "Buzzer"
INST2A03 2 2 -1 -1 -1 -1 "Hat"
# Tracks
TRACK 64 6 150 "New song"
COLUMNS : 1 1 1 1 1
ORDER 00 : 00 00 00 00 00
ORDER 01 : 00 00 00 00 00
ORDER 02 : 01 00 00 02 00
ORDER 03 : 02 00 00 01 00
ORDER 04 : 04 00 00 01 00
ORDER 05 : 00 01 00 00 00
ORDER 06 : 00 01 01 00 00
ORDER 07 : 03 02 01 00 00
ORDER 08 : 03 02 01 02 00
ORDER 09 : 01 02 01 02 00
ORDER 0A : 02 02 00 01 00
ORDER 0B : 04 01 00 02 00
ORDER 0C : 02 01 00 01 00
ORDER 0D : 01 01 00 00 00
ORDER 0E : 00 01 00 00 00
PATTERN 00
ROW 00 : --- .. . ... : ... .. . ... : C-5 00 . ... : ... .. . ... : ... .. . ...
ROW 01 : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ...
ROW 02 : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ...
ROW 03 : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ...
ROW 04 : ... .. . ... : ... .. . ... : E-5 00 . ... : ... .. . ... : ... .. . ...
ROW 05 : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ...
ROW 06 : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ...
ROW 07 : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ...
ROW 08 : ... .. . ... : ... .. . ... : G-5 00 . ... : ... .. . ... : ... .. . ...
ROW 09 : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ...
ROW 0A : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ...
ROW 0B : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ...
ROW 0C : ... .. . ... : ... .. . ... : B-5 00 . ... : ... .. . ... : ... .. . ...
ROW 0D : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ...
ROW 0E : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ...
ROW 0F : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ...
ROW 10 : ... .. . ... : ... .. . ... : C-5 00 . ... : ... .. . ... : ... .. . ...
ROW 11 : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ...
ROW 12 : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ...
ROW 13 : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ...
ROW 14 : ... .. . ... : ... .. . ... : E-5 00 . ... : ... .. . ... : ... .. . ...
ROW 15 : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ...
ROW 16 : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ...
ROW 17 : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ...
ROW 18 : ... .. . ... : ... .. . ... : G-5 00 . ... : ... .. . ... : ... .. . ...
ROW 19 : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ...
ROW 1A : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ...
ROW 1B : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ...
ROW 1C : ... .. . ... : ... .. . ... : E-5 00 . ... : ... .. . ... : ... .. . ...
ROW 1D : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ...
ROW 1E : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ...
ROW 1F : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ...
ROW 20 : ... .. . ... : ... .. . ... : C-5 00 . ... : ... .. . ... : ... .. . ...
ROW 21 : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ...
ROW 22 : ... .. . ... : ... .. . ... : E-5 00 . ... : ... .. . ... : ... .. . ...
ROW 23 : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ...
ROW 24 : ... .. . ... : ... .. . ... : A-5 00 . ... : ... .. . ... : ... .. . ...
ROW 25 : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ...
ROW 26 : ... .. . ... : ... .. . ... : C-6 00 . ... : ... .. . ... : ... .. . ...
ROW 27 : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ...
ROW 28 : ... .. . ... : ... .. . ... : C-5 00 . ... : ... .. . ... : ... .. . ...
ROW 29 : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ...
ROW 2A : ... .. . ... : ... .. . ... : E-5 00 . ... : ... .. . ... : ... .. . ...
ROW 2B : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ...
ROW 2C : ... .. . ... : ... .. . ... : G-5 00 . ... : ... .. . ... : ... .. . ...
ROW 2D : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ...
ROW 2E : ... .. . ... : ... .. . ... : D-5 00 . ... : ... .. . ... : ... .. . ...
ROW 2F : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ...
ROW 30 : ... .. . ... : ... .. . ... : C-5 00 . ... : ... .. . ... : ... .. . ...
ROW 31 : ... .. . ... : ... .. . ... : D-5 00 . ... : ... .. . ... : ... .. . ...
ROW 32 : ... .. . ... : ... .. . ... : E-5 00 . ... : ... .. . ... : ... .. . ...
ROW 33 : ... .. . ... : ... .. . ... : F-5 00 . ... : ... .. . ... : ... .. . ...
ROW 34 : ... .. . ... : ... .. . ... : C-5 00 . ... : ... .. . ... : ... .. . ...
ROW 35 : ... .. . ... : ... .. . ... : D-5 00 . ... : ... .. . ... : ... .. . ...
ROW 36 : ... .. . ... : ... .. . ... : E-5 00 . ... : ... .. . ... : ... .. . ...
ROW 37 : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ...
ROW 38 : ... .. . ... : ... .. . ... : C-5 00 . ... : ... .. . ... : ... .. . ...
ROW 39 : ... .. . ... : ... .. . ... : D-5 00 . ... : ... .. . ... : ... .. . ...
ROW 3A : ... .. . ... : ... .. . ... : E-5 00 . ... : ... .. . ... : ... .. . ...
ROW 3B : ... .. . ... : ... .. . ... : F-5 00 . ... : ... .. . ... : ... .. . ...
ROW 3C : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ...
ROW 3D : ... .. . ... : ... .. . ... : D-5 00 . ... : ... .. . ... : ... .. . ...
ROW 3E : ... .. . ... : ... .. . ... : C-5 00 . ... : ... .. . ... : ... .. . ...
ROW 3F : ... .. . ... : ... .. . ... : D-5 00 . ... : ... .. . ... : ... .. . ...
PATTERN 01
ROW 00 : C-1 01 . ... : C-4 00 . ... : ... .. . ... : C-# 02 . ... : ... .. . ...
ROW 01 : ... .. . ... : ... 00 . ... : ... .. . ... : ... .. . ... : ... .. . ...
ROW 02 : ... .. . ... : ... 00 . ... : ... .. . ... : C-# 02 . ... : ... .. . ...
ROW 03 : ... .. . ... : ... 00 . ... : ... .. . ... : ... .. . ... : ... .. . ...
ROW 04 : ... .. . ... : E-4 00 . ... : ... .. . ... : C-# 02 . ... : ... .. . ...
ROW 05 : ... .. . ... : ... 00 . ... : ... .. . ... : ... .. . ... : ... .. . ...
ROW 06 : ... .. . ... : ... 00 . ... : ... .. . ... : C-# 02 . ... : ... .. . ...
ROW 07 : ... .. . ... : ... 00 . ... : ... .. . ... : ... .. . ... : ... .. . ...
ROW 08 : ... .. . ... : G-4 00 . ... : ... .. . ... : C-# 02 . ... : ... .. . ...
ROW 09 : ... .. . ... : ... 00 . ... : ... .. . ... : ... .. . ... : ... .. . ...
ROW 0A : ... .. . ... : ... 00 . ... : ... .. . ... : C-# 02 . ... : ... .. . ...
ROW 0B : ... .. . ... : ... 00 . ... : ... .. . ... : ... .. . ... : ... .. . ...
ROW 0C : ... .. . ... : B-4 00 . ... : ... .. . ... : C-# 02 . ... : ... .. . ...
ROW 0D : ... .. . ... : ... 00 . ... : ... .. . ... : ... .. . ... : ... .. . ...
ROW 0E : ... .. . ... : ... 00 . ... : ... .. . ... : C-# 02 . ... : ... .. . ...
ROW 0F : ... .. . ... : ... 00 . ... : ... .. . ... : ... .. . ... : ... .. . ...
ROW 10 : ... .. . ... : C-4 00 . ... : ... .. . ... : C-# 02 . ... : ... .. . ...
ROW 11 : ... .. . ... : ... 00 . ... : ... .. . ... : ... .. . ... : ... .. . ...
ROW 12 : ... .. . ... : ... 00 . ... : ... .. . ... : C-# 02 . ... : ... .. . ...
ROW 13 : ... .. . ... : ... 00 . ... : ... .. . ... : ... .. . ... : ... .. . ...
ROW 14 : ... .. . ... : E-4 00 . ... : ... .. . ... : C-# 02 . ... : ... .. . ...
ROW 15 : ... .. . ... : ... 00 . ... : ... .. . ... : ... .. . ... : ... .. . ...
ROW 16 : ... .. . ... : ... 00 . ... : ... .. . ... : C-# 02 . ... : ... .. . ...
ROW 17 : ... .. . ... : ... 00 . ... : ... .. . ... : ... .. . ... : ... .. . ...
ROW 18 : ... .. . ... : G-4 00 . ... : ... .. . ... : C-# 02 . ... : ... .. . ...
ROW 19 : ... .. . ... : ... 00 . ... : ... .. . ... : ... .. . ... : ... .. . ...
ROW 1A : ... .. . ... : ... 00 . ... : ... .. . ... : C-# 02 . ... : ... .. . ...
ROW 1B : ... .. . ... : ... 00 . ... : ... .. . ... : ... .. . ... : ... .. . ...
ROW 1C : ... .. . ... : E-4 00 . ... : ... .. . ... : C-# 02 . ... : ... .. . ...
ROW 1D : ... .. . ... : ... 00 . ... : ... .. . ... : ... .. . ... : ... .. . ...
ROW 1E : ... .. . ... : ... 00 . ... : ... .. . ... : C-# 02 . ... : ... .. . ...
ROW 1F : ... .. . ... : ... 00 . ... : ... .. . ... : ... .. . ... : ... .. . ...
ROW 20 : ... .. . ... : C-4 00 . ... : ... .. . ... : C-# 02 . ... : ... .. . ...
ROW 21 : ... .. . ... : ... 00 . ... : ... .. . ... : ... .. . ... : ... .. . ...
ROW 22 : ... .. . ... : E-4 00 . ... : ... .. . ... : C-# 02 . ... : ... .. . ...
ROW 23 : ... .. . ... : ... 00 . ... : ... .. . ... : ... .. . ... : ... .. . ...
ROW 24 : ... .. . ... : A-4 00 . ... : ... .. . ... : C-# 02 . ... : ... .. . ...
ROW 25 : ... .. . ... : ... 00 . ... : ... .. . ... : ... .. . ... : ... .. . ...
ROW 26 : ... .. . ... : C-5 00 . ... : ... .. . ... : C-# 02 . ... : ... .. . ...
ROW 27 : ... .. . ... : ... 00 . ... : ... .. . ... : ... .. . ... : ... .. . ...
ROW 28 : ... .. . ... : C-4 00 . ... : ... .. . ... : C-# 02 . ... : ... .. . ...
ROW 29 : ... .. . ... : ... 00 . ... : ... .. . ... : ... .. . ... : ... .. . ...
ROW 2A : ... .. . ... : E-4 00 . ... : ... .. . ... : C-# 02 . ... : ... .. . ...
ROW 2B : ... .. . ... : ... 00 . ... : ... .. . ... : ... .. . ... : ... .. . ...
ROW 2C : ... .. . ... : G-4 00 . ... : ... .. . ... : C-# 02 . ... : ... .. . ...
ROW 2D : ... .. . ... : ... 00 . ... : ... .. . ... : ... .. . ... : ... .. . ...
ROW 2E : ... .. . ... : D-4 00 . ... : ... .. . ... : C-# 02 . ... : ... .. . ...
ROW 2F : ... .. . ... : ... 00 . ... : ... .. . ... : ... .. . ... : ... .. . ...
ROW 30 : ... .. . ... : C-4 00 . ... : ... .. . ... : C-# 02 . ... : ... .. . ...
ROW 31 : ... .. . ... : D-4 00 . ... : ... .. . ... : ... .. . ... : ... .. . ...
ROW 32 : ... .. . ... : E-4 00 . ... : ... .. . ... : C-# 02 . ... : ... .. . ...
ROW 33 : ... .. . ... : F-4 00 . ... : ... .. . ... : ... .. . ... : ... .. . ...
ROW 34 : ... .. . ... : C-4 00 . ... : ... .. . ... : C-# 02 . ... : ... .. . ...
ROW 35 : ... .. . ... : D-4 00 . ... : ... .. . ... : ... .. . ... : ... .. . ...
ROW 36 : ... .. . ... : E-4 00 . ... : ... .. . ... : C-# 02 . ... : ... .. . ...
ROW 37 : ... .. . ... : ... 00 . ... : ... .. . ... : ... .. . ... : ... .. . ...
ROW 38 : ... .. . ... : C-4 00 . ... : ... .. . ... : C-# 02 . ... : ... .. . ...
ROW 39 : ... .. . ... : D-4 00 . ... : ... .. . ... : ... .. . ... : ... .. . ...
ROW 3A : ... .. . ... : E-4 00 . ... : ... .. . ... : C-# 02 . ... : ... .. . ...
ROW 3B : ... .. . ... : F-4 00 . ... : ... .. . ... : ... .. . ... : ... .. . ...
ROW 3C : ... .. . ... : ... 00 . ... : ... .. . ... : C-# 02 . ... : ... .. . ...
ROW 3D : ... .. . ... : D-4 00 . ... : ... .. . ... : ... .. . ... : ... .. . ...
ROW 3E : ... .. . ... : C-4 00 . ... : ... .. . ... : C-# 02 . ... : ... .. . ...
ROW 3F : ... .. . ... : D-4 00 . ... : ... .. . ... : C-# 02 . ... : ... .. . ...
PATTERN 02
ROW 00 : E-1 01 . ... : C-5 00 . ... : ... .. . ... : C-# 02 . ... : ... .. . ...
ROW 01 : ... .. . ... : ... 00 . ... : ... .. . ... : ... .. . ... : ... .. . ...
ROW 02 : ... .. . ... : D-5 00 . ... : ... .. . ... : ... .. . ... : ... .. . ...
ROW 03 : ... .. . ... : E-5 00 . ... : ... .. . ... : ... .. . ... : ... .. . ...
ROW 04 : ... .. . ... : F-5 00 . ... : ... .. . ... : C-# 02 . ... : ... .. . ...
ROW 05 : ... .. . ... : ... 00 . ... : ... .. . ... : ... .. . ... : ... .. . ...
ROW 06 : ... .. . ... : G-5 00 . ... : ... .. . ... : ... .. . ... : ... .. . ...
ROW 07 : ... .. . ... : ... 00 . ... : ... .. . ... : ... .. . ... : ... .. . ...
ROW 08 : ... .. . ... : A-5 00 . ... : ... .. . ... : C-# 02 . ... : ... .. . ...
ROW 09 : ... .. . ... : B-5 00 . ... : ... .. . ... : ... .. . ... : ... .. . ...
ROW 0A : ... .. . ... : C-6 00 . ... : ... .. . ... : C-# 02 . ... : ... .. . ...
ROW 0B : ... .. . ... : ... 00 . ... : ... .. . ... : ... .. . ... : ... .. . ...
ROW 0C : ... .. . ... : C-5 00 . ... : ... .. . ... : C-# 02 . ... : ... .. . ...
ROW 0D : ... .. . ... : D-5 00 . ... : ... .. . ... : ... .. . ... : ... .. . ...
ROW 0E : ... .. . ... : E-5 00 . ... : ... .. . ... : ... .. . ... : ... .. . ...
ROW 0F : ... .. . ... : F-5 00 . ... : ... .. . ... : ... .. . ... : ... .. . ...
ROW 10 : ... .. . ... : ... 00 . ... : ... .. . ... : C-# 02 . ... : ... .. . ...
ROW 11 : ... .. . ... : ... 00 . ... : ... .. . ... : ... .. . ... : ... .. . ...
ROW 12 : ... .. . ... : ... 00 . ... : ... .. . ... : ... .. . ... : ... .. . ...
ROW 13 : ... .. . ... : ... 00 . ... : ... .. . ... : ... .. . ... : ... .. . ...
ROW 14 : ... .. . ... : C-5 00 . ... : ... .. . ... : C-# 02 . ... : ... .. . ...
ROW 15 : ... .. . ... : D-5 00 . ... : ... .. . ... : ... .. . ... : ... .. . ...
ROW 16 : ... .. . ... : E-5 00 . ... : ... .. . ... : ... .. . ... : ... .. . ...
ROW 17 : ... .. . ... : F-5 00 . ... : ... .. . ... : ... .. . ... : ... .. . ...
ROW 18 : ... .. . ... : ... 00 . ... : ... .. . ... : C-# 02 . ... : ... .. . ...
ROW 19 : ... .. . ... : ... 00 . ... : ... .. . ... : ... .. . ... : ... .. . ...
ROW 1A : ... .. . ... : ... 00 . ... : ... .. . ... : C-# 02 . ... : ... .. . ...
ROW 1B : ... .. . ... : ... 00 . ... : ... .. . ... : ... .. . ... : ... .. . ...
ROW 1C : ... .. . ... : C-4 00 . ... : ... .. . ... : C-# 02 . ... : ... .. . ...
ROW 1D : ... .. . ... : D-4 00 . ... : ... .. . ... : ... .. . ... : ... .. . ...
ROW 1E : ... .. . ... : E-4 00 . ... : ... .. . ... : ... .. . ... : ... .. . ...
ROW 1F : ... .. . ... : F-4 00 . ... : ... .. . ... : ... .. . ... : ... .. . ...
ROW 20 : ... .. . ... : ... 00 . ... : ... .. . ... : C-# 02 . ... : ... .. . ...
ROW 21 : ... .. . ... : ... 00 . ... : ... .. . ... : ... .. . ... : ... .. . ...
ROW 22 : ... .. . ... : ... 00 . ... : ... .. . ... : ... .. . ... : ... .. . ...
ROW 23 : ... .. . ... : ... 00 . ... : ... .. . ... : ... .. . ... : ... .. . ...
ROW 24 : ... .. . ... : B-5 00 . ... : ... .. . ... : C-# 02 . ... : ... .. . ...
ROW 25 : ... .. . ... : C-6 00 . ... : ... .. . ... : ... .. . ... : ... .. . ...
ROW 26 : ... .. . ... : D-6 00 . ... : ... .. . ... : ... .. . ... : ... .. . ...
ROW 27 : ... .. . ... : B-5 00 . ... : ... .. . ... : ... .. . ... : ... .. . ...
ROW 28 : ... .. . ... : ... 00 . ... : ... .. . ... : C-# 02 . ... : ... .. . ...
ROW 29 : ... .. . ... : ... 00 . ... : ... .. . ... : ... .. . ... : ... .. . ...
ROW 2A : ... .. . ... : ... 00 . ... : ... .. . ... : C-# 02 . ... : ... .. . ...
ROW 2B : ... .. . ... : ... 00 . ... : ... .. . ... : ... .. . ... : ... .. . ...
ROW 2C : ... .. . ... : B-4 00 . ... : ... .. . ... : C-# 02 . ... : ... .. . ...
ROW 2D : ... .. . ... : C-5 00 . ... : ... .. . ... : ... .. . ... : ... .. . ...
ROW 2E : ... .. . ... : D-5 00 . ... : ... .. . ... : ... .. . ... : ... .. . ...
ROW 2F : ... .. . ... : B-4 00 . ... : ... .. . ... : ... .. . ... : ... .. . ...
ROW 30 : ... .. . ... : ... 00 . ... : ... .. . ... : C-# 02 . ... : ... .. . ...
ROW 31 : ... .. . ... : ... 00 . ... : ... .. . ... : ... .. . ... : ... .. . ...
ROW 32 : ... .. . ... : ... 00 . ... : ... .. . ... : ... .. . ... : ... .. . ...
ROW 33 : ... .. . ... : ... 00 . ... : ... .. . ... : ... .. . ... : ... .. . ...
ROW 34 : ... .. . ... : C-5 00 . ... : ... .. . ... : C-# 02 . ... : ... .. . ...
ROW 35 : ... .. . ... : D-5 00 . ... : ... .. . ... : ... .. . ... : ... .. . ...
ROW 36 : ... .. . ... : E-5 00 . ... : ... .. . ... : ... .. . ... : ... .. . ...
ROW 37 : ... .. . ... : ... 00 . ... : ... .. . ... : ... .. . ... : ... .. . ...
ROW 38 : ... .. . ... : F-5 00 . ... : ... .. . ... : C-# 02 . ... : ... .. . ...
ROW 39 : ... .. . ... : G-5 00 . ... : ... .. . ... : ... .. . ... : ... .. . ...
ROW 3A : ... .. . ... : A-5 00 . ... : ... .. . ... : C-# 02 . ... : ... .. . ...
ROW 3B : ... .. . ... : ... 00 . ... : ... .. . ... : ... .. . ... : ... .. . ...
ROW 3C : ... .. . ... : C-5 00 . ... : ... .. . ... : C-# 02 . ... : ... .. . ...
ROW 3D : ... .. . ... : A-4 00 . ... : ... .. . ... : ... .. . ... : ... .. . ...
ROW 3E : ... .. . ... : F-4 00 . ... : ... .. . ... : ... .. . ... : ... .. . ...
ROW 3F : ... .. . ... : D-4 00 . ... : ... .. . ... : ... .. . ... : ... .. . ...
PATTERN 03
ROW 00 : G-5 00 . ... : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ...
ROW 01 : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ...
ROW 02 : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ...
ROW 03 : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ...
ROW 04 : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ...
ROW 05 : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ...
ROW 06 : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ...
ROW 07 : E-5 00 . ... : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ...
ROW 08 : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ...
ROW 09 : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ...
ROW 0A : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ...
ROW 0B : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ...
ROW 0C : D-4 00 . ... : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ...
ROW 0D : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ...
ROW 0E : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ...
ROW 0F : E-4 00 . ... : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ...
ROW 10 : G-4 00 . ... : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ...
ROW 11 : D-4 00 . ... : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ...
ROW 12 : B-4 00 . ... : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ...
ROW 13 : G-4 00 . ... : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ...
ROW 14 : E-4 00 . ... : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ...
ROW 15 : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ...
ROW 16 : G-4 00 . ... : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ...
ROW 17 : D-4 00 . ... : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ...
ROW 18 : C-4 00 . ... : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ...
ROW 19 : C-4 00 . ... : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ...
ROW 1A : A-5 00 . ... : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ...
ROW 1B : G-4 00 . ... : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ...
ROW 1C : A-4 00 . ... : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ...
ROW 1D : C-4 00 . ... : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ...
ROW 1E : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ...
ROW 1F : D-4 00 . ... : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ...
ROW 20 : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ...
ROW 21 : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ...
ROW 22 : F-4 00 . ... : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ...
ROW 23 : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ...
ROW 24 : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ...
ROW 25 : E-5 00 . ... : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ...
ROW 26 : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ...
ROW 27 : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ...
ROW 28 : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ...
ROW 29 : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ...
ROW 2A : D-4 00 . ... : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ...
ROW 2B : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ...
ROW 2C : G-5 00 . ... : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ...
ROW 2D : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ...
ROW 2E : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ...
ROW 2F : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ...
ROW 30 : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ...
ROW 31 : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ...
ROW 32 : C-4 00 . ... : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ...
ROW 33 : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ...
ROW 34 : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ...
ROW 35 : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ...
ROW 36 : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ...
ROW 37 : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ...
ROW 38 : D-5 00 . ... : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ...
ROW 39 : E-5 00 . ... : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ...
ROW 3A : F-5 00 . ... : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ...
ROW 3B : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ...
ROW 3C : A-4 00 . ... : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ...
ROW 3D : F-4 00 . ... : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ...
ROW 3E : D-4 00 . ... : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ...
ROW 3F : A-3 00 . ... : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ...
PATTERN 04
ROW 00 : A-0 01 . ... : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ...
ROW 01 : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ...
ROW 02 : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ...
ROW 03 : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ...
ROW 04 : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ...
ROW 05 : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ...
ROW 06 : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ...
ROW 07 : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ...
ROW 08 : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ...
ROW 09 : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ...
ROW 0A : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ...
ROW 0B : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ...
ROW 0C : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ...
ROW 0D : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ...
ROW 0E : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ...
ROW 0F : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ...
ROW 10 : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ...
ROW 11 : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ...
ROW 12 : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ...
ROW 13 : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ...
ROW 14 : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ...
ROW 15 : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ...
ROW 16 : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ...
ROW 17 : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ...
ROW 18 : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ...
ROW 19 : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ...
ROW 1A : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ...
ROW 1B : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ...
ROW 1C : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ...
ROW 1D : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ...
ROW 1E : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ...
ROW 1F : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ...
ROW 20 : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ...
ROW 21 : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ...
ROW 22 : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ...
ROW 23 : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ...
ROW 24 : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ...
ROW 25 : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ...
ROW 26 : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ...
ROW 27 : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ...
ROW 28 : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ...
ROW 29 : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ...
ROW 2A : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ...
ROW 2B : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ...
ROW 2C : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ...
ROW 2D : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ...
ROW 2E : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ...
ROW 2F : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ...
ROW 30 : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ...
ROW 31 : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ...
ROW 32 : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ...
ROW 33 : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ...
ROW 34 : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ...
ROW 35 : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ...
ROW 36 : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ...
ROW 37 : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ...
ROW 38 : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ...
ROW 39 : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ...
ROW 3A : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ...
ROW 3B : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ...
ROW 3C : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ...
ROW 3D : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ...
ROW 3E : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ...
ROW 3F : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ... : ... .. . ...
# End of export
There's no need to paste the whole file here. Maybe use pastebin.
By the way, when I implemented the text export for Famitracker, I also implemented command line exporting as well, so you can automate the process with a batch script or whatnot.
There is no plans for new FamiTracker plugin, or any major changes in the original FamiTone. I do have plans for a completely new version that will improve efficiency of the engine, and will utilize the rainwarrior's text exporter rather than custom plugin.
Text files as a 'middle man' is actually a good thing, as any other tracker could output text in the same format to get compatibility with the engine. It has been done with the Musetracker.
Shiru wrote:
... I do have plans for a completely new version that will improve efficiency of the engine, and will utilize the rainwarrior's text exporter rather than custom plugin.
FYI It's here! See thread:
FamiTone2 audio library
I was able to finally implement FamiTone to my code. Unfortunately, nowhere I read how much memory it can take up.
FT_BASE_ADR = $0300 ;page in RAM, should be $xx00
In my code, I noticed that it is about 128 bytes.
Is this the maximum size ?, or may depend on the size of music?
I use only NES'a channels without any additional chips.
RAM usage is a fixed size.
ROM usage depends on the music.
CPU usage depends somewhat on the music/sfx playing but there is a maximum.
sdm wrote:
FT_BASE_ADR = $0300 ;page in RAM, should be $xx00
In my code, I noticed that it is about 128 bytes.
The documentation (readme.txt) lists the non-zp memory usage as 186 bytes for FamiTone2 (v1.15).
Is it possible to have all the famitone code with music and sfx in the UNROM bank? (one of those switchable). Currently I have in $ E000 (bank not switchable). Do not know if it's possible at all in the famitone?
Personally, I would prefer the famitone code in the fixed bank, and the data in switchable banks. But I suppose you could also put the code in the switchable bank.
The only thing you CAN'T put in the switchable bank (UNROM style) is DPCM samples.
I have a problem running Famitone, which has music/sfx data in the switch bank:
Code:
.bank 12 ;UNROM bank switchable
.org $8000
MUSIC:
.include "music.asm"
SFX:
.include "sfx.asm"
;------------------------------------------------
.bank 14 ;UNROM bank fixed (last, non-switchable)
.org $C000
.include "famitone2.asm"
;------------------------------------------------
NMI: ;NMI code in the last bank
JSR FamiToneUpdate
:------------------------------------------------
;This code is also in the last bank:
LDA #$6
STA Bank_TBL+6 ;Change to bank contains MUSIC & SFX
lda #01 ;FAMITONE INIT.
ldx #low(Muzyka)
ldy #high(Muzyka)
jsr FamiToneInit
ldx #LOW(SFX)
ldy #HIGH(SFX)
jsr FamiToneSfxInit
lda #0 ;FAMITONE (song nr.)
JSR FamiToneMusicPlay
LDA #$0
STA Bank_TBL ;back to code bank
Quote:
JSR FamiToneUpdate
You should be switching music data banks IN before you call FamiToneUpdate. Are you?
I do not know what's wrong: / Can you check the code?
What was your problem again?
Did you resolve it?
I looked at your code, and (as I suggested), you need to switch banks before calling FamiToneUpdate. Using your code...
Code:
Forever:
JSR VBWait
JSR ReadPad
JSR SeeCTRL
LDA #$6 ;has the music data
STA Bank_TBL+6
JSR FamiToneUpdate
LDA #$0
STA Bank_TBL
JMP Forever
because, it currently gets stuck in an infinite loop the first time it jumps to FamiToneUpdate, because the music data isn't in place.