1

I bring you the next part of my NeoGeo related NGFX-toolchain.

2

When I started the development of 'BlutEngel2' I used NeoSoundBilder from NeoBitz but I came across some problems - it was not compatible with my NeoGeoCD-AIO-files. After research and help from some people, I was able to develop my own Z80 driver which covered ADPCM-A, ADPCM-B & CDDA-playback.

UPDATE: 25th.june.2020 - NGFX_SoundBuilder_200624

Due to several requests, here come a new build with the 32mb option enabled. These changes only apply to the GUI, the Z80 core remains unchanged. Furthermore I added some text about the license/usage of the data generated by the NGFX soundbuilder. No other changes!

UPDATE: 01st.may.2021 - NGFX_SoundBuilder_210501

Due to requests the NGFX soundbuilder now uses 8 soundbanks and supports up to 1792 sounds (ADPCMA, ADPCMB & CDDA).

- removed some less useful commands from the z80 ( MUTE & UNMUTE... use STOP instead / VOLUME_DEC & VOLUME_INC)
- removed support for NAME ARRAY in *.h file, has anyone ever used this?
- there is still no check for the validity of the soundnames (forbidden or multiple used names after duplicate or copy)
- NMI (sound in Z80) should now work faster.

How to use in classic mode:
- if you don't need more than 240 sounds then nothing changes, default selection is always BANK_00
- if you need more than 240 samples then split them to different soundbanks (INTRO, LEVEL1, LEVEL2 etc) and switch if needed - remember: shared samples created with copy or duplicate do not consume any additional memory!

How to use pseudo 16 bit mode: (of course it is not possible to send real 16bit values and the NGFX soundbuilder does not create them either)
if the use of different soundbanks is not suitable for you then you can use this mode

- send SOUNDBANK_01 (0x09) to 0x320000
- wait until 0x320000 replies with SOUNDBANK_01 (0x09) - IMPORTANT!
- send ADPCM_SOUND (0x20) to 0x320000
- wait until 0x320000 replies with SADPCM_SOUND (0x20) - only if you want to send a new command immediately

I had to change a lot of things and I checked everything only roughly - please report all problems... and other wishes of course.

ngfxsoundbuilder210501_1_o.png

visit my site for more details and download.

UPDATE: 08th.august.2021 - NGFX_SoundBuilder_210808

- added 'ADPCM_MUTE' & 'ADPCM_SET_MAX_VOL' [NeoHomeBrew]
- added 'NAME ARRAY' [NeoHomeBrew]
- added 16MB VSize option for PCM & MaxPCM [totologic]
- added 'CDDA_STOP' in Z80 Startup because most comercial games forces an Z80Reset when dealing with 'USER_REQUEST' & Co.

3

This is truly amazing Blastar!!!!! Thank you so much for all your hard work. These tools are invaluable!!!! I've said it once and I will say it again...You are making dreams come true!!! A very Merry Christmas and a Happy New Year filled with all the good stuff! I can't wait to try this baby out!

4

Boooom! Thank you for that awesome christmas gift !!! #banana#
Will send feedback in a few days #bobotfl#

5

Thank you Blastar, has NeoHomeBrew said this is a really awesome and important gift.

Thanks
Ciao
BEY
RetroIsTheOnlyFuture!

6

Hi Blastar,

