############################################# ## Keys for changing octaves ## ############################################# ### A - visible octaves: 1-3 ### B - visible octaves: 2-4 ### C - visible octaves: 3-5 ############################################# ## Supported effects in the sample-editor ## ############################################# ### Sample name format: "@xxx@ blah blah" ### where xxx - following sample effects: ### A - Anticlick ### S - High-quality portamento ### D - Distortion ### C - Simple cut-off ### W - Simple wah-wah ### Examples: ### @AD@samplename - sample with anticlick and distortion ### samplename - just a sample without effects ############################################# ## Supported effects in the pattern-editor ## ############################################# .-------------------------------------------. | Standart effects: | `-------------------------------------------` ### Format: Exx (E - effect number; xx - parameter) ### 1xx - Portamento Up ### 2xx - Portamento Down ### 3xx - TonePortamento ### 9xx - SampleOffset ### Axx - VolumeSlide ### Bxx - PositionJump ### Cxx - Set Volume ### Dxx - PatternBreak ### Exx - Extended effects ### Fxx - Set Speed .-------------------------------------------. | Extended effects: | `-------------------------------------------` ### Format: ENx (E - E; N - effect number; x - parameter) ### E1x - Fineslide Up ### E2x - Fineslide Down ### EAx - FineVol Up ### EBx - FineVol Down .-------------------------------------------. | PsyTexx1.x specific effects: | `-------------------------------------------` ### 6xx - Wah-wah speed ### 7xx - Cut-off value ### 8xx - Super-pitch note (FF - reset) Cmd 1. Portamento up [Speed:$00-$FF] ------------------------------------ Usage: $1 + portamento speed Portamento up will simply slide the sample pitch up. You can NOT slide higher than B-3! (Period 113) Example: C-300103 1 is the command, 3 is the portamentospeed. NOTE: The portamento will be called as many times as the speed of the song. This means that you'll sometimes have trouble sliding accuratly. If you change the speed without changing the sliderates, it will sound bad... Cmd 2. Portamento down [Speed:$00-FF] ------------------------------------- Usage: $2 + portamento speed Just like command 1, except that this one slides the pitch down instead. (Adds to the period). You can NOT slide lower than C-1! (Period 856) Example: C-300203 2 is the command, 3 is the portamentospeed. Cmd 3. Tone-portamento [Speed:$00-$FF] -------------------------------------- Usage: Dest-note + $3 + slidespeed This command will automatically slide from the old note to the new. You don't have to worry about which direction to slide, you need only set the slide speed. To keep on sliding, just select the command $3 + 00. Example: A-200000 First play a note. C-300305 C-3 is the note to slide to, 3 the command, and 5 the speed. Cmd 9. Set SampleOffset [Offs:$00-$FF] -------------------------------------- Usage: $9 + Sampleoffset This command will play from a chosen position in the sample, and not from the beginning. The two numbers equal the two first numbers in the length of the sample. Handy for speech- samples. Example: C-300923 Play sample from offset $2300. Cmd A. Volumeslide [Speed:$0-$F/$0-$F] -------------------------------------- Usage: $A + upspeed + downspeed Example: C-300A05 5 is the speed to turn the volume down. C-300A40 4 is the speed to slide it up. NOTE: The slide will be called as many times as the speed of the song. The slower the song, the more the volume will be changed on each note. Cmd B. Position-jump [Pos:$00-$7F] ---------------------------------- Usage: $B + position to continue at Example: C-300B01 B is the command, 1 is the position to restart the song at. This command will also perform a pattern-break (see 2 pages below). You can use this command instead of restart as on noisetracker, but you must enter the position in hex! Cmd C. Set volume [Volume:$00-$40] ---------------------------------- Usage: $C + new volume Well, this old familiar command will set the current volume to your own selected. The highest volume is $40. All volumes are represented in hex. (Programmers do it in hex, you know!) Example: C-300C10 C is the command, 10 is the volume (16 decimal). Cmd D. Pattern-break [Pattern-pos:00-63, decimal] ---------------------------- Usage: $D + pattern-position This command just jumps to the next song-position, and continues play from the patternposition you specify. Example: C-300D00 Jump to the next song-position and continue play from patternposition 00. Or: C-300D32 Jump to the next song-position and continue play from patternposition 32 instead. Cmd E1. Fineslide up [Range:$0-$F] ---------------------------------- Usage: $E1 + value This command works just like the normal portamento up, except that it only slides up once. It does not continue sliding during the length of the note. Example: C-300E11 Slide up 1 at the beginning of the note. (Great for creating chorus effects) Cmd E2. Fineslide down [Range:$0-$F] ------------------------------------ Usage: $E2 + value This command works just like the normal portamento down, except that it only slides down once. It does not continue sliding during the length of the note. Example: C-300E26 Slide up 6 at the beginning of the note. Cmd EA. FineVolsl up [Range:$0-$F] ---------------------------------- Usage: $EA + value This command works just like the normal volumeslide up, except that it only slides up once. It does not continue sliding during the length of the note. Example: C-300EA3 Slide volume up 1 at the beginning of the note. Cmd EB. FineVolsl down [Range:$0-$F] ------------------------------------ Usage: $EB + value This command works just like the normal volumeslide down, except that it only slides down once. It does not continue sliding during the length of the note. Example: C-300EB6 Slide volume down 6 at the beginning of the note. Cmd F. Set speed [Speed:$00-$FF] -------------------------------- Usage: $F + speed This command will set the speed of the song.26.05.02 14:03:51 ╚Єръ... ╧юцрыєщ, тёхЄръш сєфє чряшё√трЄ№ т ъЁрЄЎх їюф ЁрсюЄ√ эрф Psytexx. ╤ ьюьхэЄр Ёхышчр яюёыхфэхщ тхЁёшш 0.4 юэ єцх єёяхы яЁхтЁрЄшЄ№ё  т эрёЄю ∙шщ ЄЁхъхЁ. ═ръюэхЎ-Єю... ═ю ъюх-ъръшї ЇєэъЎшщ тёхцх х∙х эх їтрЄрхЄ... └ шьхээю: ъюяшЁютрэш /тёЄртъш, юўшёЄъш ьюфєы  ш чряшёш. ╩Ёюьх Єюую, ¤Єю ўєфю х∙х эшъЄю яюър эх тшфхы, ш эх Ёх°хэ тюяЁюё яю яютюфє хую ЁрёяЁюёЄЁрэхэш . ╒юЄхыюё№ с√ шчтыхў№ їюЄ№ ъръє■-Єю яЁшс√ы№, эю, ё фЁєующ ёЄюЁюэ√, эх їюўхЄё  чрЁрэхх юЄЄрыъштрЄ№ юЄ ёхс  oldskool ьєч√ърэЄют... ┼ёыш шь ¤Єю ъюэхўэю эрфю сєфхЄ .) ╚ х∙х... ╥єЄ ёхёёш  ъръ-Єю эхчрьхЄэю яюфъЁрырё№... ╥ръ-ўЄю эхъюЄюЁюх тЁхь  яЁшфхЄё  яюЄюЁьючшЄ№. ╧юър тёх. 26.05.02 19:54:31 ─юсртшы юўшёЄъє ярышЄЁ. 30.05.02 17:35:04 ┬Ёюфх фюфхыры ЇєэъЎш■ чряшёш т Єхъє∙шщ юЄъЁ√Є√щ ╠╬─-Їрщы... ╧юър ЁрсюЄрхЄ .) ═ю єцх тючэшъыш яЁюсыхь√: эх яюыєўрхЄё  т√фхышЄ№ Ёютэю 64 ъс ярь Єш :( ┴єфхь ЁрчсшЁрЄ№ё . 31.05.02 17:27:40 ═х їюўхЄ ЁрсюЄрЄ№ ЇєэъЎш  т√тюфр ЄхъёЄр т яюых... ╥єф√ хх :( 31.05.02 18:06:29 ╧юяЁртшы. 02.06.02 18:52:08 ╚ёяЁртшы ю°шсъє яЁш чряшёш Єхъє∙хую ьюфєы . ═х ЄхЁяшЄё  эръюэхЎ фюфхырЄ№ яхЁтє■ тхЁёш■ ш яюяЁюс√трЄ№ хх т фхых... 16.06.02 14:58:44 ═є тёх... ╧хЁтр  тхЁёш  юъюэўрЄхы№эю фюфхырэр... ┬Ёюфх :) ═є уы■ъш юэш тёхуфр ш тхчфх хёЄ№, Єръ ўЄю яюЄшїюэ№ъє сєфхь шёяЁрты Є№. 17.03.03 00:18:00 ╚эЄхЁхёэю, ъръ ¤Єю ьхэ  ё■фр ёэютр чрэхёыю... :) ┬ююс∙хь ёфхыры яюффхЁцъє Tungsten'р - ЄхяхЁ№ ьюф√ ьюцэю т эрє°эшърї яшёрЄ№. ╩Ёюьх Єюую фюсртшы эхёъюы№ъю яюыхчэюёЄхщ, р шьхээю 4 ЇєэъЎшш, т√ч√трхь√х шч юсырёЄш уЁрЇЇшЄш: 1 - ъыюэшЁютрэшх Єхъє∙хую ¤ЇЇхъЄр эр тхё№ ърэры 2 - Ёрчьэюцхэшх Єхъє∙хую сыюър эр тхё№ ърэры (сыюъюь ёўшЄрхЄё  яЁюьхцєЄюъ юЄ эрўрыр ярышЄЁ√ фю яюыюцхэш  ъєЁёюЁр тъы■ўшЄхы№эю) 3 - ¤їю (юфэю- ш фтєїърэры№эюх) 4 - яют√°хэшх/яюэшцхэшх эр Єюэ тёхї эюЄ т Єхъє∙хь ърэрых 5 - яыртэюх шчьхэхэшх уЁюьъюёЄш ърэрыр. ═р ёхуюфэ  їтрЄшЄ :) ╟ртЄЁр сєфхь шёя√Є√трЄ№... 20.03.03 23:49:23 ╙ЇЇ... ┬ёхЄръш Єръшх уыєя√х ю°шсъш яюЁющ с√тр■Є... ┴єътры№эю шч чр юфэюую ёшьтюыр тё  яЁюур Ёє°шЄё . ═хёъюы№ъю фэхщ шёъры :( ═рфю с√Є№ тэшьрЄхы№эхх. ╤юсёЄтхээю уютюЁ    Єръ ш эх тЁєсшыё , ъръ ьюцэю шч Tungsten'р т√уЁєцрЄ№ яЁюшчтюы№эє■ срчє фрээ√ї :) ╤ЄЁрээю... ╧Ёш°ыюё№ єїш∙Ёхэшх юфэю ёфхырЄ№: ЄхяхЁ№ яюёых т√їюфр шч ЄЁхъхЁр Єхъє∙р  ъюьяючшЎш  ёюїЁрэ хЄё  т BACKUP.MOD. ╥юы№ъю эх чрсєф№Єх ¤ЄюЄ BACKUP шэёЄрыышЁютрЄ№ тьхёЄх ё ёрьющ яЁюующ, ш Єюуфр яюёых ърцфющ ёшэїЁюэшчрЎшш ё фхёъЄюяюь Їрщышъ BACKUP_MOD.PDB сєфхЄ ыхцрЄ№ т ърЄрыюух PALM/.../BACKUP. ╬ёЄрэхЄё  хую ыш°№ ёъюэтхЁЄшЁютрЄ№ т эюЁьры№э√щ MOD ш ьюцэю сєфхЄ эрёыюцфрЄ№ё  ьєчюэюь, ъюЄюЁ√щ с√ы чруЁєцхэ т ЄЁхъхЁх яхЁхф ёрь√ь т√їюфюь. ┬ сышцрщ°шї яырэрї - ЁхфръЄюЁ ёхьяыют + чряшё№ ё ьшъЁюЇюэр. PsyTexx ЁєышЄ :)) └ ЄхяхЁ№... уь... ёярЄ№? :) 07.04.03 00:38:48 ╧хЁтр  тхЁёш  ЁхфръЄюЁр ёхьяыют єфрўэю ёЄрЁЄютрыр :) ╨рсюЄрхЄ чряшё№ шч ярышЄЁ ш ё ьшъЁюЇюэр. 26.08.03 18:24:00 ╩рЁЄшэр "═х цфрыш". ═хёъюы№ъю фэхщ эрчрф юърчрыюё№, ўЄю   тё╕ ¤Єю тЁхь  эхяЁртшы№эю ЁрсюЄры ёю чтєъютющ ёшёЄхьющ ╧ры№ьр .( ╞єЄ№... ▌Єюц ёъюы№ъю с√ыю ыш°эшї яЁюсыхь шч чр юфэющ Єюы№ъю эхфюЁрсюЄъш. ╧Ёшўхь эр ью╕ь TungstenT Єръющ ёяюёюс ёЁрсрЄ√тры, р тюЄ эр эютхэ№ъшї Zire ш T|C тючэшъыш ёхЁ№хчэ√х яЁюсыхь√. ╥хяхЁ№ фєьр■, ъръ яюф ¤Єю яюфёЄЁюшЄ№ ArmZX. └ тюЄ PsyTexx, ърцшё№, ёхуюфэ  єцх яхЁхфхыры эр эют√щ ырф .) ┼ёыш тё╕ яющфхЄ Єръ ъръ эрфю, Єю шуЁрЄ№ юэ сєфхЄ юсёюы■Єэю эр ы■сющ ьр°шэъх. 22.04.04 23:49:00 ╙Ї... ╬сэютър т тшфх тюё№ьш ърэрыют :) ═ю ёъюы№ъю сруют... эхяюэ Єэюую яЁюшёїюцфхэш ... ╧Ёртшь. 24.04.04 09:49:00 ┬ё╕ ъЁєЄю :) 8 ърэрыют, ёЄхЁхю, 16 сшЄ. ─тшур■ ярЁє, юяЄшьшчшЁє■ ЁхэфхЁ яюф ARM. ╤ыртэюх эрўрыю фэ . ┼∙х ьрыюёЄ№ яюффхыр■ ш эрўэє ЁрсюЄє эрф ёрщЄюь "Palm Music Central" - яхЁт√щ т ьшЁх, эрёъюы№ъю   яюэшьр■. ─ртэю яюЁр. ╧Ёюсхцрыё  яю тёхьє ъюфє ЄЁхъхЁр... :) ▌Єю ъръ NightRadio: °єь ¤ЇшЁр, ёътюч№ ъюЄюЁ√щ яЁюсштр■Єё  ъръшх-Єю юўхэ№ ъЁрёшт√х чтєъш. ─єьры эрф юЄъЁ√Єшхь шёїюфэшъют - уыртэюх эрЁюф эх ёяєуэєЄ№ :) 25.04.04 19:00:00 ╧ЁюЎхёё шф╕Є :) ╩Ёюьх XM-фтшцър... ўЄю-Єю Єрь эх ырфшЄё . ═є эшўхую, яюяЁртшь. └ т эрЁюф яюър MOD фтшурЄ№ сєфхь. 27.05.04 20:13:00 Gjcnb xnj ktnj yfcnegbkj - cjkysir.... fuck.. :( translit is no so good. Voobshem poporjadku: 1) XM player is working now! 2) It's working in Windows, Linux and PalmOS (!!) 3) It has high-end frequency interpolation! It's much better than standart XM-quality! ToDo: 1) Some XM-effects 2) Multiplatform GUI (with text mode support) 3) Multiplatform XM-tracker! PsyTexx 2 Path: pdxgate!usenet.ee.pdx.edu!ogicse!network.ucsd.edu!usc!wupost!uunet!pipex!marble.uknet.ac.uk!uknet!edcastle!iantw From: iantw@castle.ed.ac.uk (Ian Tweedie) Newsgroups: comp.sys.ibm.pc.demos Subject: Re: Does anyone have the MOD file format? Message-ID: <33868@castle.ed.ac.uk> Date: 5 Apr 93 11:48:50 GMT References: Organization: Edinburgh University Lines: 542 lesher@vega.cs.bucknell.edu (Tim Lesher) writes: >I don't have it, but I seem to remember that there's a really good >tutorial packaged with the Mac mod player "The Sound Trecker". You >can get if from wuarchive.wustl.edu, /mirrors/info-mac/sound/st. Here is the Amiga (ProTracker) module format document. The first part I got from a BBS, the second part I got from Mark Cox (author of ModPlay, etc). ********************************************************************* Protracker 1.1B Song/Module Format: Offset Bytes Description 0 20 Songname. Remember to put trailing null bytes at the end... Information for sample 1-31: Offset Bytes Description 20 22 Samplename for sample 1. Pad with null bytes. 42 2 Samplelength for sample 1. Stored as number of words. Multiply by two to get real sample length in bytes. 44 1 Lower four bits are the finetune value, stored as a signed four bit number. The upper four bits are not used, and should be set to zero. Value: Finetune: 0 0 1 +1 2 +2 3 +3 4 +4 5 +5 6 +6 7 +7 8 -8 9 -7 A -6 B -5 C -4 D -3 E -2 F -1 45 1 Volume for sample 1. Range is $00-$40, or 0-64 decimal. 46 2 Repeat point for sample 1. Stored as number of words offset from start of sample. Multiply by two to get offset in bytes. 48 2 Repeat Length for sample 1. Stored as number of words in loop. Multiply by two to get replen in bytes. Information for the next 30 samples starts here. It's just like the info for sample 1. Offset Bytes Description 50 30 Sample 2... 80 30 Sample 3... . . . 890 30 Sample 30... 920 30 Sample 31... Offset Bytes Description 950 1 Songlength. Range is 1-128. 951 1 Well... this little byte here is set to 127, so that old trackers will search through all patterns when loading. Noisetracker uses this byte for restart, but we don't. 952 128 Song positions 0-127. Each hold a number from 0-63 that tells the tracker what pattern to play at that position. 1080 4 The four letters "M.K." - This is something Mahoney & Kaktus inserted when they increased the number of samples from 15 to 31. If it's not there, the module/song uses 15 samples or the text has been removed to make the module harder to rip. Startrekker puts "FLT4" or "FLT8" there instead. Offset Bytes Description 1084 1024 Data for pattern 00. . . . xxxx Number of patterns stored is equal to the highest patternnumber in the song position table (at offset 952-1079). Each note is stored as 4 bytes, and all four notes at each position in the pattern are stored after each other. 00 - chan1 chan2 chan3 chan4 01 - chan1 chan2 chan3 chan4 02 - chan1 chan2 chan3 chan4 etc. Info for each note: _____byte 1_____ byte2_ _____byte 3_____ byte4_ / / / / 0000 0000-00000000 0000 0000-00000000 Upper four 12 bits for Lower four Effect command. bits of sam- note period. bits of sam- ple number. ple number. Periodtable for Tuning 0, Normal C-1 to B-1 : 856,808,762,720,678,640,604,570,538,508,480,453 C-2 to B-2 : 428,404,381,360,339,320,302,285,269,254,240,226 C-3 to B-3 : 214,202,190,180,170,160,151,143,135,127,120,113 To determine what note to show, scan through the table until you find the same period as the one stored in byte 1-2. Use the index to look up in a notenames table. This is the data stored in a normal song. A packed song starts with the four letters "PACK", but i don't know how the song is packed: You can get the source code for the cruncher/decruncher from us if you need it, but I don't understand it; I've just ripped it from another tracker... In a module, all the samples are stored right after the patterndata. To determine where a sample starts and stops, you use the sampleinfo structures in the beginning of the file (from offset 20). Take a look at the mt_init routine in the playroutine, and you'll see just how it is done. Lars "ZAP" Hamre/Amiga Freelancers -------------------------- Found that document... Mark J Cox ------------------------------------------- m.j.h.cox@bradford.ac.uk University of Bradford ---------------------------- bc732@cleveland.freenet.edu Mark EFFECT COMMANDS --------------- Effect commands on protracker should be compatible with all other trackers. 0 - None/Arpeggio 8 - * NOT USED * 1 - Portamento Up 9 - SampleOffset 2 - Portamento Down A - VolumeSlide 3 - TonePortamento B - PositionJump 4 - Vibrato C - Set Volume 5 - ToneP + VolSlide D - PatternBreak 6 - Vibra + VolSlide E - Misc. Cmds 7 - Tremolo F - Set Speed E - COMMANDS ------------ The E command has been altered to contain more commands than one. E0- Filter On/Off E8- * NOT USED * E1- Fineslide Up E9- Retrig Note E2- Fineslide Down EA- FineVol Up E3- Glissando Control EB- FineVol Down E4- Vibrato Control EC- NoteCut E5- Set Finetune ED- NoteDelay E6- Patternloop EE- PatternDelay E7- Tremolo Control EF- Invert Loop Cmd 0. Arpeggio [Range:$0-$F/$0-$F] ----------------------------------- Usage: $0 + 1st halfnote add + 2nd halfnote add Arpeggio is used to simulate chords. This is done by rapidly changing the pitch between 3(or 2) different notes. It sounds very noisy and grainy on most samples, but ok on monotone ones. Example: C-300047 C-major chord: (C+E+G or C+4+7 halfnotes) C-300037 C-minor chord: (C+D#+G or C+3+7 halfnotes) Cmd 1. Portamento up [Speed:$00-$FF] ------------------------------------ Usage: $1 + portamento speed Portamento up will simply slide the sample pitch up. You can NOT slide higher than B-3! (Period 113) Example: C-300103 1 is the command, 3 is the portamentospeed. NOTE: The portamento will be called as many times as the speed of the song. This means that you'll sometimes have trouble sliding accuratly. If you change the speed without changing the sliderates, it will sound bad... Cmd 2. Portamento down [Speed:$00-FF] ------------------------------------- Usage: $2 + portamento speed Just like command 1, except that this one slides the pitch down instead. (Adds to the period). You can NOT slide lower than C-1! (Period 856) Example: C-300203 2 is the command, 3 is the portamentospeed. Cmd 3. Tone-portamento [Speed:$00-$FF] -------------------------------------- Usage: Dest-note + $3 + slidespeed This command will automatically slide from the old note to the new. You don't have to worry about which direction to slide, you need only set the slide speed. To keep on sliding, just select the command $3 + 00. Example: A-200000 First play a note. C-300305 C-3 is the note to slide to, 3 the command, and 5 the speed. Cmd 4. Vibrato [Rate:$0-$F,Dpth:$0-$F] -------------------------------------- Usage: $4 + vibratorate + vibratodepth Example: C-300481 4 is the command, 8 is the speed of the vibrato, and 1 is the depth of the vibrato. To keep on vibrating, just select the command $4 + 00. To change the vibrato, you can alter the rate, depth or both. Use command E4- to change the vibrato-waveform. Cmd 5. ToneP + Volsl [Spd:$0-$F/$0-$F] -------------------------------------- Usage: $5 + upspeed + downspeed This command will continue the current toneportamento and slide the volume at the same time. Stolen from NT2.0. Example: C-300503 3 is the speed to turn the volume down. C-300540 4 is the speed to slide it up. Cmd 6. Vibra + Volsl [Spd:$0-$F/$0-$F] -------------------------------------- Usage: $6 + upspeed + downspeed This command will continue the current vibrato and slide the volume at the same time. Stolen from NT2.0. Example: C-300605 5 is the speed to turn the volume down. C-300640 4 is the speed to slide it up. Cmd 7. Tremolo [Rate:$0-$F,Dpth:$0-$F] -------------------------------------- Usage: $7 + tremolorate + tremolodepth Tremolo vibrates the volume. Example: C-300794 7 is the command, 9 is the speed of the tremolo, and 4 is the depth of the tremolo. To keep on tremoling, just select the command $7 + 00. To change the tremolo, you can alter the rate, depth or both. Use command E7- to change the tremolo-waveform. Cmd 9. Set SampleOffset [Offs:$00-$FF] -------------------------------------- Usage: $9 + Sampleoffset This command will play from a chosen position in the sample, and not from the beginning. The two numbers equal the two first numbers in the length of the sample. Handy for speech- samples. Example: C-300923 Play sample from offset $2300. Cmd A. Volumeslide [Speed:$0-$F/$0-$F] -------------------------------------- Usage: $A + upspeed + downspeed Example: C-300A05 5 is the speed to turn the volume down. C-300A40 4 is the speed to slide it up. NOTE: The slide will be called as many times as the speed of the song. The slower the song, the more the volume will be changed on each note. Cmd B. Position-jump [Pos:$00-$7F] ---------------------------------- Usage: $B + position to continue at Example: C-300B01 B is the command, 1 is the position to restart the song at. This command will also perform a pattern-break (see 2 pages below). You can use this command instead of restart as on noisetracker, but you must enter the position in hex! Cmd C. Set volume [Volume:$00-$40] ---------------------------------- Usage: $C + new volume Well, this old familiar command will set the current volume to your own selected. The highest volume is $40. All volumes are represented in hex. (Programmers do it in hex, you know!) Example: C-300C10 C is the command, 10 is the volume (16 decimal). Cmd D. Pattern-break [Pattern-pos:00-63, decimal] ---------------------------- Usage: $D + pattern-position This command just jumps to the next song-position, and continues play from the patternposition you specify. Example: C-300D00 Jump to the next song-position and continue play from patternposition 00. Or: C-300D32 Jump to the next song-position and continue play from patternposition 32 instead. Cmd E0. Set filter [Range:$0-$1] -------------------------------- Usage: $E0 + filter-status This command jerks around with the sound-filter on some A500 + A2000. All other Amiga-users should keep out of playing around with it. Example: C-300E01 disconnects filter (turns power LED off) C-300E00 connects filter (turns power LED on) Cmd E1. Fineslide up [Range:$0-$F] ---------------------------------- Usage: $E1 + value This command works just like the normal portamento up, except that it only slides up once. It does not continue sliding during the length of the note. Example: C-300E11 Slide up 1 at the beginning of the note. (Great for creating chorus effects) Cmd E2. Fineslide down [Range:$0-$F] ------------------------------------ Usage: $E2 + value This command works just like the normal portamento down, except that it only slides down once. It does not continue sliding during the length of the note. Example: C-300E26 Slide up 6 at the beginning of the note. Cmd E3. Glissando Ctrl [Range:$0-$1] ------------------------------------ Usage: $E3 + Glissando-Status Glissando must be used with the tone- portamento command. When glissando is activated, toneportamento will slide a halfnote at a time, instead of a straight slide. Example: C-300E31 Turn Glissando on. C-300E30 Turn Glissando off. Cmd E4. Set vibrato waveform [Range:$0-$3] ---------------------------- Usage: $E4 + vibrato-waveform Example: C-300E40 Set sine(default) E44 Don't retrig WF C-300E41 Set Ramp Down E45 Don't retrig WF C-300E42 Set Squarewave E46 Don't retrig WF C-300E43 Set Random E47 Don't retrig WF Cmd E5. Set finetune [Range:$0-$F] ---------------------------------- Usage: $E5 + finetune-value Example: C-300E51 Set finetune to 1. Use these tables to figure out the finetune-value. Finetune: +7 +6 +5 +4 +3 +2 +1 0 Value: 7 6 5 4 3 2 1 0 Finetune: -1 -2 -3 -4 -5 -6 -7 -8 Value: F E D C B A 9 8 Cmd E6. PatternLoop [Loops:$0-$F] ---------------------------------- Usage: $E6 + number of loops This command will loop a part of a pattern. Example: C-300E60 Set loopstart. C-300E63 Jump to loop 3 times before playing on. Cmd E7. Set tremolo waveform [Range:$0-$3] ---------------------------- Usage: $E7 + tremolo-waveform Example: C-300E70 Set sine(default) E74 Don't retrig WF C-300E71 Set Ramp Down E75 Don't retrig WF C-300E72 Set Squarewave E76 Don't retrig WF C-300E73 Set Random E77 Don't retrig WF Cmd E9. Retrig note [Value:$0-$F] --------------------------------- Usage: $E9 + Tick to Retrig note at. This command will retrig the same note before playing the next. Where to retrig depends on the speed of the song. If you retrig with 1 in speed 6 that note will be trigged 6 times in one note slot. Retrig on hi-hats! Example: C-300F06 Set speed to 6. C-300E93 Retrig at tick 3 out of 6. Cmd EA. FineVolsl up [Range:$0-$F] ---------------------------------- Usage: $EA + value This command works just like the normal volumeslide up, except that it only slides up once. It does not continue sliding during the length of the note. Example: C-300EA3 Slide volume up 1 at the beginning of the note. Cmd EB. FineVolsl down [Range:$0-$F] ------------------------------------ Usage: $EB + value This command works just like the normal volumeslide down, except that it only slides down once. It does not continue sliding during the length of the note. Example: C-300EB6 Slide volume down 6 at the beginning of the note. Cmd EC. Cut note [Value:$0-$F] ------------------------------ Usage: $EC + Tick to Cut note at. This command will cut the note at the selected tick, creating extremely short notes. Example: C-300F06 Set speed to 6. C-300EC3 Cut at tick 3 out of 6. Note that the note is not really cut, the volume is just turned down. Cmd ED. NoteDelay [Value:$0-$F] ------------------------------- Usage: $ED + ticks to delay note. This command will delay the note to the selected tick. Example: C-300F06 Set speed to 6. C-300ED3 Play note at tick 3 out of 6. Cmd EE. PatternDelay [Notes:$0-$F] ---------------------------------- Usage: $EE + notes to delay pattern. This command will delay the pattern the selected numbers of notes. Example: C-300EE8 Delay pattern 8 notes before playing on. All other effects are still active when the pattern is being delayed. Cmd EF. Invert Loop [Speed:$0-$F] --------------------------------- Usage: $EF + Invertspeed This command will need a short loop ($10,20,40,80 etc. bytes) to work. It will invert the loop byte by byte. Sounds better than funkrepeat... Example: C-300EF8 Set invspeed to 8. To turn off the inverting, set invspeed to 0, or press ctrl + Z. Cmd F. Set speed [Speed:$00-$FF] -------------------------------- Usage: $F + speed This command will set the speed of the song. ---------------------------end forwarded message---------------------------- -- --Jeff Hartung-- Disclaimer: My opinions only, etc., etc., BLAH! BLAH! BLAH!... InterNet - hartung@crl.ucsd.edu BITNET - hartung@ucsd UUCP - ucsd!crl.ucsd.edu!hartung This is a reposting for an earlier one. Enjoy..... ian MODFIL10.TXT THUNDER (kurtt@sfu.ca) ________________________________________________________________________ Public file MODFIL10.TXT - Version 1.0 - by Thunder Introduction _______________________________ What this file attempts to do is describe the MOD format in detail and elaborate on the 'effects' that are possible. This is the first version of this file, so if there are mistakes (and I expect at least a couple), please let me know. This information was compiled from a variety of sources, many of them anonymous, so I will thank them all, and they hopefully know who they are. I would like to keep this file up to date. It will be posted as 'MODFILxx.TXT' or 'MODFILxx.ZIP', where 'xx' is the version number (MODFIL10.TXT being the first release). I assume that you have some prior knowledge of some 'technical' terms, including: sample, channel (or voice), frequency, logarithmic vs. linear volume, byte, word, long integer, and hexadecimal format. It also assumes that you know something about the machine that you are programming on. If you do not know these things, this file will NOT teach you them. Refer to other sources before going further. I am a PC programmer, so I cannot elaborate on particular procedures, routines, methodologies, or tricks that can be performed on other architechtures. I have written routines for the Gravis UltraSound, which is probably the easiest sound card (on the PC anyway) to write MOD routines for. I disclaim everything in this file. This information is for your use personally, but I don't care if you give it to everyone else on the planet. I would like the file to stay intact, and if you use the information a 'hello' to me in your program's credits would be nice. If the information is wrong or gives you problems or damages your equipment or person, tough luck. I am not responsible for anything you DO with this information. If you have additions, corrections, clarification or questions about this information or this file, you can send them to me through the internet to 'kurt.kennett@gravis.com' or 'kurtt@sfu.ca'. Here is an overview of what is in this file: 1 General 2 File Format 2.1 Song Name 2.2 Sample Information 2.3 Number of patterns in song 2.4 Song end jump position 2.5 Pattern table 2.6 File format tag 2.7 Patterns 2.8 Sample data _______________________________________________________________________ 1 MODFIL10.TXT THUNDER (kurtt@sfu.ca) ________________________________________________________________________ 3 Playing the files 3.1 Timing 3.2 Periods 3.3 Fine-Tuning 3.4 Effects 3.5 Other information 4 Period and Volume tables 1.0 General ___________________________________________ Files with the extension '.MOD' are sequenced music files. The file format has it's roots in the Commodore Amiga computer (ugh!). These files use different digital 'samples' played at various frequencies to create three octaves of 'notes' for that sample. In addition to different 'notes', there are a large number of 'effects' which can be done to produce variations on the different notes. There are many variations on the MOD format. Since the format originated on the Commodore Amiga computer, the files were geared towards a machine with 4 voices. These days, with a GUS (Gravis UltraSound), you have 32 independent voices. If you are programming for a sound board or device that has only 1 or 2 digital voices, you will have to mix together the 4 to 8 output channels into those voices. I will not go into this process here, since I do not have experience with it (you don't need to mix on the GUS). If someone would like to mail me a TEXT explaination of how to do the mixing, I will include it in this file. I DO NOT WANT CODE -- learn how to write english. The earliest versions of the MOD format used a maximum of 15 instruments and had 4 channels. Through some modifications in format, a 'newer' standard emerged, with a maximum of 31 instruments and up to 8 channels. You can tell what format of file you are working with by a four-character tag field. The programs that are used to play these files on the Amiga are called 'Noisetracker', 'Soundtracker', and 'Protracker'. 2.0 File Format _______________________________ What follows is a description of a file broken down in a field-by-field format. This is just a general description. Please see the following subsections for a detailed description of what each field is and what it means. 'Big-End Word' refers to the word format on the Amiga. A 2-byte integer value is a word. On the Amiga, this value has the internal representation HHLL, where HH means the high-order byte and LL means the low-order byte. The Intel chips (inside PCs) use a LLHH format for their words. This means that if you are writing routines for the PC, you have to flip the high and low order bytes to retrieve meaningful values. _______________________________________________________________________ 2 MODFIL10.TXT THUNDER (kurtt@sfu.ca) ________________________________________________________________________ Just to piss off all the C programmers, I'm going to start the file offset at 1 instead of 0. Offset Length Format Description ======== ======== ========= ============= 1 20 Chars Title of the song. If the title is not a full 20 chars in length, it will be null- terminated. 21 22 Chars Sample 1 name. If the name is not a full 22 chars in length, it will be null terminated. 43 2 Big-End Sample 1 length in 2-byte words. Multiply Word this value by 2 to get the length of the sample in bytes. 45 1 SNibble Sample 1 finetune. 46 1 Byte Sample 1 linear volume. 47 2 Big-End Sample 1 repeat offset in 2-byte words. Word Multiply this value by 2 to get the position in bytes. 49 2 Big-End Sample 1 repeat length in 2-byte words. Word Multiply this value by 2 to get the length in bytes. 51 30 Sample 2 information. Same format. 81 30 Sample 3 information Same format. . There will either be 15 or 31 sample information blocks. . See the format tag field below for a description of how . to find out how many instruments there are. We'll go on . the assumption that there are 31 instruments in the file. 921 30 Sample 31 information. 951 1 Byte Number of patterns in SONG as played. 952 1 Byte Song end jump position. 953 128 Bytes Pattern Table. These list up to 128 pattern numbers and the order they should be played in. 1081 4 Chars File format tag. 1085 ... Pattern and Sample data. Please see pattern section and sample section for more information. _______________________________________________________________________ 3 MODFIL10.TXT THUNDER (kurtt@sfu.ca) ________________________________________________________________________ 2.1 Song Name _______________________________ This data is pretty self-representative. This is a C 'string' that is null-terminated (i.e. ASCII character 0 is put at the end of the text is the text does not fill up the entire field). Some module writers use this field and the instrument name fields to write 'hello' messages to their friends or dedications instead of giving names to the song or it's samples. I in no way discourage this. 2.2 Sample Information _______________________________ Based on the format tag field, there can be 15 or 31 sampled instruments for the song. These days it is rare to run into an 'older' format song with only 15 instruments. Please see the 'File format tag' field for more information on how to determine how many samples there are in a file. The first field in a sample information block is the sample's name. As was mentioned above, these names are frequently used by the composer to say hello to his or her friends. Again, I in no way discourage this. If the sample name begins with a '#' character (ASCII $23 (35)) then this is assumed not to be an instrument name, and is probably a message. The second field is the sample length in words. Once again, since this is a 680x0 word, the bytes have the order HHLL, and you have to swap them to use the word on PCs. The first 2 bytes of the sample are used by the Amiga players for repeat information, and therefore are NOT part of the playable data. Therefore, if this field is evaluated to a length of less than 3 bytes, there is NO sample. The third field is the sample's initial finetune value. The lower four bits represent a signed nibble (-8..7). Each finetune step changes the note 1/8th of a semitone. This is implemented by switching to a different table of period-values for each finetune value. See section 3.2 for a discussion of fine-tuning. The fourth field is the sample's playback volume. These are LINEAR values that range from 0 to 64, with 64 being maximum volume. If you are implementing a MOD player, remember to check if you need to use logarithmic volumes. 'Decibel' is a logrithmical unit, which represents how we feel sound intensity. The volume and decibel value table for conversions is on the next page. _______________________________________________________________________ 4 MODFIL10.TXT THUNDER (kurtt@sfu.ca) ________________________________________________________________________ Volume Decibel Value Volume Decibel Value ------------------------- ------------------------ 64 0.0 32 -6.0 63 -0.1 31 -6.3 62 -0.3 30 -6.6 61 -0.4 29 -6.9 60 -0.6 28 -7.2 59 -0.7 27 -7.5 58 -0.9 26 -7.8 57 -1.0 25 -8.2 56 -1.2 24 -8.5 55 -1.3 23 -8.9 54 -1.5 22 -9.3 53 -1.6 21 -9.7 52 -1.8 20 -10.1 51 -2.0 19 -10.5 50 -2.1 18 -11.0 49 -2.3 17 -11.5 48 -2.5 16 -12.0 47 -2.7 15 -12.6 46 -2.9 14 -13.2 45 -3.1 13 -13.8 44 -3.3 12 -14.5 43 -3.5 11 -15.3 42 -3.7 10 -16.1 41 -3.9 9 -17.0 40 -4.1 8 -18.1 39 -4.3 7 -19.2 38 -4.5 6 -20.6 37 -4.8 5 -22.1 36 -5.0 4 -24.1 35 -5.2 3 -26.6 34 -5.5 2 -30.1 33 -5.8 1 -36.1 0 Minus infinity The reason for the table starting at 0 dB as the convention from taperecorders of having 0 dB as the optimal recording condition, and displaying anything worse as a negative number. Please see section 4.0 for a complete linear volume format for Gravis' UltraSound. The fifth field in the sample information block is the sample repeat start offset. Once this sample has been played completely from beginning to end, if the repeat length (next field) is greater than two bytes it will loop back to this position in the sample and continue playing. Once it has played for the repeat length, it continues to loop back to the repeat start offset. This means the sample continues playing until it is told to stop. The last, or sixth field in the sample information is the repeat length. A sample is only looped if this value is greater than 2 bytes. See the preceeding paragraph for more information on looping. _______________________________________________________________________ 5 MODFIL10.TXT THUNDER (kurtt@sfu.ca) ________________________________________________________________________ 2.3 Number of patterns in song _______________________________ This byte represents the number of patterns which are played in the entire SONG. This is NOT the number of patterns in the FILE. The file may contain (theoretically) up to 256 patterns, whereas the song is just a selection of those patterns. If I have 30 patterns in my file, and I just want to play patterns 6, 12, 3, 7, and 8 in that order, this byte will have the value 5. 2.4 Song end jump position _______________________________ Historically, this byte has been used for many purposes. Most commonly in the newer format it has been used to signify if a song is to be repeated indefinitely. Some game programs have background music which never ends. If this byte is less than 127, then it specifies the position in the pattern table to jump to when the last pattern has been played. If this byte is greater than or equal to 127, the song ends. 2.5 Pattern table _______________________________ This 128 byte block lists the order that patterns in the file should be played in. Only the number of bytes specified by the number of patterns in the song (see section 2.3) can be considered valid. If the song is to play patterns 6, 0, 12, 11, 21, and 10 in that order, then the table will have those 6 values as the first 6 bytes: Pattern Table Position ---> 0 1 2 3 4 5 6 ---------> 127 |---|---|---|---|---|---|---|---...---|---| |006|000|012|011|021|010| ????????? | |---|---|---|---|---|---|---|---...---|---| One of the effects which is possible (see section 3.4) is a position jump. The argument to this effect is where to jump to in the PATTERN TABLE. This does NOT specify which PATTERN to jump to. In a particular pattern there are 64 lines. These lines are played in order from 0 to 63. When the end of a pattern is reached, playing continues with the next pattern in the pattern table, unless the current pattern is the last one. If the current pattern IS the last one, check the song end jump position (see section 2.4) to see if the song loops to a certain position in the pattern table. Another one of the effects which is possible (see section 3.4) is a pattern break. If this effect is encountered, playing immediately jumps to the first line of the next pattern. _______________________________________________________________________ 6 MODFIL10.TXT THUNDER (kurtt@sfu.ca) ________________________________________________________________________ 2.6 File format tag _______________________________ This is the most controversial field in the file. This field has been the most 'ravaged', with many people using it in non-standard ways for their own purposes. There are a few standard tags which you can find here which tell you DEFINITELY what file format the file is, but there are many more non-standard tags. This makes the job of deciding what format a MOD is a difficult one. I will attempt to describe the known formats below. If you know of one I miss, please let me know. 'M.K.', 'FLT4', 'M!K!', '4CHN' : 4 channels, 31 instruments '6CHN' : 6 channels, 31 instruments '8CHN', 'OCTA' : 8 channels, 31 instruments Other information that is found in this field can be assumed to be somebody's attempt at protection, or some other information that was used in the 'older' file format. If you can't find any of the above information, it is best to assume that it's a 4 channel file. As for how many instruments there are, check the bytes at location 471 in the file. If there is text there (ASCII $20-$7E (32-126)), then you can probably assume it's a 31-instrument file. Otherwise, it's an older 15 instrument file. 2.7 Patterns _______________________________ There can be any number of patterns in the file. They are stored after the file header and before the sample data. There are USUALLY less than 64, but the maximum is not limited - if the file tag is 'M!K!' there are definitely more than 64 patterns. The patterns are stored sequentially (i.e. the first pattern is #0, the second pattern is #1, etc.). An individual pattern is made up of 64 'lines', stored sequentially (i.e. line 0 to line 63). Each 'line' is comprised of a note for each channel. Each 'note' is made up of 4 bytes, so depending on the number of channels in the file, there are 16, 24, or 32 bytes per line. For a four-channel file there are (4 bytes * 4 channels * 64 lines) =1024 bytes of information per pattern. To find out the number of patterns in a particular file, calculate the length of 'header' information and add to it the lengths of all samples that are mentioned in the sample information blocks. Subtract this number from the file's total size and divide by the number just computed (1024) to get the number of patterns in the file. _______________________________________________________________________ 7 MODFIL10.TXT THUNDER (kurtt@sfu.ca) ________________________________________________________________________ As mentioned above, each note is stored as 4 bytes. The information held by these bytes has format shown below. How you display the contents of the 4 bytes in a player is up to you. There is NO standard way to do this. Byte 1 Byte 2 Byte 3 Byte 4 --------- --------- --------- --------- 7654-3210 7654-3210 7654-3210 7654-3210 wwww XXXX xxxxxxxxx yyyy ZZZZ zzzzzzzzz wwwwyyyy ( 8 bits) : sample number XXXXxxxxxxxx (12 bits) : sample 'period' ZZZZzzzzzzzz (12 bits) : effect and argument The sample number refers to a sample specified in the sample information block. Please see sections 2.2 and 2.8 for more information on the samples. The sample 'period' corresponds to a delay value on an Amiga computer. Note that on an Intel processor, you have to order these 12 bits as 'xxxxxxxx0000XXXX' to read the value as a word. Please see sections 3.2 and 3.3 for more information on how to use these values. The effect is an effect number and an argument for the effect. Please see section 3.4 for a discussion of the effects and how to implement them. 2.8 Sample data _______________________________ The sample data follows all of the patterns. After you have finished reading the pattern data, there will be just enough data left in the file for all of the instruments specified in the sample information section. The samples are stored sequentially from sample 1 to sample 31. The sample's data is in 8-bit two's compliment format, so if it needs to be in another format for your sound device to play it, don't forget to convert (UltraSound users: you don't need to convert the data when downloading). As was mentioned in section 2.2, the first 2 bytes of the sample are used by the Amiga MOD players for repeat information, and therefore are NOT part of the playable data. PC users do not have to do anything with these two bytes. _______________________________________________________________________ 8 MODFIL10.TXT THUNDER (kurtt@sfu.ca) ________________________________________________________________________ 3.0 Playing the files _______________________________ Section 3 deals with playing MOD files. Specifically, it deals with playing them on PC hardware - hopefully a Gravis UltraSound. The Ultrasound is ideal for this and many other types of sound and song processing, and is exceptionally easy to program. Gravis makes available an SDK (Software Development Kit) which has both C, C++, and (by the end of November) Borland Pascal versions. If you are programming a MOD player for other hardware, you may still be able to use this information for reference. 3.1 Timing _______________________________ If lines are played sequentially, then how long should the player wait between successive lines? On the Amiga, the amount of time a note spends on a channel before the next note is started is calculated by using some complex formulas based on the PAL color carrier frequency. I will not try to bore you with the details of these calculations here, and if you wan't them, email me. A song can be played at a speed ranging from 1 to 127, where the speed specifies how many 'ticks' before playing the next sample. A tick is supposed to happen every .02 seconds, which gives 50 ticks per second. At the start of a line all samples specified on that line are started, samples playing are modified, speed is changed, etc. Some effects require that changes be made to a sample playing on a channel during the course of a line. For example, the retrigger effect re-starts a sample at a certain tick within a line. If the song is playing at speed 6 and the effect specifies a retrigger on the 4th tick: Time Tick 0.00 1 - start all samples and effects 0.02 2 0.04 3 0.06 4 - retrigger sample here 0.08 5 0.10 6 ------------ 0.00 1 - start next line . . Unless a speed is specified on the first line of the first pattern, the song should start playing at speed 6. Please see section 3.4, effect $F, for more information on changes in speed. _______________________________________________________________________ 9 MODFIL10.TXT THUNDER (kurtt@sfu.ca) ________________________________________________________________________ 3.2 Periods _______________________________ MOD players use a technique called frequency shifting to produce different 'notes' of the same sample. If I play a sample at 10 KHz, it will sound one octave higher if I double the frequency to 20 KHz, and one octave lower if I halve the frequency to 5 KHz. Since there are 12 notes per octave on a keyboard (these are called half-steps), each frequency corresponds to one twelfth root of two (~1.05946) times the frequency of it's predecessor (to the left). Therefore, if the C-1 frequency (the note of C in octave 1) is 4144 Hz then: Note: C-1 C#1 D-1 ... C-2 ... Freq: 4144 4390 4651 ... 8288 ... The Amiga playing routines were written to run off different interrupts for different Amiga computers, based on whether the machine was a PAL or NTSC machine. The 'period' values are measures which are used in calculating how much data to send to each of the 4 Amiga channels per second (thereby specifying the frequency or pitch of the output). For PC programmers, you don't have to worry about this that much. The thing to remember is that a 'magic number' divided by twice the period value will give the rate (frequency) to play the sample at. Here are the magic numbers and the corresponding formulae. I don't know which number is better to use - It doesn't make a huge difference. PAL Value NTSC Value =========== ============ 7093789.2 7159090.5 SampleRate = -------------- SampleRate = -------------- Period * 2 Period * 2 To determine what frequency to play a sample at, look up the specified period value in a table based on the finetune setting (see section 3.3 for more information on fine-tuning). If the period is 0, then the previous period used on that channel is used. As an example, let's look at the period table for finetune 0. The notes that are possible in each octave are: C C# D D# E F F# G G# A A# B Octave 1: 856, 808, 762, 720, 678, 640, 604, 570, 538, 508, 480, 453 Octave 2: 428, 404, 381, 360, 339, 320, 302, 285, 269, 254, 240, 226 Octave 3: 214, 202, 190, 180, 170, 160, 151, 143, 135, 127, 120, 113 Octave 0:1712,1616,1525,1440,1357,1281,1209,1141,1077,1017, 961, 907 Octave 4: 107, 101, 95, 90, 85, 80, 76, 71, 67, 64, 60, 57 If I was requested to play a sample at period 302, I would scan through the period table until I hit that value. At that point, I know that the note is called 'F#2', F-sharp in octave 2. I calculate the playback frequency by doing the calculations on the next page. _______________________________________________________________________ 10 MODFIL10.TXT THUNDER (kurtt@sfu.ca) ________________________________________________________________________ PAL Value NTSC Value =========== ============ 7093789.2 7159090.5 ----------- = 11745 Hz ----------- = 11853 Hz 302 * 2 302 * 2 There are normally only three octaves (1 to 3) used in playing songs. Octaves 0 and 4 are NOT standard. Some songs may use the values though, and it's nice if your player can handle them. Full period tables for all finetunes are listed in section 4. If you wish to sample sounds to include in MOD files, remember that the data must be stored in 8-bit 2's complement format. There is NO standard sample rate when creating the samples. Most often the samples are done on the rate corresponding to period C-3 (around 16.5 KHz), and sometimes drums are sampled at A-3 (around 28 KHz). If sample number is specified on a channel (sample #0), then the last sample used on that channel will be remembered if new notes come along. Only one sample may play on a channel at a time, so playing a new sample will cancel an old one - even if there is no actual sample data for the new sample (a 'silent' sample). However, if you are constructing a MOD file of your own and you use a "silent" sample it is polite to set its default volume to 0. If you have some memory (around 2k or so) to spare, you could make up a table of words indexed by period value. The value of the word at the index of a period is the corresponding frequency that the sample should be played at. This saves you from having to calculate the frequencies over and over again. If you still don't get what I'm talking about here: I have a array of words, one for each period from the lowest (around 50) to the highest (around 1712). I precalculate the contents of this table so that at index 302 (the period for note F#2), there is the value 11853, the frequency to use to get the note F#2. Therefore, when my player runs accross this value and needs to know what frequency to play the sample at, I simply look up the value in the table directly - no calculations. If you still don't get what I'm talking about, you're screwed. 3.3 Fine-Tuning _______________________________ Fine-tuning is a minor adjustment on how an instrument sounds. This is implemented by small changes in the period values. The finetune value for a sample specifies the adjustment on the period values for that instrument. A fine-tune can also be specified for a specific instrument by an effect, at which point the value in the effect will override the one in the sample information block. _______________________________________________________________________ 11 MODFIL10.TXT THUNDER (kurtt@sfu.ca) ________________________________________________________________________ The value in the sample information block is a signed nibble (4 bits, signed 2's complement). Therefore, the values that can be found have the following corresponding finetunes: Value: 0 1 2 3 4 5 6 7 8 9 A B C D E F Finetune: 0 +1 +2 +3 +4 +5 +6 +7 -8 -7 -6 -5 -4 -3 -2 -1 Section 4.0 specifies period values for all finetunes for octaves 1 to 3. You could use these values in creating your array of frequency words (see the end of section 3.2). 3.4 Effects _______________________________ As was mentioned in section 2.7, the 4 bytes for a note have the following format: Byte 1 Byte 2 Byte 3 Byte 4 --------- --------- --------- --------- 7654-3210 7654-3210 7654-3210 7654-3210 wwww XXXX xxxxxxxxx yyyy ZZZZ zzzzzzzzz wwwwyyyy ( 8 bits) : sample number XXXXxxxxxxxx (12 bits) : sample 'period' ZZZZzzzzzzzz (12 bits) : effect and argument Again, how you display this information in a player is up to you. I have seen a zillion different formats. I have described what the sample number and period refer to. Here, we will look at the effects that are possible. At this point in time, the Amiga Protracker MOD player (version 2.3A/ 3.01) has 28 effects. Some of these effects are redundant or not possible on some PC sound cards. I will describe the effects and how they are implemented on the Amiga. PC programmers will have to adapt the effects they wish to implement on their own. All numbers are stated in hexadecimal. For the discussion of the effects, we will look at the 'effect and argument' part of the 4 bytes in the following way: Bit number: $CBA987654321 Mentioned above as: ZZZZzzzzzzzz We will use: ZZZZxxxxyyyy There are two types of effects, standard and extended. All effects use the ZZZZ portion to declare the effect number. Standard effects use the xxxx and yyyy portions as one or two arguments, either as an 8-bit value when taken together in the form xxxxyyyy or as 2 nibbles xxxx and yyyy. Extended effects have the ZZZZ effect number $E. They use the xxxx portion to declare the extended effect number and the only the yyyy portion as an argument. _______________________________________________________________________ 12 MODFIL10.TXT THUNDER (kurtt@sfu.ca) ________________________________________________________________________ Here are the possible standard effects: ----------------------------------------------------------------------- # Effect name Uses Arguments as ----------------------------------------------------------------------- 0 Arpeggio xxxx yyyy 1 Slide Up xxxxyyyy 2 Slide Down xxxxyyyy 3 Tone Portamento xxxxyyyy 4 Vibrato xxxx yyyy 5 Tone Portamento + Volume Slide xxxx yyyy 6 Vibrato + Volume Slide xxxx yyyy 7 Tremolo xxxx yyyy 8 NOT USED n/a 9 Set SampleOffset xxxxyyyy A VolumeSlide xxxx yyyy B Position Jump xxxxyyyy C Set Volume xxxxyyyy D Pattern Break xxxxyyyy E *Extended Effects see below F Set Speed xxxxyyyy And here are the possible extended effects: --------------------------------- # Effect name --------------------------------- E0 Set Filter E1 FineSlide Up E2 FineSlide Down E3 Glissando Control E4 Set Vibrato Waveform E5 Set FineTune E6 Set/Jump to Loop E7 Set Tremolo Waveform E8 NOT USED E9 Retrig Note EA Fine VolumeSlide Up EB Fine VolumeSlide Down EC NoteCut ED NoteDelay EE PatternDelay EF Invert Loop A description of each effect and how it is implemented is given on the following pages. Once again, all values are given in hexadecimal unless otherwise stated. _______________________________________________________________________ 13 MODFIL10.TXT THUNDER (kurtt@sfu.ca) ________________________________________________________________________ ----------------------------------------------------------------------- 0: Arpeggio ----------------------------------------------------------------------- If a note as an effect number of 0, it is only an arpeggio if there is at least one non-zero argument. When there is at least one valid argument, this effect means to play the note specified, then the note+xxxx half- steps, then the note+yyyy half-steps, and then return to the original note. These changes are evenly spaced within the time for a line to be played at the current speed. This effect is usually used to simulate chords (where a major chord is the note+4 half steps and the note+7 half-steps). This does not work very well on most samples. This can also be used to produce a heavy vibrato. Here is an example of this effect: Note C-3, xxxx=4, yyyy=7 this will attempt to produce a C-major chord. At the beginning of a line the C-3 note is played, then at 1/3 of the way through the line the note is retriggered at E-3, 2/3 of the way through it is retriggered at G-3, and at the beginning of the next line (if there are no new notes to be played on the channel), it is retriggered at C-3 again. This presents a minor problem for timing, since you have to keep track of the arpeggio during the course of playing a line. What you could do is use a timer differently, or set up another timer that independently tracks the timing of the arpeggio. ----------------------------------------------------------------------- 1: Slide up (Portamento Up) ----------------------------------------------------------------------- This effect will slide up the frequency (decrease the period) of the sample being played on the channel by xxxxyyyy notes for every tick that occurs during the line. You usually cannot slide past note B-3 unless you have implemented octave 4 (NON-STANDARD!). The number of ticks that occur per line is set with effect $F, the set speed command. Since the slide rate depends on the speed, be careful if you set are composing a MOD when you change the speed. An example of this effect is: Note C-3, xxxxyyyy = 2, playing at speed 3. At the beginning of the line the sample is started at period C-3. At the first tick, the period is decremented by 2 (the frequency is increased). At the second tick, the period is again decremented by 2. At the beginning of the next line, if there is not a new note to be played the period is again decremented by 2. _______________________________________________________________________ 14 MODFIL10.TXT THUNDER (kurtt@sfu.ca) ________________________________________________________________________ ----------------------------------------------------------------------- 2: Slide down (Portamento Down) ----------------------------------------------------------------------- This effect will slide down the frequency (increase the period) of the sample being played on the channel by xxxxyyyy tones for every tick that occurs during the line. You usually cannot slide below note C-1 unless you have implemented octave 0 (NON-STANDARD!). The number of ticks that occur per line is set with effect $F, the set speed command. Since the slide rate depends on the speed, be careful if you set are composing a MOD when you change the speed. An example of this effect is: Note C-3, xxxxyyyy = 2, playing at speed 3. At the beginning of the line the sample is started at period C-3. At the first tick, the period is incremented by 2 (the frequency is decreased). At the second tick, the period is again incremented by 2. At the beginning of the next line, if there is not a new note to be played the period is again incremented by 2. ----------------------------------------------------------------------- 3: Slide to note ----------------------------------------------------------------------- This effect will slide a note being played on a channel to a specified note. The parameter xxxxyyyy will states the speed at which a slide will occur. For each tick that occurs during the line, the period currently being played is altered by the number of notes specified. The number of ticks that occur per line is set with effect $F, the set speed command. Since the slide rate depends on the speed, be careful if you set are composing a MOD when you change the speed. An example of this effect is: Slide to note C-2, xxxxyyyy = 2, playing at speed 3. At the beginning of the line the current frequency for the sample is altered to be 2 notes closer to C-2. At the first tick, the same alteration occurs, changing the period to form a note even closer to C-2. The same occurs for each tick after that. This effect continues until another effect is started or the specified frequency is reached. If a slide rate is not specified (xxxxyyyy is zero) then the last slide rate used on the channel is used again. ----------------------------------------------------------------------- 4: Vibrato ----------------------------------------------------------------------- Vibrato means to "oscillate the sample pitch using a particular waveform with amplitude yyyy notes, such that (xxxx * speed)/64 full oscillations occur in the line". The waveform to use in vibrating is set using effect E4 (see below). By placing vibrato effects on consecutive lines, the vibrato effect can be sustained for any length of time. If either xxxx or yyyy are 0, then values from the most recent prior vibrato will be used. _______________________________________________________________________ 15 MODFIL10.TXT THUNDER (kurtt@sfu.ca) ________________________________________________________________________ An example is: Note C-3, with xxxx=8 and yyyy=1 when speed=6. This will play tones around C-3, vibrating through D-3 and B-2 to C-3 again (amplitude - yyyy - is 1), with (8*6)/64 = 3/4 of a full oscillation per line. Please see effect E4 for the waveform to use for vibrating. ----------------------------------------------------------------------- 5: Continue effect 3:'Slide to note', but also do Volume slide ----------------------------------------------------------------------- This effect will change the volume of a channel while a tone portamento (effect 3) is taking place. The values xxxx or yyyy specify the speed of the volume change. If xxxx is nonzero the volume is increased, and if yyyy is nonzero the volume is decreased. It is illegal for both xxxx and yyyy to be non-zero. You cannot slide past 64 or below 0. As an example, take the xxxx to be set to 3. This means that at the beginning of the line, the current volume of the channel is increased by 3. The volume is increased again for every tick on this line and the lines following (until there is a new effect). Once again, the volume cannot slide up past 64. ----------------------------------------------------------------------- 6: Continue effect 4:'Vibrato', but also do Volume slide ----------------------------------------------------------------------- This effect will change the volume of a channel while a vibrato (effect 4) is taking place. The values xxxx or yyyy specify the speed of the volume change. If xxxx is nonzero the volume is increased, and if yyyy is nonzero the volume is decreased. It is illegal for both xxxx and yyyy to be non-zero. You cannot slide past 64 or below 0. As an example, take the yyyy to be set to 2. This means that at the beginning of the line, the current volume of the channel is decreased by 2. The volume is decreased again for every tick on this line and the lines following (until there is a new effect). Once again, the volume cannot slide down below 0. ----------------------------------------------------------------------- 7: Tremolo ----------------------------------------------------------------------- Temolo means to "oscillate the sample volume using a particular waveform with amplitude yyyy*(speed-1), such that (xxxx*speed)/64 full oscillations occur in the line". The waveform to use to oscillate is set using the effect E7 (see below). By placing tremolo effects on consecutive lines, the tremolo effect can be sustained for any length of time. If either xxxx or yyyy are 0, then values from the most recent prior tremolo will be used. The usage of this effect is similar to that of effect 4:Vibrato. ----------------------------------------------------------------------- 8: This effect is not used. ----------------------------------------------------------------------- _______________________________________________________________________ 16 MODFIL10.TXT THUNDER (kurtt@sfu.ca) ________________________________________________________________________ ----------------------------------------------------------------------- 9: Set sample offset ----------------------------------------------------------------------- This effect allows you to start a sample from a specified position rather than the normal beginning position. Multiply the value xxxxyyyy by 512 to get the position in bytes from the beginning of the sample where playback should start. If no sample is specified with the effect, but one is currently playing on the channel, then the sample currently playing is retriggered to offset specified. An example is instrument 2 being played at note C-3, with xxxxyyyy=$23. This would make playback of the sample start at offset $23*$200 = $4600. This effect gives a rough range to play the sample from. ----------------------------------------------------------------------- A: Volume slide ----------------------------------------------------------------------- This effect will change the volume of all samples being played on a channel. The values xxxx or yyyy specify the speed of the volume change. If xxxx is nonzero the volume is increased, and if yyyy is nonzero the volume is decreased. It is illegal for both xxxx and yyyy to be non- zero. You cannot slide past 64 or below 0. As an example, take the yyyy to be set to 3. This means that at the beginning of the line, the current volume of the channel is decreased by 3. The volume is decreased by 3 again for every tick on this line and the lines following (until there is a new effect). Once again, the volume cannot slide down below 0. ----------------------------------------------------------------------- B: Position Jump ----------------------------------------------------------------------- This effect xxxxyyyy parameter specifies a position in the pattern table that playback should jump to after this line. Legal values are in the range of the number of patters that are supposed to be in the song (see section 2.3). Values outside this range should be ignored. ----------------------------------------------------------------------- C: Set volume ----------------------------------------------------------------------- Effect C will set the volume on a channel to the setting specified by the xxxxyyyy value. Legal volumes are in the range of 0 to 64. An attempt to set the volume to a higher value than 64 will just set it to 64. I don't think we really need an example for this effect. _______________________________________________________________________ 17 MODFIL10.TXT THUNDER (kurtt@sfu.ca) ________________________________________________________________________ ----------------------------------------------------------------------- D: Pattern Break ----------------------------------------------------------------------- This effect is equivalent to a position jump to the next pattern in the pattern table, with the arguments xxxx*10+yyyy specifying the line within that pattern to start playing at. Note that this is NOT xxxx*16+yyyy. For example, the effect with arguments xxxx=0, yyyy=0 would simply jump to the first line in the next pattern in the pattern table after playing the current line. With arguments xxxx=1 and yyyy=6 would jump to the 16th line of the next pattern in the pattern table after playing the current line. ----------------------------------------------------------------------- E0: Set filter on/off ----------------------------------------------------------------------- This sets a hardware sound filter to ON (if yyyy is 0) or OFF (if xxxx is nonzero). If your sound device has built-in filters, you should ignore this effect command. This effect is primarily used on Amiga 500 and 2000 computers to dick around with the hardware filter. ----------------------------------------------------------------------- E1: Fineslide up ----------------------------------------------------------------------- This effect functions just like effect 1, except that the frequency of the sample is only modified once. At the beginning of a line, whatever frequency is being played on a channel is incremented by yyyy notes. This effect does NOT continue on the lines following. You cannot slide the frequency above the note B-3 (unless you implement octave 4 : NON- STANDARD!). An example here would be effect E, xxxx=1 (the extended effect number), yyyy=3. This would slide the current frequency up three notes at the beginning of the line. ----------------------------------------------------------------------- E2: Fineslide down ----------------------------------------------------------------------- This effect functions just like effect 2, except that the frequency of the sample is only modified once. At the beginning of a line, whatever frequency is being played on a channel is decremented by yyyy notes. This effect does NOT continue on the lines following. You cannot slide the frequency below the note C-1 (unless you implement octave 0 : NON- STANDARD!). An example here would be effect E, xxxx=1 (the extended effect number), yyyy=2. This would slide the current frequency down two notes at the beginning of the line. _______________________________________________________________________ 18 MODFIL10.TXT THUNDER (kurtt@sfu.ca) ________________________________________________________________________ ----------------------------------------------------------------------- E3: Set glissando on/off ----------------------------------------------------------------------- The argument yyyy to this effect specifies whether the glissando effect is ON (yyyy is 1) or OFF (yyyy is 0). If glissando is on, then the 'Slide to note' will slide a half note at a time. Otherwise, it will perform the default smooth slide. ----------------------------------------------------------------------- E4: Set vibrato waveform ----------------------------------------------------------------------- This effect means to set the waveform appearance for succeeding 'vibrato' effects. There are currently four possible appearances for the wave, each with a possible 'retrigger'. Two cycles are shown below for each type of waveform: yyyy Waveform Name Retriggered No Retrigger ---------- ------------------- ----------- ------------ /\ /\ Sine (default) 0 4 \/ \/ |\ |\ Ramp down 1 5 \| \| ,-, ,-, Square 2 6 '-' '-' ????????? Random 3 7 A "retriggered" waveform will be reset to the start of a cycle at the beginning of each new note. If a wave is selected "without retrigger", the previous waveform will be continued. Waveforms are usually retriggered. ----------------------------------------------------------------------- E5: Set finetune value ----------------------------------------------------------------------- This effect command sets the finetune value for the current instrument to the signed nibble value yyyy. This value overrides the value found in the sample information block at the beginning of the MOD file. The new finetune remains until changed by another E5 effect. Value: 7 6 5 4 3 2 1 0 F E D C B A 9 8 Finetune to set: +7 +6 +5 +4 +3 +2 +1 0 -1 -2 -3 -4 -5 -6 -7 -8 This effect is implemented by storing period values for all possible finetunes, and simply switching to a different table of periods when this effect is encountered. See section 3.3 for more information. Section 4 lists the period tables for finetunes for octaves 1 to 3. _______________________________________________________________________ 19 MODFIL10.TXT THUNDER (kurtt@sfu.ca) ________________________________________________________________________ ----------------------------------------------------------------------- E6: Loop pattern ----------------------------------------------------------------------- This effect allows a section of a pattern to be 'looped', or played through, a certain number of times in succession. If the effect argument yyyy is zero, the effect specifies the loop's start point. Otherwise, it specifies the number of times to play this line and the preceeding lines from the start point. If no start point was specified in the current pattern being played, the loop start defaults to the first line in the pattern. Therefore, you cannot loop through multiple patterns. An example: On line 3, the effect E6 is encountered, with yyyy=0. This specifies that line 3 is the beginning of a loop in this pattern. Down on line 52, the effect E6 is encountered again, with yyyy=2. This means to jump back and play the lines from line 3 to line 52 again twice more before continuing with the rest of the pattern. ----------------------------------------------------------------------- E7: Set tremolo waveform ----------------------------------------------------------------------- Line command E4, this sets the waveform appearance for succeeding 'tremolo' (volume) effects. There are currently four possible appearances for the wave, each with a possible 'retrigger'. Two cycles are shown below for each type of waveform: yyyy Waveform Name Retriggered No Retrigger ---------- ------------------- ----------- ------------ /\ /\ Sine (default) 0 4 \/ \/ |\ |\ Ramp down 1 5 \| \| ,-, ,-, Square 2 6 '-' '-' ????????? Random 3 7 A "retriggered" waveform will be reset to the start of a cycle at the beginning of each new note. If a wave is selected "without retrigger", the previous waveform will be continued. Waveforms are usually retriggered. ----------------------------------------------------------------------- E8: This effect is not used. ----------------------------------------------------------------------- _______________________________________________________________________ 20 MODFIL10.TXT THUNDER (kurtt@sfu.ca) ________________________________________________________________________ ----------------------------------------------------------------------- E9: Retrigger sample ----------------------------------------------------------------------- Effect E9 allows you to re-trigger a specified sample at a particular note after yyyy ticks during the line. For example, say note C-3 is specified, with yyyy=2 when the speed is currently 6. This would mean that at the beginning of the line the specified sample is started, and after two ticks it is restarted. This continues until the beginning of the next line. This effect is used mostly with samples of hi-hats. ----------------------------------------------------------------------- EA: Fine volume slide up ----------------------------------------------------------------------- This effect increments the volume of a particular channel once at the beginning of the line by yyyy points. There is no continuation of the slide on successive lines or for other notes. You cannot slide above volume 64. ----------------------------------------------------------------------- EB: Fine volume slide down ----------------------------------------------------------------------- This effect is just like effect EA, except the volume is decremented rather than incremented by the value yyyy. There is no continuation of the slide on successive lines or for other notes. You cannot slide below volume 0. ----------------------------------------------------------------------- EC: Cut sample ----------------------------------------------------------------------- This effect sets the volume of the sample which is playing to 0 after yyyy ticks in the current line. This has the effect of stopping a sample abruptly. An example here is to play the note C-2, with effect EC and argument yyyy=3, when the speed is 6. The sample is started at note C-2 at the beginning of the line, and after the third tick of 6 in that line, the volume on the channel is set to 0 (cutting it off). Note that if yyyy is 0, nothing will be heard. ----------------------------------------------------------------------- ED: Delay sample ----------------------------------------------------------------------- This effect delays the start of a sample until tick yyyy in the current line. For example, if note C-2 is played, with effect ED and argument yyyy=3 when the speed is 6. The note C-2 will be triggered at the 3rd tick after the start of the line. The purpose of this effect is to delay the start of a sample for a VERY short amount of time. _______________________________________________________________________ 21 MODFIL10.TXT THUNDER (kurtt@sfu.ca) ________________________________________________________________________ ----------------------------------------------------------------------- EE: Delay pattern ----------------------------------------------------------------------- This effect forces a small delay in a pattern in between successive lines. All notes and effects continue during this delay. The argument yyyy specified the number of line-equivalent time slices to wait before resuming playback. For example, if effect EE is encountered with speed being 6 and argument yyyy=4, then the next line will be delayed 24 ticks before it is executed. ----------------------------------------------------------------------- EF: Invert loop ----------------------------------------------------------------------- This effect is used on the Amiga to play samples backward at a specified speed. It is not really feasible to implement on other architechtures, and it is not used that often. ----------------------------------------------------------------------- F: Set speed ----------------------------------------------------------------------- This effect changes the speed of playback so that xxxxyyyy ticks occur during every line, starting on the NEXT line. The initial speed (before any 'set speed' effects are encountered) should be set to 6. A value of xxxxyyyy=0 should technically cause playback to stop, but this value is commonly ignored as garbage. Valid values for speed setting in this manner are 1 to 31. If a value is read that is above 31, it means to set a modified speed based on beats per minute, where 4 lines are 1 beat. This means that if I try to set the speed to 42, I am specifying 42 beats per minute, or 42*4=168 lines per minute. You then have to figure out how long to spend on a particular line. If multiple set speed effects are performed on a single line, then the effects on the higher-numbered channels have precedence over the effects on the lower-numbered channels. This effect has the largest number of implementations and is particular to the number of effects that a particular file player supports. 3.5 Other information _______________________________ If you're sound device is able to provide stereo output (like the UltraSound), then you need to know what the balance for each channel should be. Channels 1 and 4 are left, and 2 and 3 are right. If you are programming for the UltraSound, it is best not to shove the balances all the way over to the left or to the right. Try a value of 2 for channels 1 and 4 and a value of 13 for channels 2 and 3. If you don't like it - change it. _______________________________________________________________________ 22 MODFIL10.TXT THUNDER (kurtt@sfu.ca) ________________________________________________________________________ 4.0 Period and Volume tables _______________________________ Here are the period tables for the different fine-tune values: 856,808,762,720,678,640,604,570,538,508,480,453 : C-1 to B-1 Finetune 0 428,404,381,360,339,320,302,285,269,254,240,226 : C-2 to B-2 Finetune 0 214,202,190,180,170,160,151,143,135,127,120,113 : C-3 to B-3 Finetune 0 850,802,757,715,674,637,601,567,535,505,477,450 : C-1 to B-1 Finetune +1 425,401,379,357,337,318,300,284,268,253,239,225 : C-2 to B-2 Finetune +1 213,201,189,179,169,159,150,142,134,126,119,113 : C-3 to B-3 Finetune +1 844,796,752,709,670,632,597,563,532,502,474,447 : C-1 to B-1 Finetune +2 422,398,376,355,335,316,298,282,266,251,237,224 : C-2 to B-2 Finetune +2 211,199,188,177,167,158,149,141,133,125,118,112 : C-3 to B-3 Finetune +2 838,791,746,704,665,628,592,559,528,498,470,444 : C-1 to B-1 Finetune +3 419,395,373,352,332,314,296,280,264,249,235,222 : C-2 to B-2 Finetune +3 209,198,187,176,166,157,148,140,132,125,118,111 : C-3 to B-3 Finetune +3 832,785,741,699,660,623,588,555,524,495,467,441 : C-1 to B-1 Finetune +4 416,392,370,350,330,312,294,278,262,247,233,220 : C-2 to B-2 Finetune +4 208,196,185,175,165,156,147,139,131,124,117,110 : C-3 to B-3 Finetune +4 826,779,736,694,655,619,584,551,520,491,463,437 : C-1 to B-1 Finetune +5 413,390,368,347,328,309,292,276,260,245,232,219 : C-2 to B-2 Finetune +5 206,195,184,174,164,155,146,138,130,123,116,109 : C-3 to B-3 Finetune +5 820,774,730,689,651,614,580,547,516,487,460,434 : C-1 to B-1 Finetune +6 410,387,365,345,325,307,290,274,258,244,230,217 : C-2 to B-2 Finetune +6 205,193,183,172,163,154,145,137,129,122,115,109 : C-3 to B-3 Finetune +6 814,768,725,684,646,610,575,543,513,484,457,431 : C-1 to B-1 Finetune +7 407,384,363,342,323,305,288,272,256,242,228,216 : C-2 to B-2 Finetune +7 204,192,181,171,161,152,144,136,128,121,114,108 : C-3 to B-3 Finetune +7 907,856,808,762,720,678,640,604,570,538,504,480 : C-1 to B-1 Finetune -8 453,428,404,381,360,339,320,302,285,269,254,240 : C-2 to B-2 Finetune -8 226,214,202,190,180,170,160,151,143,135,127,120 : C-3 to B-3 Finetune -8 900,850,802,757,715,675,636,601,567,535,505,477 : C-1 to B-1 Finetune -7 450,425,401,379,357,337,318,300,284,268,253,238 : C-2 to B-2 Finetune -7 225,212,200,189,179,169,159,150,142,134,126,119 : C-3 to B-3 Finetune -7 894,844,796,752,709,670,632,597,563,532,502,474 : C-1 to B-1 Finetune -6 447,422,398,376,355,335,316,298,282,266,251,237 : C-2 to B-2 Finetune -6 223,211,199,188,177,167,158,149,141,133,125,118 : C-3 to B-3 Finetune -6 887,838,791,746,704,665,628,592,559,528,498,470 : C-1 to B-1 Finetune -5 444,419,395,373,352,332,314,296,280,264,249,235 : C-2 to B-2 Finetune -5 222,209,198,187,176,166,157,148,140,132,125,118 : C-3 to B-3 Finetune -5 ...continues on next page... _______________________________________________________________________ 23 MODFIL10.TXT THUNDER (kurtt@sfu.ca) ________________________________________________________________________ 881,832,785,741,699,660,623,588,555,524,494,467 : C-1 to B-1 Finetune -4 441,416,392,370,350,330,312,294,278,262,247,233 : C-2 to B-2 Finetune -4 220,208,196,185,175,165,156,147,139,131,123,117 : C-3 to B-3 Finetune -4 875,826,779,736,694,655,619,584,551,520,491,463 : C-1 to B-1 Finetune -3 437,413,390,368,347,338,309,292,276,260,245,232 : C-2 to B-2 Finetune -3 219,206,195,184,174,164,155,146,138,130,123,116 : C-3 to B-3 Finetune -3 868,820,774,730,689,651,614,580,547,516,487,460 : C-1 to B-1 Finetune -2 434,410,387,365,345,325,307,290,274,258,244,230 : C-2 to B-2 Finetune -2 217,205,193,183,172,163,154,145,137,129,122,115 : C-3 to B-3 Finetune -2 862,814,768,725,684,646,610,575,543,513,484,457 : C-1 to B-1 Finetune -1 431,407,384,363,342,323,305,288,272,256,242,228 : C-2 to B-2 Finetune -1 216,203,192,181,171,161,152,144,136,128,121,114 : C-3 to B-3 Finetune -1 The Amiga uses linear volumes from 0 to 64. The volume table specified below lists the logarithmic volume to use on the UltraSound for each of the 65 settings in order to get a linear spread. If you need volumes for another sound device, you will have to find them elsewhere. 0 | 0 1 | 1750 17 | 2332 33 | 3469 49 | 3528 2 | 2503 18 | 3240 34 | 3473 50 | 3532 3 | 2701 19 | 3248 35 | 3478 51 | 3534 4 | 2741 20 | 3256 36 | 3481 52 | 3538 5 | 2781 21 | 3263 37 | 3484 53 | 3543 6 | 2944 22 | 3271 38 | 3489 54 | 3545 7 | 2964 23 | 3279 39 | 3492 55 | 3549 8 | 2981 24 | 3287 40 | 3495 56 | 3552 9 | 3000 25 | 3294 41 | 3499 57 | 3556 10 | 3017 26 | 3303 42 | 3502 58 | 3558 11 | 3034 27 | 3310 43 | 3506 59 | 3563 12 | 3052 28 | 3317 44 | 3509 60 | 3565 13 | 3070 29 | 3325 45 | 3513 61 | 3570 14 | 3207 30 | 3458 46 | 3517 62 | 3573 15 | 3215 31 | 3462 47 | 3520 63 | 3577 16 | 3224 32 | 3466 48 | 3524 64 | 3580 Happy coding! -Thunder _______________________________________________________________________ 24 GNU GENERAL PUBLIC LICENSE Version 2, June 1991 Copyright (C) 1989, 1991 Free Software Foundation, Inc. 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This General Public License applies to most of the Free Software Foundation's software and to any other program whose authors commit to using it. (Some other Free Software Foundation software is covered by the GNU Library General Public License instead.) You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs; and that you know you can do these things. To protect your rights, we need to make restrictions that forbid anyone to deny you these rights or to ask you to surrender the rights. These restrictions translate to certain responsibilities for you if you distribute copies of the software, or if you modify it. For example, if you distribute copies of such a program, whether gratis or for a fee, you must give the recipients all the rights that you have. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. We protect your rights with two steps: (1) copyright the software, and (2) offer you this license which gives you legal permission to copy, distribute and/or modify the software. Also, for each author's protection and ours, we want to make certain that everyone understands that there is no warranty for this free software. If the software is modified by someone else and passed on, we want its recipients to know that what they have is not the original, so that any problems introduced by others will not reflect on the original authors' reputations. Finally, any free program is threatened constantly by software patents. We wish to avoid the danger that redistributors of a free program will individually obtain patent licenses, in effect making the program proprietary. To prevent this, we have made it clear that any patent must be licensed for everyone's free use or not licensed at all. The precise terms and conditions for copying, distribution and modification follow. GNU GENERAL PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 0. This License applies to any program or other work which contains a notice placed by the copyright holder saying it may be distributed under the terms of this General Public License. The "Program", below, refers to any such program or work, and a "work based on the Program" means either the Program or any derivative work under copyright law: that is to say, a work containing the Program or a portion of it, either verbatim or with modifications and/or translated into another language. (Hereinafter, translation is included without limitation in the term "modification".) Each licensee is addressed as "you". Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running the Program is not restricted, and the output from the Program is covered only if its contents constitute a work based on the Program (independent of having been made by running the Program). Whether that is true depends on what the Program does. 1. You may copy and distribute verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and give any other recipients of the Program a copy of this License along with the Program. You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. 2. You may modify your copy or copies of the Program or any portion of it, thus forming a work based on the Program, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: a) You must cause the modified files to carry prominent notices stating that you changed the files and the date of any change. b) You must cause any work that you distribute or publish, that in whole or in part contains or is derived from the Program or any part thereof, to be licensed as a whole at no charge to all third parties under the terms of this License. c) If the modified program normally reads commands interactively when run, you must cause it, when started running for such interactive use in the most ordinary way, to print or display an announcement including an appropriate copyright notice and a notice that there is no warranty (or else, saying that you provide a warranty) and that users may redistribute the program under these conditions, and telling the user how to view a copy of this License. (Exception: if the Program itself is interactive but does not normally print such an announcement, your work based on the Program is not required to print an announcement.) These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Program, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Program, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it. Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Program. In addition, mere aggregation of another work not based on the Program with the Program (or with a work based on the Program) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. 3. You may copy and distribute the Program (or a work based on it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you also do one of the following: a) Accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, b) Accompany it with a written offer, valid for at least three years, to give any third party, for a charge no more than your cost of physically performing source distribution, a complete machine-readable copy of the corresponding source code, to be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, c) Accompany it with the information you received as to the offer to distribute corresponding source code. (This alternative is allowed only for noncommercial distribution and only if you received the program in object code or executable form with such an offer, in accord with Subsection b above.) The source code for a work means the preferred form of the work for making modifications to it. For an executable work, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the executable. However, as a special exception, the source code distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. If distribution of executable or object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place counts as distribution of the source code, even though third parties are not compelled to copy the source along with the object code. 4. You may not copy, modify, sublicense, or distribute the Program except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense or distribute the Program is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. 5. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Program or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Program (or any work based on the Program), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Program or works based on it. 6. Each time you redistribute the Program (or any work based on the Program), the recipient automatically receives a license from the original licensor to copy, distribute or modify the Program subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties to this License. 7. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Program at all. For example, if a patent license would not permit royalty-free redistribution of the Program by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Program. If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply and the section as a whole is intended to apply in other circumstances. It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system, which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice. This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. 8. If the distribution and/or use of the Program is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Program under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License. 9. The Free Software Foundation may publish revised and/or new versions of the General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of this License, you may choose any version ever published by the Free Software Foundation. 10. If you wish to incorporate parts of the Program into other free programs whose distribution conditions are different, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. NO WARRANTY 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Programs If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. Copyright (C) This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Also add information on how to contact you by electronic and paper mail. If the program is interactive, make it output a short notice like this when it starts in an interactive mode: Gnomovision version 69, Copyright (C) year name of author Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, the commands you use may be called something other than `show w' and `show c'; they could even be mouse-clicks or menu items--whatever suits your program. You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the program, if necessary. Here is a sample; alter the names: Yoyodyne, Inc., hereby disclaims all copyright interest in the program `Gnomovision' (which makes passes at compilers) written by James Hacker. , 1 April 1989 Ty Coon, President of Vice This General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Library General Public License instead of this License. ******************************************** *** PsyTexx Amiga MOD Tracker for PalmOS *** ******************************************** *** THIS PROGRAM IS FREE *** *** USE IT AT YOUR OWN RISK! *** *** Send comments to: *** *** observer_page@mail.ru *** *** Official website: *** *** www.warmplace.ru *** ******************************************** At the moment there are two problems: 1) I have middling english :) 2) PsyTexx sources are old and they have difficult unreasoned structure with bugs (may be) and many gcc "warnings". The PsyTexx2 will be fully rewrited and it'll be without aforesaid problems. PsyTexx was writed in the Windows environment with the Cygwin (linux emulator). So it is needs for the latest PRC-Tools with the PilRC resource compiler. Just run the makefile.bat (in the parent directory) for compiling MOD2PDB/PDB2MOD convertrer has not multiplatform sources. It was writed in the Win32 Sphinx C-- compiler (sheker.chat.ru). All these files are in the PDB_converter folder: C--.EXE MOD2PDB.c-- PDB2MOD.C-- Use makefile.bat for fast compiling. Sources of all pictures are in *.AUR files. You need the NewTek Aura for edit it. RESULTED FILES: psytexx.prc backup.pdb enjoy :) and waiting for the PsyTexx2 - XM Tracker. // ------------------------------------------------------------------- // // STRING32.TXT for Sphinx C-- (STRING32.H--) // // Function for work with lines under Win32 // // The offers and плевки send on hd_keeper@mail.ru // // ------------------------------------------------------------------- // The description of functions from STRING32.H-- is indicated below, intended for, work with ASCIIZ-lines and areas of memory under Win32. As it is accepted in C--, all functions are dynamic and do not increase a size of a code, if are not used. The functions are optimized under Pentium and 32-bit segments code. Though the functions also were intended for work under Windows in memory model FLAT, they will work under any other operational system for want of observance the following conditions: 1) The 32-bit operands contain correct displacements 2) The segment registers DS and ES are equal 3) The flag of a direction is dropped: DF = 0 The 32-bit segments of a code are desirable (for maintenance of maximum Productivity), but not mandatory condition of application. The size of functions is given for want of their introduction in a code of the program (@). In case Call of functions (CALL) it is necessary to add 1 byte on the instruction RET. --------------- Function for work with ASCIIZ-lines --------------- strlen Definition of length of a line :DWORD strlen (LPSTR str); str - pointer on a line Returns: length of a line, not including, finishing 0, Size: 12 bytes WinAPI analog: lstrlen strend Definition of an extremity of a line :LPSTR strend (LPSTR str); str - pointer on a line Returns: the pointer on an extremity of a line (on, finishing 0), Size: 10 bytes strcpy Copying of a line :LPSTR strcpy (LPSTR dest, src); src - pointer on an initial line Dest - pointer on the buffer, where will be copied src Returns: dest Size: 32 bytes WinAPI analog: lstrcpy strcpyn, strncpy Copying of a line with restriction on length :LPSTR strcpyn (LPSTR dest, src; DWORD max); src - pointer on an initial line dest - pointer on the buffer, where will be copied src max - maxima of numerals, how many to copy from src Returns: dest Size: 40 bytes WinAPI analog: lstrcpyn strmov Copying of a line (for overlapped lines) :LPSTR strmov (LPSTR dest, src); src - pointer on an initial line dest - pointer on the buffer, where will be copied src Returns: dest Size: 73 bytes strmovn, strnmov Copying of a line with restriction on length (for overlapped lines) :LPSTR strmovn (LPSTR dest, src; DWORD max); src - pointer on an initial line dest - pointer on the buffer, where will be copied src max - maxima of numerals, how many to copy from src Returns: dest Size: 79 bytes strcat Concatenation of lines (dest = dest + src) :LPSTR strcat (LPSTR dest, src); src - pointer on a line, which will be attributed to dest dest - pointer on a line, to which will be attributed src Returns: dest Size: 44 bytes WinAPI analog: lstrcat strcmp Comparison of lines :LONG strcmp (LPSTR str1, str2); str1, str2 - pointers on compared lines Returns: 0, if str1 = str2 < 0, if str1 < str2 > 0, if str1 > str2 Size: 26 bytes WinAPI analog: lstrcmp strcmpi, stricmp Comparison of lines with ignoring of the register :LONG strcmpi (LPSTR str1, str2); str1, str2 - pointers on compared lines Returns: 0, if str1 = str2 < 0, if str1 < str2 > 0, if str1 > str2 Size: 53 bytes WinAPI analog: lstrcmpi strcmpn, strncmp Comparison of lines with restriction on length :LONG strcmpn (LPSTR str1, str2; DWORD max); str1, str2 - pointers on compared lines max - maxima of numerals, how many to compare Returns: 0, if str1 = str2 < 0, if str1 < str2 > 0, if str1 > str2 Size: 30 bytes WinAPI analog: CompareString strcmpni, strcmpin, strncmpi, stricmpn, strnicmp, strincmp Comparison of lines with restriction on length and ignoring of the register :LONG strcmpni (LPSTR str1, str2; DWORD max); str1, str2 - pointers on compared lines max - maxima of numerals, how many to compare Returns: 0, if str1 = str2 < 0, if str1 < str2 > 0, if str1 > str2 Size: 57 bytes WinAPI analog: CompareString strchr Search of a numeral in a line :LPSTR strchr (LPSTR str; CHAR chr); str - pointer on a line chr - required numeral Returns: the pointer on the first found numeral Size: 27 bytes strchrr, strrchr Search of a numeral in a line from an extremity :LPSTR strchrr (LPSTR str; CHAR chr); str - pointer on a line chr - required numeral Returns: the pointer on the last found numeral Size: 26 bytes strstr Search of a substring in a line :LPSTR strstr (LPSTR str, substr); str - pointer on a line, in which is made search substr - pointer on a required substring Returns: the pointer on the first numeral of the found substring in str (0, if not is found) Size: 63 bytes strupr Reduction of a line to the upper case :LPSTR strupr (LPSTR str); str - pointer on a line Returns: str Size: 24 bytes WinAPI analog: CharUpper strlwr Reduction of a line to a lower cascading :LPSTR strlwr (LPSTR str); str - pointer on a line Returns: str Size: 24 bytes WinAPI analog: CharLower strtok Partition of a line on words :LPSTR strtok (LPSTR dest, src, divs); src - pointer on an initial line or outcome of the previous call dest - pointer on the buffer, where will be copied a word divs - pointer on a line, containing a numeral - separators Returns: 0, if the words more are not present Not 0, if the word is copied in dest (transmit this significance In quality src for consequent search) Size: 50 bytes --------------- Function for work with areas of memory --------------- memsetz, memzset, memset0, mem0set Обнуление of area of memory :void memsetz (LPVOID mem; DWORD size); mem - pointer on area of memory size - size of area in bytes Returns: anything Size: 16 bytes WinAPI analog: ZeroMemory memset Filling of area of memory :void memset (LPVOID mem; DWORD size; BYTE value); mem - pointer on area of memory size - size of area in bytes value - significance of byte of filling Returns: anything Size: 24 bytes WinAPI analog: FillMemory memcpy Copying of area of memory :void memcpy (LPVOID dest, src; DWORD size); src - pointer on area, whence to copy datas dest - pointer on area where to copy datas size - amount byte, how many to copy Returns: anything Size: 14 bytes WinAPI analog: CopyMemory memsetd, memset32 Fast filling of area of memory :void memsetd (LPVOID mem; DWORD size, value); mem - pointer on area of memory size - size of area in double words (not in bytes!) value - significance of a double word of filling Returns: anything Size: 2 bytes memcpyd, memcpy32 Fast copying of area of memory :void memcpyd (LPVOID dest, src; DWORD size); src - pointer on area, whence to copy datas dest - pointer on area where to copy datas size - amount of double words (not byte!), how many to copy Returns: anything Size: 2 bytes memmov Copying of area of memory (for overlapped areas) :void memmov (LPVOID dest, src; DWORD size); src - pointer on area, whence to copy datas dest - pointer on area where to copy datas size - amount byte, how many to copy Returns: anything Size: 57 bytes WinAPI analog: MoveMemory memcmp Comparison of areas of memory :LONG memcmp (LPVOID mem1, mem2; DWORD size); mem1, mem2 - pointers on compared areas size - amount byte, how many to compare (0 - any) Returns: 0, if mem1 = mem2 < 0, if mem1 < mem2 > 0, if mem1 > mem2 Size: 26 bytes --------------------------------------- -------------------------- In total of functions: 24 Total size: 811 bytes (835 bytes) // ------------------------------------------------------------------- // // Libraries Win32 API // // for Sphinx C-- 0.229+ // // ------------------------------------------------------------------- // From what ALL BEGAN ... By undertaking for programming on C-- under Windows, I have come across absence of libraries satisfying to my requests. Here and it was necessary before of writing of the programs to undertake development of these libraries. This package was written because of of analogs, taken from Borland Delphi and C++ Builder. From source codes were eliminated little use in practice of a structure and constant. Quite probably, in the consequent versions of library will be extended and are supplemented. Despite of a significant diminution of volume of an initial code on a comparison with analogs C++, the libraries are still too great for the version of the compiler C-under DOS. For example, on compilation WINUSER.H-- any more there is no memory. However, it can easily be bypassed, by taking advantage the version of the compiler C--32 under a cantilever mode Windows. I do not see in it of a large problem: time you have undertaken to program under Windows - use the compiler under Windows. The libraries Win32 API, realized for C++ Builder and C-- 0.229, are connected as follows: constants at first are declared, and then one file is connected: #define _WINBASE_ TRUE #define _WINGDI_ TRUE #include "windows.h--" I like a method of connection of several files more: #include "winbase.h--" #include "wingdi.h--" #include "winuser.h--" The former method is still supported and will be supported. The WINDOWS.H-- file exists just for assuring compatibility with this method. // ------------------------------------------------------------------- // THAT IS ALREADY MADE The given realization includes the following files: ADVAPI H-- Work with the register CCANIM H-- Service functions for animation CCHEADER H-- Service functions for separators CCLIST H-- Service functions for the lists CCPRSHT H-- Service functions for multipage boards CCTAB H-- Service functions for bookmarks CCTREE H-- Service functions for trees COMMCTRL H-- Lists, trees, прогрессы, bookmark, status bar... COMMDLG H-- Dialogues of discovery of the file, preservation, printing, search. LZEXPAND H-- Unpacking of files, wrapped up COMPRESS.EXE SHELLAPI H-- Work with трэйем, drag and drop, documents... STRING32 H-- Classical functions of work with lines under Win32 WINBASE H-- Work with memory, files, DLL, console, lines... WINDEF H-- Main declarations of types, structures and макросов WINDOWS H-- Is for compatibility at a level of source codes WINERROR H-- Codes of errors Windows WINGDI H-- Work with contexts of systems(devices), graphics and fonts WINUSER H-- Event, messages, resources(safe lifes) and other interface README32 TXT This file STRING32 TXT the Description of functions STRING32.H-- Now is a little bit more detailed about all these files. At once I shall tell, that at me is not present slightest desire to describe ALL or even some functions Win32 API. For the sake of study of the mechanism of programming under Windows I can only advise to read a pair of the good books, and as reference "on-line" of a manual - well-known MS SDK Help. WINDEF.H-- Contains the descriptions of main data types, constants and structures. Some macros also are circumscribed. You hardly need to connect this file to the program obviously, as it will be connected for want of use WINDOWS.H-- or WINBASE.H--. WINDOWS.H-- Is intended for compatibility with a "classical" method of connection of libraries. Using this file, you should up to its connection declare appropriate constants. WINBASE.H-- Is for import of functions from KERNEL32.DLL, also contains the descriptions of constants and structures necessary for work with these functions. In this and in all remaining libraries the preference is given up to functions and structures for work with ANSI-lines, the UNICODE-functions are not realized by virtue of their extremely rare application. The functions of a Windows kernel are used for a memory allocation and other system resources, management of processes and streams, work with files, and ASCIIZ-lines, loading DLL, cantilever input-output... Perhaps, any program under Windows will use functions of this library. WINGDI.H-- Imports functions from GDI32.DLL, destination for work with such graphic objects, as contexts of devices (DC), fonts (Font), paintbrushes (Brush), pens (Pen), figures (Bitmap, Metafile), and also graphic objects. The functions of the interface of graphic devices (GDI) will be useful first of all to the one who attends to creation of own interface elements of the window, and also founders graphic demo. WINUSER.H-- Will realize functions USER32.DLL, which are used for work with windows, buttons, menu, text, icons, fields of input and other main elements of dialog boxes. Also contains the descriptions of functions, structures and constants for work with events and messages, there are functions for transformation and formatting of ASCIIZ-lines. The programs using the graphic user interface (GUI), necessarily should use this library. Three above named DLL - KERNEL, GDI, USER - make basis as well as most operational system Windows, and any program under it. WINERROR.H-- Contains the descriptions of constants - codes of errors Windows. The library can be useful at the stage of a program debugging. COMMCTRL.H-- Contains imported from COMCTL32.DLL of function, and also description of structures and constants for the messages. The animation (Animation), various lists is used for creation of such interface elements, as ( Drag List, Image List, List View, Tree View), bookmark (Tab Control), multipage dialogues (Property Sheets), status bar and progress (Status Bar, Progress Bar), (Toolbar) toolbar, movable indicators (Trackbar), pop-pup of the helps (Tooltip), titles and separators (Header Control). With the purposes of a diminution of volume of a target code the auxiliary service functions engaging in the sum about 4K of an object code, are born in files CC*.H--. If you do not want to use them, you can send the appropriate messages by API-function SendMessage. COMMDLG.H-- Will realize the interface with COMDLG32.DLL, is used for work with standard dialog boxes: discovery of the file, preservation of the file, search and replacement of the text, choice of colour, choice of the font, preparation for listing. ADVAPI.H-- Is for import of functions from ADVAPI32.DLL, which are applied to work with the system register both modes of safety and access (ACL, ACE, SID). If somebody knows, what favour can be extracted from structures of a type ACL and SID - write. SHELLAPI.H-- Imports functions from SHELL32.DLL - extension an envelope. You can use this library for work with protocol Drag and Drop, tram of a board of problems, extraction of icons from the programs and libraries, discovery of the documents and appendices, working with them, and much other. LZEXPAND.H-- Will realize functions LZ32.DLL - library of unpacking of datas. Allows to unpack datas packed by the program COMPRESS. You can use this library, by creating the file with a graphics and - or by music for demo and then by packing it by the program COMPRESS. STRING32.H-- Contains realization classical for C of functions of processing of ASCIIZ-lines and simply of lines under Win32. Certainly, you can quite do without by use appropriate WinAPI of functions, but if for you the velocity has critical significance - these functions for you. For the detail description of functions look the file STRING32.TXT. CCANIM.H-- _CCANIM _ CCHEADER.H-- _CCHEADER_ CCLIST.H-- _CCLIST_ CCPRSHT.H-- _CCPRSHT_ CCTAB.H-- _CCTAB_ CCTREE.H-- _CCTREE_ Contains the description of service functions for the following interface elements accordingly: animation (Animation Control), separators (Header Control), lists (List View), multipage dialogue boards (Property Sheet), bookmark (Tab Control) and trees (Tree View). By virtue of impossibility of call of API-functions of dynamic procedures all service functions should be made static, and for a diminution of volume of an object code to bear them in "own" libraries. COMPRESS.EXE The program of compression of datas from Microsoft. Uses algorithm LZ. The serious restriction - in one archive can be only one file (catalogue is not present). Can be applied to compression of the file with datas for consequent unpacking by functions of library LZEXPAND.H--. // ------------------------------------------------------------------- // WHAT STILL IT WOULD BE DESIRABLE TO MAKE By unique restriction of development of libraries of a possibility of the C-- compiler. Many things under Windows (like indirect calls or work with structures under the reference) are rather complicated for organizing without a normal model of the pointers. The development of libraries will be conducted in parallel to development of the compiler. In the consequent versions of libraries the support is planned: 1) WinSocket and WinInet 2) DirectX (in particular, DirectDraw and DirectInput) 3) Interfaces of objects an envelope (Shell Library Object) // ------------------------------------------------------------------- // HOW TO CONTACT to the AUTHOR You can write to me on E-Mail or in FIDO: E-Mail: hd_keeper@mail.ru FIDO: 2:5024/22.13@fidonet Send me your offers, note, and especially messages on detected errors. I should know, in what direction to work further. You can freely modify libraries, if the introduced modifications can, under your judgement, to reduce in their improving. Only do not overlook then to inform me on the most successful updatings. I do not promise, that I shall answer all letters, but necessarily I shall read and I shall take part to an information. Have a nice coding! Anton Kopeev AKA Keeper // ------------------------------------------------------------------- // // Библиотеки Win32 API // // для Sphinx C-- 0.229+ // // ------------------------------------------------------------------- // С ЧЕГО ВСЕ НАЧАЛОСЬ ...Взявшись за программирование на C-- под Windows, я натолкнулся на отсутствие библиотек, удовлетворяющих моим запросам. Вот так и пришлось прежде написания программ взяться за разработку этих библиотек. Этот пакет был написан на основе аналогов, взятых из Borland Delphi и C++ Builder. Из исходных текстов были исключены малоиспользуемые на практике структуры и константы. Вполне возможно, в последующих версиях библиотеки будут расширены и дополнены. Несмотря на значительное уменьшение объема исходного кода по сравнению с аналогами C++, библиотеки все еще слишком велики для версии компилятора C-- под DOS. Например, на компиляцию WINUSER.H-- уже не хватает памяти. Впрочем, это можно легко обойти, воспользовавшись версией компилятора C--32 под консольный режим Windows. Я не вижу в этом большой проблемы: раз вы взялись программировать под Windows - используйте компилятор под Windows. Библиотеки Win32 API, реализованные для C++ Builder и C-- 0.229, подключаются следующим образом: сначала объявляются константы, а затем подключается один файл: #define _WINBASE_ TRUE #define _WINGDI_ TRUE #include "windows.h--" Мне же больше нравится способ подключения нескольких файлов: #include "winbase.h--" #include "wingdi.h--" #include "winuser.h--" Прежний способ по-прежнему поддерживается и будет поддерживаться. Файл WINDOWS.H-- существует именно для обеспечения совместимости с этим способом. // ------------------------------------------------------------------- // ЧТО УЖЕ СДЕЛАНО Данная реализация включает в себя следующие файлы: ADVAPI H-- Работа с реестром CCANIM H-- Сервисные функции для анимации CCHEADER H-- Сервисные функции для разделителей CCLIST H-- Сервисные функции для списков CCPRSHT H-- Сервисные функции для многостраничных панелей CCTAB H-- Сервисные функции для закладок CCTREE H-- Сервисные функции для деревьев COMMCTRL H-- Списки, деревья, прогрессы, закладки, строки состояния... COMMDLG H-- Диалоги открытия файла, сохранения, печати, поиска. LZEXPAND H-- Распаковка файлов, запакованных COMPRESS.EXE SHELLAPI H-- Работа с трэйем, drag&drop, документами... STRING32 H-- Классические функции работы со строками под Win32 WINBASE H-- Работа с памятью, файлами, DLL, консолью, строками... WINDEF H-- Основные объявления типов, структур и макросов WINDOWS H-- Служит для совместимости на уровне исходных текстов WINERROR H-- Коды ошибок Windows WINGDI H-- Работа с контекстами устройств, графикой и шрифтами WINUSER H-- События, сообщения, ресурсы и прочий интерфейс README32 TXT Этот файл STRING32 TXT Описание функций STRING32.H-- Теперь несколько поподробнее обо всех этих файлах. Сразу скажу, что у меня нет ни малейшего желания описывать ВСЕ или хотя бы некоторые функции Win32 API. Ради изучения механизма программирования под Windows я могу лишь посоветовать прочитать пару хороших книг, а в качестве справочного "on-line" руководства - небезызвестный MS SDK Help. WINDEF.H-- Содержит описания основных типов данных, констант и структур. Также описаны некоторые макрокоманды. Вам вряд ли понадобится подключать этот файл к своей программе явно, так как он будет подключен при использовании WINDOWS.H-- или WINBASE.H--. WINDOWS.H-- Предназначен для совместимости с "классическим" способом подключения библиотек. Используя этот файл, вы должны до его подключения объявить соответствующие константы. WINBASE.H-- _WINBASE_ Служит для импорта функций из KERNEL32.DLL, также содержит описания констант и структур, необходимых для работы с этими функциями. В этой и во всех остальных библиотеках предпочтение отдано функциям и структурам для работы с ANSI-строками, UNICODE-функции не реализованы в силу их крайне редкого применения. Функции ядра Windows используются для распределения памяти и прочих системных ресурсов, управления процессами и потоками, работы с файлами, и ASCIIZ-строками, загрузки DLL, консольного ввода-вывода... Пожалуй, любая программа под Windows будет использовать функции этой библиотеки. WINGDI.H-- _WINGDI_ Импортирует функции из GDI32.DLL, предначначенные для работы с такими графическими объектами, как контексты устройств (DC), шрифты (Font), кисти (Brush), перья (Pen), рисунки (Bitmap, Metafile), а также графическими примитивами. Функции интерфейса графических устройств (GDI) будут полезны в первую очередь тем, кто занимается созданием собственных интерфейсных элементов окна, а также создателям графических демо. WINUSER.H-- _WINUSER_ Реализует функции USER32.DLL, которые используются для работы с окнами, кнопками, меню, текстом, иконками, полями ввода и прочими основными элеметами диалоговых окон. Также содержит описания функций, структур и констант для работы с событиями и сообщениями, есть функции для преобразования и форматирования ASCIIZ-строк. Программы, использующие графический интерфейс пользователя (GUI), обязательно должны использовать эту библиотеку. Три вышеназванные DLL - KERNEL, GDI, USER - составляют базу как и самой операционной системы Windows, так и любой программы под нее. WINERROR.H-- _WINERROR_ Содержит описания констант - кодов ошибок Windows. Библиотека может быть полезна на стадии отладки программы. COMMCTRL.H-- _COMMCTRL_ Содержит импортируемые из COMCTL32.DLL функции, а также описания структур и констант для сообщений. Используется для создания таких интерфейсных элементов, как анимация (Animation), различные списки (Drag List, Image List, List View, Tree View), закладки (Tab Control), многостраничные диалоги (Property Sheets), строки состояния и прогресса (Status Bar, Progress Bar), панели инструментов (Toolbar), ползунков (Trackbar), всплывыающих подсказок (Tooltip), заголовков и разделителей (Header Control). В целях уменьшения объема выходного кода вспомогательные сервисные функции, занимающие в сумме около 4K объектного кода, вынесены в файлы CC*.H--. Если вы не хотите использовать их, вы можете сами посылать соответствующие сообщения API-функцией SendMessage. COMMDLG.H-- _COMMDLG_ Реализует интерфейс с COMDLG32.DLL, используется для работы со стандартными диалоговыми окнами: открытие файла, сохранение файла, поиск и замена текста, выбор цвета, выбор шрифта, подготовка к распечатке. ADVAPI.H-- _ADVAPI_ Служит для импорта функций из ADVAPI32.DLL, которые применяются для работы с системным реестром и режимами безопасности и доступа (ACL, ACE, SID). Если кто-нибудь знает, какую пользу можно извлечь из структур типа ACL и SID - пишите. SHELLAPI.H-- _SHELLAPI_ Импортирует функции из SHELL32.DLL - расширения оболочки. Вы сможете использовать эту библиотеку для работы с протоколом Drag&Drop, трэйем панели задач, извлечения иконок из программ и библиотек, открытия документов и работающих с ними приложений и многого другого. LZEXPAND.H-- _LZEXPAND_ Реализует функции LZ32.DLL - библиотеки распаковки данных. Позволяет распаковывать данные, упакованные программой COMPRESS. Вы можете использовать эту библиотеку, создав файл с графикой и/или музыкой для своей демки и затем упаковав его программой COMPRESS. STRING32.H-- _STRING32_ Содержит реализацию классических для Си функций обработки ASCIIZ-строк и просто строк под Win32. Конечно, вы можете вполне обойтись использованием соответствующих WinAPI функций, но если для вас скорость имеет критическое значение - эти функции для вас. Для детального описания функций смотрите файл STRING32.TXT. CCANIM.H-- _CCANIM_ CCHEADER.H-- _CCHEADER_ CCLIST.H-- _CCLIST_ CCPRSHT.H-- _CCPRSHT_ CCTAB.H-- _CCTAB_ CCTREE.H-- _CCTREE_ Содержит описание сервисных функций для следующих интерфейсных элементов соответственно: анимация (Animation Control), разделители (Header Control), списки (List View), многостраничные диалоговые панели (Property Sheet), закладки (Tab Control) и деревья (Tree View). В силу невозможности вызова API-функций из динамических процедур все сервисные функции пришлось сделать статическими, а для уменьшения объема объектного кода вынести их в "собственные" библиотеки. COMPRESS.EXE Программа сжатия данных от Microsoft. Использует алгоритм Лемпеля-Зива (LZ). Серьезное ограничение - в одном архиве может быть только один файл (каталога нет). Может применяться для сжатия файла с данными для последующей распаковки функциями библиотеки LZEXPAND.H--. // ------------------------------------------------------------------- // ЧТО ЕЩЕ ХОЧЕТСЯ СДЕЛАТЬ Единственным ограничением развития библиотек возможности компилятора C--. Многие вещи под Windows (наподобие косвенных вызовов или работы со структурами по ссылке) весьма сложно организовать без нормальной модели указателей. Развитие библиотек будет вестись параллельно развитию компилятора. В последующих версиях библиотек планируется поддержка: 1) WinSocket и WinInet 2) DirectX (в частности, DirectDraw и DirectInput) 3) интерфейсов объектов оболочки (Shell Library Object) // ------------------------------------------------------------------- // КАК СВЯЗАТЬСЯ С АВТОРОМ Вы можете написать мне на E-Mail или в FIDO: E-Mail: hd_keeper@mail.ru FIDO: 2:5024/22.13@fidonet Присылайте мне ваши предложения, замечания, и особенно сообщения об обнаруженных ошибках. Мне надо знать, в каком направлении работать дальше. Вы можете свободно модифицировать библиотеки, если вносимые изменения могут, по вашему мнению, привести к их улучшению. Только не забудьте потом сообщить мне о наиболее удачных модификациях. Не обещаю, что отвечу на все письма, но обязательно прочту и приму к сведению. Have a nice coding! Антон Копьев AKA Keeper // ------------------------------------------------------------------- // // STRING32.TXT для Sphinx C-- (STRING32.H--) // // Функции для работы со строками под Win32 // // Предложения и плевки отправляйте на hd_keeper@mail.ru // // ------------------------------------------------------------------- // Ниже приведено описание функций из STRING32.H--, предназначенные для работы с ASCIIZ-строками и областями памяти под Win32. Как это принято в C--, все функции являются динамическими и не увеличивают размер кода, если не используются. Функции оптимизированы под Pentium и 32-битные сегменты кода. Хоть функции и предназначались для работы под Windows в модели памяти FLAT, они будут работать под любую другую операционную систему при соблюдении следующих условий: 1) 32-битные операнды содержат корректные смещения 2) Сегментные регистры DS и ES равны 3) Флаг направления сброшен: DF=0 32-битные сегменты кода являются желательным (для обеспечения максимальной производительности), но не обязательным условием применения. Размер функций дан при их внедрении в код программы (@). В случае вызова функций (CALL) следует добавить 1 байт на инструкцию RET. --------------- Функции для работы с ASCIIZ-строками --------------- strlen Определение длины строки :DWORD strlen( LPSTR str); str - указатель на строку Возвращает: длину строки, не включая завершающий 0 Размер: 12 байт WinAPI аналог: lstrlen strend Определение конца строки :LPSTR strend( LPSTR str); str - указатель на строку Возвращает: указатель на конец строки (на завершающий 0) Размер: 10 байт strcpy Копирование строки :LPSTR strcpy( LPSTR dest, src); src - указатель на исходную строку dest - указатель на буфер, куда будет скопирована src Возвращает: dest Размер: 32 байт WinAPI аналог: lstrcpy strcpyn, strncpy Копирование строки с ограничением по длине :LPSTR strcpyn( LPSTR dest, src; DWORD max); src - указатель на исходную строку dest - указатель на буфер, куда будет скопирована src max - максимум символов, сколько копировать из src Возвращает: dest Размер: 40 байт WinAPI аналог: lstrcpyn strmov Копирование строки (для перекрывающихся строк) :LPSTR strmov( LPSTR dest, src); src - указатель на исходную строку dest - указатель на буфер, куда будет скопирована src Возвращает: dest Размер: 73 байт strmovn, strnmov Копирование строки с ограничением по длине (для перекрывающихся строк) :LPSTR strmovn( LPSTR dest, src; DWORD max); src - указатель на исходную строку dest - указатель на буфер, куда будет скопирована src max - максимум символов, сколько копировать из src Возвращает: dest Размер: 79 байт strcat Конкатенация строк (dest = dest + src) :LPSTR strcat( LPSTR dest, src); src - указатель на строку, которая будет приписана к dest dest - указатель на строку, к которой будет приписана src Возвращает: dest Размер: 44 байт WinAPI аналог: lstrcat strcmp Сравнение строк :LONG strcmp( LPSTR str1, str2); str1, str2 - указатели на сравниваемые строки Возвращает: 0, если str1 = str2 < 0, если str1 < str2 > 0, если str1 > str2 Размер: 26 байт WinAPI аналог: lstrcmp strcmpi, stricmp Сравнение строк с игнорированием регистра :LONG strcmpi( LPSTR str1, str2); str1, str2 - указатели на сравниваемые строки Возвращает: 0, если str1 = str2 < 0, если str1 < str2 > 0, если str1 > str2 Размер: 53 байт WinAPI аналог: lstrcmpi strcmpn, strncmp Сравнение строк с ограничением по длине :LONG strcmpn( LPSTR str1, str2; DWORD max); str1, str2 - указатели на сравниваемые строки max - максимум символов, сколько сравнивать Возвращает: 0, если str1 = str2 < 0, если str1 < str2 > 0, если str1 > str2 Размер: 30 байт WinAPI аналог: CompareString strcmpni, strcmpin, strncmpi, stricmpn, strnicmp, strincmp Сравнение строк с ограничением по длине и игнорированием регистра :LONG strcmpni( LPSTR str1, str2; DWORD max); str1, str2 - указатели на сравниваемые строки max - максимум символов, сколько сравнивать Возвращает: 0, если str1 = str2 < 0, если str1 < str2 > 0, если str1 > str2 Размер: 57 байт WinAPI аналог: CompareString strchr Поиск символа в строке :LPSTR strchr( LPSTR str; CHAR chr); str - указатель на строку chr - искомый символ Возвращает: указатель на первый найденный символ Размер: 27 байт strchrr, strrchr Поиск символа в строке с конца :LPSTR strchrr( LPSTR str; CHAR chr); str - указатель на строку chr - искомый символ Возвращает: указатель на последний найденный символ Размер: 26 байт strstr Поиск подстроки в строке :LPSTR strstr( LPSTR str, substr); str - указатель на строку, в которой производится поиск substr - указатель на искомую подстроку Возвращает: указатель на первый символ найденной подстроки в str (0, если не найдена) Размер: 63 байт strupr Приведение строки к верхнему регистру :LPSTR strupr( LPSTR str); str - указатель на строку Возвращает: str Размер: 24 байт WinAPI аналог: CharUpper strlwr Приведение строки к нижнему регистру :LPSTR strlwr( LPSTR str); str - указатель на строку Возвращает: str Размер: 24 байт WinAPI аналог: CharLower strtok Разбиение строки на слова :LPSTR strtok( LPSTR dest, src, divs); src - указатель на исходную строку или результат предыдущего вызова dest - указатель на буфер, куда будет скопировано слово divs - указатель на строку, содержащую символы-разделители Возвращает: 0, если слов больше нет не 0, если слово скопировано в dest (передайте это значение в качестве src для последующего поиска) Размер: 50 байт --------------- Функции для работы с областями памяти --------------- memsetz, memzset, memset0, mem0set Обнуление области памяти :void memsetz( LPVOID mem; DWORD size); mem - указатель на область памяти size - размер области в байтах Возвращает: ничего Размер: 16 байт WinAPI аналог: ZeroMemory memset Заполнение области памяти :void memset( LPVOID mem; DWORD size; BYTE value); mem - указатель на область памяти size - размер области в байтах value - значение байта заполнения Возвращает: ничего Размер: 24 байт WinAPI аналог: FillMemory memcpy Копирование области памяти :void memcpy( LPVOID dest, src; DWORD size); src - указатель на область, откуда копировать данные dest - указатель на область, куда копировать данные size - количество байт, сколько копировать Возвращает: ничего Размер: 14 байт WinAPI аналог: CopyMemory memsetd, memset32 Быстрое заполнение области памяти :void memsetd( LPVOID mem; DWORD size, value); mem - указатель на область памяти size - размер области в двойных словах (не в байтах!) value - значение двойного слова заполнения Возвращает: ничего Размер: 2 байта memcpyd, memcpy32 Быстрое копирование области памяти :void memcpyd( LPVOID dest, src; DWORD size); src - указатель на область, откуда копировать данные dest - указатель на область, куда копировать данные size - количество двойных слов (не байт!), сколько копировать Возвращает: ничего Размер: 2 байта memmov Копирование области памяти (для перекрывающихся областей) :void memmov( LPVOID dest, src; DWORD size); src - указатель на область, откуда копировать данные dest - указатель на область, куда копировать данные size - количество байт, сколько копировать Возвращает: ничего Размер: 57 байт WinAPI аналог: MoveMemory memcmp Сравнение областей памяти :LONG memcmp( LPVOID mem1, mem2; DWORD size); mem1, mem2 - указатели на сравниваемые области size - количество байт, сколько сравнивать (0 - ни одного) Возвращает: 0, если mem1 = mem2 < 0, если mem1 < mem2 > 0, если mem1 > mem2 Размер: 26 байт ----------------------------------------------------------------- Всего функций: 24 Суммарный размер: 811 байт (835 байт) --------------------------PsyTexx--------------------------- ---------------------Amiga MOD Tracker---------------------- for PalmOS5 ----------------------------v1.8---------------------------- --------------------by Alexandr Zolotov--------------------- New in version 1.8 (19 jan 2005): * five octaves instead of three (use a following keys: A,B,C); * sample effects: anticlick, HQ-portamento, distortion, simple cut-off and wah-wah; * additional pattern effects: 6xx, 7xx, 8xx; * internal help; * 12 channels; * new sample interpolation. New in version 1.5: * surround echo (you can play MODs with echo in the PsyTexx only!); * auto properties saving; * new effects: E1x E2x EAx EBx; * much more powerfull sample editor (use menu for the new features); * playing to the copy-buffer (for sample editor); * 16bit linear interpolation; * now you can play MODs in Palm SIMULATOR: just put win32DLL.dll file to the folder with Simulator and use psytexx_sim.prc; * if you want to play MOD without additional effects (like an echo) press the CLASSIC MOD PLAYING button. New in version 1.3: * 8 channels support; * 16 bit mixing; * stereo sound; * fixed some bugs in player; * changed gui; * new supported effects: Axx; * and other small improvements... :) www.warmplace.ru 2004. Ekaterinburg. Russia.