I am still experimenting with the NGFX SoundBuilder and the new features (fade-in/out, APCM-B music - yeeaah! #content# )
but as promised here is a first feedback/bug report of your tool.

Importing of my Hypernoid *.nsl file (originally generated by NeoBitz's NeoSoundBuilder) has worked fine!
The NGFX Soundbuilder has automatically re-organized the bank location of the samples and has removed
a lot of empty space, which is great. By the way, in the NeoBitz Soundbuilder samples were not allowed to
cross bank boundaries (otherwise the sample won't play properly) and therefore you have to move each sample
manually into a bank which has sufficient empty space. This seems to be managed automatically in your tool?

The "Real-Hardware-Test" was successful - all sound samples and music tracks have played perfectly. I have noticed
that the general volume has been increased compared to the NeoBitz tool which is fantastic.

The "Damper" feature is removed in your tool - is it not needed anymore?

Bugs & Issues:

- Exporting the ROMs to a non-existing folder or path causes an application crash
- The program does not save M1 and V-Rom size of the project (they are always set to the standard values 64K / 1 MB).

Also, I have found three issues in the automatically generated sound.h file:

- There is a missing bracket in the ADPCM_SET_MAX_VOL definition:
#define ADPCM_SET_MAX_VOL (0x14)

- The "s" in static (sample name array) needs to be un-capitalized (otherwise it will cause a compiling error):
static const char SoundList[][] =

- Defining a function in a .h file will cause a compiling error if the .h file is included in more than one .c file
(multiple definition of 'send_sound_comand'). I had this problem also with the NeoBitz sound.h and ended up with
commenting the function manually out and defining it again in a .c file (Maybe there is a better solution?).

That's it so far, I really like the the layout of the UI and thank you again for work & for sharing your awesome tool with us!

7

thanks for report, I am glad there are only some small bugs but no real showstopper! smile

... This seems to be managed automatically in your tool?
yes hehe

The "Damper" feature is removed in your tool - is it not needed anymore?
damper is always active (neobitz = 32?)

Exporting the ROMs to a non-existing folder or path causes an application crash
why are you doing this??

The "Real-Hardware-Test" was successful
I also did many tests on MVS (NeoSD) & NeoGeoCD (PC2Neo). for example, PrePCM is not covered on WIKI.

I have noticed that the general volume has been increased compared to the NeoBitz tool which is fantastic.
???

The program does not save M1 and V-Rom size of the project (they are always set to the standard values 64K / 1 MB).
I almost only use the NGCD export , which is 64k/1MB, so i did not recognise this. cry I will fix it.

Also, I have found three issues in the automatically generated sound.h file..
I will fix this 2 typos but I can not help you with your compiling error because I never used C. I'm open to any suggestion.

many thanks for your input, the next version will have another (automatic) feature.
-> autodetect & remove duplicate sampledata. Have you ever thought about a stereo effect when a ball hits the paddle in Hyperniod? 1 sample but 3 soundcodes... left/center/right. wink (in blutengel2 you hear whether enemies shoot from left or right)

8

It is great that your NGFX Soundbuilder tool is compatible with the Neobitz Soundbuilder, this has made the change over very easy.

blastar (./7):

... This seems to be managed automatically in your tool?
yes hehe

That is a very useful feature - it has saved me about 1.5 MB of V-ROM space!

blastar (./7):
The "Damper" feature is removed in your tool - is it not needed anymore?
damper is always active (neobitz = 32?)

The standard setting for the damper in the NeoBitz tool is set to "16".
blastar (./7):
Exporting the ROMs to a non-existing folder or path causes an application crash
why are you doing this?? [/quote]

... it was pure laziness #sbof#

blastar (./7):
I have noticed that the general volume has been increased compared to the NeoBitz tool which is fantastic.
???
Yes, really - I have the feeling that the general volume of the NeoBitz driver is about 85% compared to your driver or the original SNK games (maybe just a feeling or a result of the Damper?).
blastar (./7):
Also, I have found three issues in the automatically generated sound.h file..
I will fix this 2 typos but I can not help you with your compiling error because I never used C. I'm open to any suggestion.
I would suggest to comment this function out (by standard) but leave it inside the sound.h, so that the users can decide by their own to use it or not.
blastar (./7):
many thanks for your input, the next version will have another (automatic) feature.
-> autodetect & remove duplicate sampledata. Have you ever thought about a stereo effect when a ball hits the paddle in Hyperniod? 1 sample but 3 soundcodes... left/center/right. wink (in blutengel2 you hear whether enemies shoot from left or right)
This sounds like an another cool feature to save ROM space. APCM-B is a real "rom space eater" - 16 MB are not enough for all the music tracks I currently have, if I would want to use APCM-B exclusively for the BG music...
Thanks for the idea regarding the stereo ball hit sound effect - will include this for sure.

9

Hi Blastar,
I have collected some more experiences with your tool in the last weeks and have some more questions:

1.) It seems that the volume of the samples gets significantly reduced after importing - is there a way to adjust the import volume (or to turn this feature off)?
2.) Also, I have noticed that the first coin sound does not play when the bios is in "Demo Mode" (but the 2nd and above coin sounds are playing properly). What could be the reason for it?
3.) A theoretical question because the APCM-B samples use such a big amount of rom space: If the cartridge hardware would support more than 16MB, let say 32 MB, would the Neo Geo system be able to use this additional space?

10

@NeoHomeBrew , PM

11

Damn it! This is a cliff hanger here! I am anxious to see how Blastar responds to NeoHomeBrews inqurie's? Since I have nothing yet to contribute I have been watching this thread like a hawk. Thanks again Blastar!

12

Thank you NeoHomeBrew for your thorough evaluation. Without your pointers on the typos in the sound.h file I would be stuck. crash

I investigated these commands as per NeoHomeBrew's observation about the volume of the sample being reduced I thought maybe those commands were the key to adjusting volume levels.
My Findings on some basic tests.

If the sample is playing these commands can be used to turn the volume on/off

ADPCM_INC_VOL = Turn volume on
ADPCM_DEC_VOL = Turn volume off

ADPCM_SET_MAX_VOL = (Do not understand what this is used for...)
I can call it before the sound is called but it does not seem to make a difference as to how loud the sample is.
If I call it after the sample has been loaded then the sample stops playing.

Ok so now I have an inquiry for Blastar.

1. I realize the best way to conserve space for background music is to have an ADPCM-B loop.
So I made a little loop with Gold Wave at a sample rate of 55000 is that the best sample rate to use for ADPCM-B? I read the wiki and believe I am on the right track here. It does load into NGFX SoundBuilder so that is something just curious if there is a more desirable rate ADPCM-B Samples?

2. I made an ADPCM-B Intro using the same sample rate listed above. So now I have an intro that plays and then I am trying to smoothly transition to the loop. I have ways of doing this EX: A counter.
I am curious would there be any sort of return statement that occurs when a sound is completed? So I can say if Sound 1 is finished please play Sound 2? Ultimately I am curious about sequencing music...

I have heard you say on many occasions you are ASM only so maybe the return I am looking for is already on your ASM level and I am out of luck on the C front? Please let a brother know. confus

13

hello,
NeoHomeBrew was right with the volume when importing a sample, the damper was set to 32, this is to much, I will fix this with the next version.

global volume can be set from 0 to 63 (0x00.. 0x3f) and affects ADPCM-A & -B.
ADPCM_SET_MAX_VOL = set volume immediately to maximum (0x3f)
ADPCM_MUTE = set volume immediately to zero (0x00) without stopping any sample
ADPCM_INC_VOL = increment volume by one step (volume +1)
ADPCM_DEC_VOL = decrement volume by one step (volume -1)

1) There are 2 advantages of ADPCM-B, higher samplerate and samplesize > 1MB
higher quality costs alot of space: 1min@18500 ~550KB, 1min@22050 ~ 660KB, 1min@44.400 ~1.3MB, 1min@55.500 ~1.6MB... cd-quality is 44.100Hz, it's possible to use 55.500Hz but it's useless. you should try different samplerates, maybe 33.075Hz is also ok for you soundtrack.

2) jumps within a sample is not possible, so no smoothly transition into loop. you need to different samples: intro & loop.
communication z80 <> 68k is very limited and not very useful to return a value, so you have to use your own counter, sorry.
I thought about sequencing some time ago, it's easy to implement (for ADPCM-A & also -B) but I have no clue how to integrate this logical into a GUI!.

EDIT:
playing more than one sample in a sequence works for both sampletypes (also mixed), now I will do some hardware-tests and check how to add this feature to the GUI.

14

Hi Blastar,

Thanks for confirming the way the commands are intended to work.
I swear I loaded my ADPCM-B Loop and ADPCM_DEC_VOL killed the sound and ADPCM_INC_VOL revived the sound.
All I can gather is the sound is initialized at a volume of 1 so ADPCM_DEC_VOL acted as ADPCM_MUTE and ADPCM_INC_VOL then appeared to turn the sound on again.

Any plans to make a command that allows volume to be set at a specific number?
EX: Play sample at volume level 32

Thanks so much for clarifying the sample rates! This will be a great legend to use for tests and space conservation.

I made a few GUI Mockups that may or may not be useful.

1. A Tab system was added so the GUI would not be cluttered and to maintain the standard aspect ratio when the program is not maximized.
2. For uniformity between tabs your primary commands were moved.
3. The double arrows are used to shoot samples to the very top or very bottom of the list. (Might be useful when managing large lists)
3. Samples cannot be deleted if they are tied to sequences.
4. Sequences can have both ADPCM-B and ADPCM-A samples added to them.
5. A Counter displays a running total of ticks as more samples are added.
6. A Sample can be Sequenced by the number of loops or at the exact time a counter value is reached.
If a the loop method is used the counter method cannot be used and vice versa.

If you implemented this people could listen to their sequence and then use a running counter as a gauge for adding the next sample in sequence.
You can't see that in the mockup but as the sequence plays a counter could be active so people could make decisions based on the counters current value.

Hope these are somewhat useful.

P.S. - I should have added an additional column for "Counter" beside the loop for ADPCM-B
P.P.S - After reviewing the Sequence Tab I should have added grid lines to make things clearer.

**Edit I did not realize you could play multiple ADPCM-B's and ADPCM-A's in tandem!
As it stands initializing another ADPCM-B quits the preceding sample.
As well multiple ADPCM-A's playing on top of one another is another crazy one to consider...
With this revelation the GUI would need more thought.

26lH
DWCP

15

I released an small update, no big changes but should fix (hopefully) most smaller bugs & typos.

@ Mega Shocked,
thanks for the mockups, playing samples in a sequence is still on focus and is working (limited) on real hardware, no counter or parallel adpcm-a/b playback.
this will be an bigger update because of changes in GUI, Z80 & NSL... I am not sure how much time this will take because there is another (very small) NG-related project I have to finish before working on this.

16

Great, thank you a lot for your work! Will send you feedback about the latest changes as soon as possible #blacklord#

17

Hi Blastar!

In a word AWESOME!

1. Sound is definitely louder!
2. Verified the sound.h file works perfectly.
3. Was like why would I copy the sample? Then I saw the light....

Different volumes to blend with the track that is playing!
Different sample rates to adjust the playback of a sound!

4. The quick up/down arrows!

I noticed you listed "8-Bit sample handling" curious what this means? There are sooooo many amazing tracks from the 8-bit era!!rotfl

The new project sounds exciting!!!!!! The mind wonders to maybe a palette editor?
BTW your copy from clipboard option kicks ass on your fade calculator! I stumbled on it and man is it great!

**Edit

May or may not be useful

Based on the new information here is what I have come up with....
I see why the GUI is an undesirable beast...

The Parent

1. TRACK = Composition of Samples. The term "Sequence" is dropped and "Composition" is adopted.
2. We have a Parent Child Relationship.
EX: When a TRACK is selected the COMPOSITION of Samples that makes that track is displayed.
3. Tracks can be looped.
4. The Play Button plays the selected track from the beginning.

The Child

1. The number of LANES is hard coded based on the number of samples that can play simultaneously.
2. RED Samples ADPCM-A (Apple) / Blue Samples ADPCM-B (Blue)....Simple names to keep the visualization of Samples uniform.
3. Full Title on mouse over of sample.
4. Samples that typically loop do not in this case....you can see I manually placed Sample 2 several times as per the number of time it will play in the desired composition.
5. Samples that are in the same lane are queued in succession where Samples in other lanes will be played simultaneously with Samples that are playing at that time.
6. The Add button is used to display an LOV of existing samples.
7. The GREEN ARROWS can be used to move a sample up or down LANES.
8. TIME is a gauge to help the user place samples.
9. TIME LINE can be dragged.
10. PLAY plays from the current position of the TIME LINE.
11. The BLUE ARROWS can be used to jump the timeline to the next sample.
12. SCROLL BAR in case the composition gets long.

Nice to have:

The ability to adjust volume levels in the Composition Pane per Sample selected.
Samples snap to the TIME LINE when dragged.

HPyR

18

Here comes the next small (and hopefully last) fix release. Many thanks to Neohomebrew for the extensive feedback.
After ~6 months the NGFX Soundbuilder seems to be stable enough to be called final. It supports the most important features and it is safe to use in your productions.
New features will be added to a new version because they require some rebuilding, that takes some time but playing samples in a sequence is still in focus.

Check out my Blog for more informations & download!

19

Sweet top

Without going full chiptune tracker, do you think you could squeeze in something for coin sound using SSG/FM? Keeping ADPCM free.

20

By the way non PCM chip config should be 16MB ADPCM-A + 16MB ADPCM-B.

Early games never used that much but thoses are the 2610 addressable space.

21

16MB ADPCM-A + 16MB ADPCM-B? what official game (or official PROG board) supports this configuration?

The typical CoinSound is about 8kb in size... that's only ~0.05% of the usable 16mb. NGFX Soundbilder also support Pre-PCM (2mb+2mb), so 8kb ~0.4% of usable ADPCM-A space.

22

No games used that much, but each ADPCM bus being 24 bits, 16MB is the limit for each type on 2610. So I feel the option should probably be in there?

For coin sound, It's not about sample size, but keeping channels free.

23

The dream of most people is to run their game on real hardware - so why should there be an option to create a ROM-configuration that is not supported by Flashcards or Prog-boards?
Keeping ADPCM free... I thought you meant rom but you meant channels free. neutral

24

Well some silly people make their boards or just run from mame, I dunno.

Just stating the hardware specs, don't shoot the messenger grin

25

Ok, here is the deal: if someone develops a feasible MOD for an existing prog-board to use the combination 16mb adpcm-a + 16 adpcm-b (or any flashcard pops up) then I will add this option. grin

26

How many wires is feasible? grin

27

I don't care, as long as it works, you can close the cartridge and everything fits in. grin

28

PROG 8M42, I choose you! (maybe)(when I have time to loose)

29

Just want to add that I was happy to test the latest NGFX SoundBuilder version, thanks to Blastar for giving me the chance to request some changes.
Most important fix for me is the removal of unwanted "cracking sounds" if too much loud sound effects are played in a short time range.

I have made a small sound player tool for the NGFX SoundBuilder which allows to display and play the samples listed in the exported "sound.h" file.
I would like to share this sound player tool with those who use the NeoBitz C-Dev Kit + DATlib for their projects.
You can watch the tool in action here (set video quality to 240p):



And here is the code:

sound_test.h

#ifndef __SOUND_TEST_H__ #define __SOUND_TEST_H__ void sound_test_ngfx(); #endif
sound_test.c

#include <stdio.h> #include <stdlib.h> #include <input.h> #include <DATlib.h> #include "sound_test.h" #include "sound.h" BYTE p1,p2,ps,p1e,p2e; void sound_test_ngfx() { short timer_state=0; int vbl_count=0; int play_time_frames=0; int play_time_sec=0; int play_time_min=0; int dec_number=32; // start value 32 (Hex 0x20), adresses below used for sound driver commands int sample_number=0; short volume=100; short input_delay=10; char const* display_hex[112] = { "0x00", "0x01", "0x02", "0x03", "0x04", "0x05", "0x06", "0x07", "0x08", "0x09", "0x0A", "0x0B", "0x0C", "0x0D", "0x0E", "0x0F", // 0-15 "0x10", "0x11", "0x12", "0x13", "0x14", "0x15", "0x16", "0x17", "0x18", "0x19", "0x1A", "0x1B", "0x1C", "0x1D", "0x1E", "0x1F", // 16-31 "0x20", "0x21", "0x22", "0x23", "0x24", "0x25", "0x26", "0x27", "0x28", "0x29", "0x2A", "0x2B", "0x2C", "0x2D", "0x2E", "0x2F", // 32-47 "0x30", "0x31", "0x32", "0x33", "0x34", "0x35", "0x36", "0x37", "0x38", "0x39", "0x3A", "0x3B", "0x3C", "0x3D", "0x3E", "0x3F", // 48-63 "0x40", "0x41", "0x42", "0x43", "0x44", "0x45", "0x46", "0x47", "0x48", "0x49", "0x4A", "0x4B", "0x4C", "0x4D", "0x4E", "0x4F", // 64-79 "0x50", "0x51", "0x52", "0x53", "0x54", "0x55", "0x56", "0x57", "0x58", "0x59", "0x5A", "0x5B", "0x5C", "0x5D", "0x5E", "0x5F", // 80-95 "0x60", "0x61", "0x62", "0x63", "0x64", "0x65", "0x66", "0x67", "0x68", "0x69", "0x6A", "0x6B", "0x6C", "0x6D", "0x6E", "0x6F", // 99-111 }; volMEMWORD(0x401ffe)=0x6122; // background color volMEMWORD(0x400002)=0x7CB6; // fix layer font color volMEMWORD(0x400004)=0x6122; // fix layer background color volMEMWORD(0x400006)=0x6122; // fix layer background color volMEMWORD(0x40000A)=0x6122; // fix layer background color LSPCmode=0x900; initGfx(); clearFixLayer(); clearSprites(1, 381); SCClose(); fixPrintf( 2, 2, 0, 0,"------------------------------------"); fixPrintf( 2, 3, 0, 1,"SAMPLE PLAYER for NGFX Sound Builder"); fixPrintf( 2, 4, 0, 2,"SAMPLE PLAYER for NGFX Sound Builder"); fixPrintf( 2, 5, 0, 0,"------------------------------------"); fixPrintf( 2, 7, 0, 1, "Samples Total: %03d", SAMPLE_COUNT); // total amount of samples imported from sound.h fixPrintf( 2, 8, 0, 2, "Samples Total: %03d", SAMPLE_COUNT); // total amount of samples imported from sound.h fixPrintf( 2, 10, 0, 1,"Sample Address:"); fixPrintf( 2, 11, 0, 2,"Sample Address:"); fixPrintf(18, 10, 0, 0,"NUM. HEX. DEC."); fixPrintf(22, 10, 0, 1,"l"); fixPrintf(28, 10, 0, 1,"l"); fixPrintf(22, 11, 0, 1,"l"); fixPrintf(28, 11, 0, 1,"l"); fixPrintf( 2, 13, 0, 1,"Sample Name:"); fixPrintf( 2, 14, 0, 2,"Sample Name:"); fixPrintf( 2, 16, 0, 1,"Playback Time:"); fixPrintf( 2, 17, 0, 2,"Playback Time:"); fixPrintf(17, 16, 0, 0,"TIMER"); fixPrintf(25, 16, 0, 0,"FRAMES"); fixPrintf(23, 16, 0, 1,"l"); fixPrintf(23, 17, 0, 1,"l"); fixPrintf( 2, 19, 0, 1,"Volume:"); fixPrintf( 2, 20, 0, 2,"Volume:"); fixPrintf( 2, 22, 0, 0,"------------------------------------"); fixPrintf( 2, 23, 0, 0,"P1 A: PLAY SAMPLE"); fixPrintf( 2, 24, 0, 0,"P1 B: ADPCM STOP"); fixPrintf( 2, 25, 0, 0,"P1 \x12\x13: SELECT +/-"); fixPrintf( 2, 26, 0, 0,"P1 \x11\x10: VOLUME +/-"); fixPrintf(21, 23, 0, 0,"P2 A: FADE OUT"); fixPrintf(21, 24, 0, 0,"P2 B: FADE IN"); fixPrintf(21, 25, 0, 0,"P2 C: MUTE VOLUME"); fixPrintf(21, 26, 0, 0,"P2 D: MAX. VOLUME"); fixPrintf( 2, 27, 0, 0,"------------------------------------"); fixPrintf( 2, 28, 0, 0,"P1 D: EXIT Ver.0.5 NeoHomeBrew.com"); do{ waitVBlank(); ps=volMEMBYTE(PS_CURRENT); p1=volMEMBYTE(P1_CURRENT); p2=volMEMBYTE(P2_CURRENT); if((p1&JOY_UP)&&input_delay==0) { input_delay=10; if((dec_number-32)>0) dec_number-=1; } if((p1&JOY_DOWN)&&input_delay==0) { input_delay=10; if((dec_number-32)<(SAMPLE_COUNT-1)) dec_number+=1; } if((p1&JOY_LEFT)&&input_delay==0) { input_delay=10; if(volume>0) { send_sound_command(ADPCM_DEC_VOL); volume-=1; } } if((p1&JOY_RIGHT)&&input_delay==0) { input_delay=10; if(volume<100) { send_sound_command(ADPCM_INC_VOL); volume+=1; } } if((p1&JOY_A)&&input_delay==0) { input_delay=10; send_sound_command(dec_number); // activate and reset playback timer timer_state=1; play_time_frames=0; play_time_sec=0; play_time_min=0; vbl_count=0; } if((p1&JOY_B)&&input_delay==0) { input_delay=10; send_sound_command(ADPCM_STOP); timer_state=0; // stop playback timer } if((p1&JOY_C)&&input_delay==0) { input_delay=10; send_sound_command(ADPCMB_LOOP_STOP); timer_state=0; // stop playback timer } if(p1&JOY_D) { // exit game mode (if used in user subroutine) volMEMBYTE(0x10FDB6)=0x00; // sets BIOS-PLAYER-MOD1 to 0 (P1 Never Played) volMEMBYTE(0x10FDB7)=0x00; // sets BIOS-PLAYER-MOD2 to 0 (P2 Never Played) clearFixLayer(); break; } if((p2&JOY_A)&&input_delay==0) { input_delay=10; send_sound_command(ADPCM_FADE_OUT); volume=0; } if((p2&JOY_B)&&input_delay==0) { input_delay=10; send_sound_command(ADPCM_FADE_IN); volume=100; } if((p2&JOY_C)&&input_delay==0) { input_delay=10; send_sound_command(ADPCM_MUTE); volume=0; } if((p2&JOY_D)&&input_delay==0) { input_delay=10; send_sound_command(ADPCM_SET_MAX_VOL); volume=100; } sample_number = dec_number-32; // calculate sample number if(input_delay>0) input_delay-=1; // input_delay countdown if(timer_state==1) // update timer if activated { play_time_frames +=1; vbl_count +=1; if(play_time_frames==60) // 60 frames per second { play_time_sec+=1; play_time_frames=0; if(play_time_sec==60) { play_time_min+=1; play_time_sec=0; } } } // display sound sample data //////////////////////////////////////////////////////////////////////////// fixPrintf(18, 11, 0, 0, "%03d", sample_number); // sample number imported from sound.h fixPrintf(24, 11, 0, 0, "%s", display_hex[dec_number]); // display hex adress fixPrintf(30, 11, 0, 0, "%03d", dec_number); // decimal number of hex adress fixPrintf(15, 13, 0, 1, "%s", SoundList[sample_number]); // sample name string imported from sound.h fixPrintf(15, 14, 0, 2, "%s", SoundList[sample_number]); // sample name string imported from sound.h fixPrintf(17, 17, 0, 0,"%02d:%02d", play_time_min, play_time_sec); fixPrintf(25, 17, 0, 0,"%06d", vbl_count); fixPrintf(10, 19, 0, 1,"%03d", volume); fixPrintf(10, 20, 0, 2,"%03d", volume); }while(!(p1&JOY_D)); }

30

Sounds good smile
avatar
Zeroblog

« Tout homme porte sur l'épaule gauche un singe et, sur l'épaule droite, un perroquet. » — Jean Cocteau
« Moi je cherche plus de logique non plus. C'est surement pour cela que j'apprécie les Ataris, ils sont aussi logiques que moi ! » — GT Turbo