VOGONS


Reply 40 of 929, by MobyGamer

User metadata
Rank Member
Rank
Member

I set up a system nearly identical to yours (Olivetti M24, 8 MHz 8086, CT1320B Sound Blaster 2.0) and did some testing. First of all, I just want to say how much of a great achievement this is -- it's definitely giving GLX a run for its money! While GLX can mix slightly faster, MM has a much more graceful failure condition (as you wrote, it drops voices to keep up). GLX will simply produce noise or fail if it can't keep up, while MM will play what it can and still allow you to exit (eventually ;-). Also, I get the overall feeling that MM's output quality is better. I also like how interface is much nicer to use (being able to delete from the file browser is making it easier to manage files on a 32MB partition). And the ability to adjust the output rate without leaving the program makes it easy to test how various mixing speeds behave with various mods (the mod ALBINOSE.MOD has some speech samples -- at 22KHz you hear "people think they're seeing ghosts" but at 32KHz when it is dropping channels to keep up, you hear "_eop__ __ink they___ _eeing gho___" which is kind-of funny). It was fun to play 8-channel songs @ 16KHz, and 4-channel songs @ 26KHz (as high as I could go before channels were dropped). Overall you've done a great job!!

If you're still working on it, I have some suggestions:

Bugs (go to ftp://ftp.oldskool.org/pub/misc/Audio/testmods/ to get these mods):

  • The song LIBERTIN.MOD has slightly incorrect timing; if you listen to pattern 6, the drum beat sample in channel 4 isn't looping in the right place, it's retriggered slightly too soon.
  • The song LIVE.MOD has wrong notes in patterns 1-4 in channel 1. I changed Octives from 3 to 5 but it still sounded wrong.
  • The song SMALLTECH.MOD has wrong/missing notes in channel 3 in the first two patterns; whenever SetVol 02 appears, the note is silenced.
  • The song UPSTREAM.MOD is playing slightly too fast when it gets to pattern 4. (Off-by-1 in your BPM calcs maybe?)
  • The song EXUDTITL.S3M plays with a slightly uneven tempo. It's noticable starting at pattern 5. BPM miscalc maybe?
  • My M24 mouse driver uses the text cursor as the pointer when in text modes, but you disable the cursor so I can't see the pointer, making the mouse useless. (I got around this by using JOYOUS which is a joystick-as-a-mouse driver so I could test the other options.)
  • The bottom status bar of the main screen is occasionally corrupt. Bad pointer reference probably.
  • The total play time for some mods that use looping and many speed changes is not correct (TECHMARU.MOD is showing as being 33 minutes long when it's only 11 minutes long). Not really important, but technically a bug so I thought I'd mention it :)
  • S3M files with FM instruments don't play. (You probably know this already)
  • The samples list shows corrupted info for empty instrument slots for .FAR modules.
  • I tried to load some ULT files but got "ULT format error" which led to an error that there wasn't enough memory to load them -- then it corrupted the memory map, because on exit I got the DOS error message "Memory error, cannot load COMMAND.COM, system halted". So I'm guessing maybe ULT support isn't finished?

Improvements:

  • Provide an option to not disable the hardware cursor (see above)
  • Show the number of active playing voices onscreen somewhere -- something like "8/6" to indicate that the module is trying to play 8 simultaneous voices, but MM is only able to produce 6 at the current mixing speed, and the "6" can be in flashing red or something). Priority should be given to updating these numbers so that they'll be visible even if the entire screen is repainting very slowly.
  • /E for English isn't complete (shows "Charge xxxxxxxx.xxx" instead of "Loading xxxxxxxx.xxx"). Minor quibble.
  • You don't support E0 ;-) Believe it or not, some modules use it (TECHMARU.MOD, AIRBOR.MOD), and you can hear it on a real Amiga. I never implemented E0 either, but a simple averaging filter on the final mixed buffer before it is output would do the trick. No need for an FFT-based lowpass filter. Just think, you could be the first PC modplayer in history to support E0...

I hope someday you'll open-source the code. I'm fluent in both pascal and assembler, and would be very curious to read it someday. Heck, maybe use it in porting an arcade game to 8088+CGA or something...

Reply 42 of 929, by FreddyV

User metadata
Rank Oldbie
Rank
Oldbie

Hi,

I am really glad that you tested MM like this 😀

Are you able to test it on a slower machine ? Where can I find the module used in 8088 domination ?
It can be great to test it on a 8088 😀 (Faster than 8088 Domination ? 😉 )

Regarding the mixing speed, check the improvement I did below. Now MM Mix faster than GLX, probably in all the cases.

Regarding the sound "Quality" difference:
MM does not pre calculate the sample increments: The problem of wrong index each 10 samples is not there.
MM also does not add the sample in 16 Bit : The Upper Byte does not have 1 added from time to time...
It can be improved if you increase the mix table volume (Press + / - in the main menu to adjust the volume)

Of course I still work on it.
- I added another mixing buffer :
-> It can play 2KHz further so almost all 4CH .MOD are Ok at 29KHz without sound drop.
-> When the mix speed is too high, the way the samples are paused is better : ENIGMA.MOD is quite good in 45KHz
- I tested with a sound blaster Pro on my PC1640 : The sound is much better !
(Now I need another SBPro for the 286 ;-( )
- We can now Adjust the frequency file per file, and it is saved

** The projects **

As I now have a SB Pro, I would like to put back Stereo support (Or Rewrite it as it need some change in the mixing code)
-> I will use the same Mixing code in 2 Temporary buffer and re create the stereo buffer in the Signed/Not signed loop.
-> I will also add another Mixing Code that does 'MOV' instead of 'ADD' to remove the buffer cleanup code.
-> Mono Mixing Code will be faster and Stereo Mixing code may be as fast as Mono.

- I need to better adjust the Volume table, I think I can go further. In stereo, the mix quality will be better as we can use 7bit per sample...
- Change the way the Note/Period are used : To correct the Arpeggio, reduce memory usage and speed up the partition display code.
- Put Back the Gravis Ultrasound Code for 80x286 : I need to hear this on the IBM 5161 😀

** Here are my answers to your tests **

•The song LIBERTIN.MOD has slightly incorrect timing
-> I checked and hear no problem. This is a long sample with a fine tune.
•The song LIVE.MOD has wrong notes in patterns 1-4 in channel 1
-> This is normal, as I changed the FineTune to C4 Adjustment (Like in S3M) I broke the Arpeggio: In my plan to correct, but long to do.
•The song SMALLTECH.MOD has wrong/missing notes in channel 3 in the first two patterns; whenever SetVol 02 appears, the note is silenced.
-> As I use a volume table, Samples with volume = 2 can't be heared. If you increase the mix table volume in the main menu, you can hear them 😀
•The song UPSTREAM.MOD is playing slightly too fast when it gets to pattern 4. (Off-by-1 in your BPM calcs maybe?)
->
•The song EXUDTITL.S3M plays with a slightly uneven tempo. It's noticable starting at pattern 5. BPM miscalc maybe?
-> When I play it side by side with Scream Tracker 3 I don't notice problem with the tempo, strange....
•My M24 mouse driver uses the text cursor as the pointer when in text modes
-> Why did you use the mouse ? You did not use the 2rd release I made with the frequency adjust with Right/Left ?
-> I wil check this (Low priority)
•The bottom status bar of the main screen is occasionally corrupt.
-> I saw this as well, It works in french.
•The total play time for some mods that use looping and many speed changes is not correct.
-> I know, but as Mod Master is the only player doing it, I never took time to corret (Even in 1996) I even think about removing it...
•S3M files with FM instruments don't play. (You probably know this already)
-> It was supported, I removed it to save memory as it was ot working really well.
•The samples list shows corrupted info for empty instrument slots for .FAR modules.
-> Corrected, I spent time on it but this format is really limited, not worth the effort.
•I tried to load some ULT files but got "ULT format error" which led to an error that there wasn't enough memory to load them
-> Corrected, it was the Pattern loader having a bug. .ULt Files are often >8 Channels and the loader is still not perfect...

•Provide an option to not disable the hardware cursor
-> Done, it is nit removed it you use the /C parameter (Need to add it all the time)

•Show the number of active playing voices onscreen somewhere.
-> It is done in Debug mode even if not accurate. Some values are displayed in the main mixing loop but not this one. The value is lower when the mix is too slow.
It also does not count when there is nothing mixed : The value change fast and is not obvious to read.
With the debug mode counters, you can calculate exactly the % of time it is 1, 2, and 3 buffers late.

•You don't support E0 😉
-> NO 😀

The last version is attached.
ad I also published another video with an Atari PC2:
https://www.youtube.com/watch?v=c6xDnolps6A&t=7s

Attachments

  • Filename
    MODMXT3.zip
    File size
    69.21 KiB
    Downloads
    71 downloads
    File license
    Fair use/fair dealing exception

Reply 43 of 929, by MobyGamer

User metadata
Rank Member
Rank
Member
FreddyV wrote:

Are you able to test it on a slower machine ? Where can I find the module used in 8088 domination ?
It can be great to test it on a 8088 😀 (Faster than 8088 Domination ? 😉 )

I can test it on a slower machine but I want to keep it at an 8MHz 8086 first so I can compare.
8088 MPH module is here: http://www.reenigne.org/misc/test1.mod
Your player probably isn't faster than the replay routine in 8088 MPH itself because of all the tricks reenigne used (you can read about them here: https://www.reenigne.org/blog/8088-pc-speaker … r-how-its-done/ ) Once you see the .mod itself, you'll understand why.

I'm not able to test for a few days but I didn't want to leave you hanging, so I'm replying now.

Regarding the mixing speed, check the improvement I did below. Now MM Mix faster than GLX, probably in all the cases.

I'm still trying to understand your speedup/dropping voices/buffer strategy. I think it's this:
1. You render N buffers ahead
2. At the end of each mixing loop you notice whether N buffer is still playing, or if it took so long that you're now player buffer N+1, or N+2, or N+3
a. If N, keep the number of voices the same
b. If N+1, drop 1 voice
c. if N+2, drop 2 voices
3. Once mixing is back to the speed of a single buffer playing, you start adding voices back

...etc. Is that about right?

-> I will also add another Mixing Code that does 'MOV' instead of 'ADD' to remove the buffer cleanup code.

Dude! Surprised you missed that! Bad programmer! 😉 😉

- Put Back the Gravis Ultrasound Code for 80x286 : I need to hear this on the IBM 5161 😀

You can't, it doesn't work. GUS needs 16-bit ISA slot and the ability to remap/mask the NMI to function properly, both things an 8088-based PC can't do.

•The song LIBERTIN.MOD has slightly incorrect timing
-> I checked and hear no problem. This is a long sample with a fine tune.

xmplay plays it fine. Play only channel 5 (the drums), mute the others, it should be audible. We can revisit this later.

-> As I use a volume table, Samples with volume = 2 can't be heared. If you increase the mix table volume in the main menu, you can hear them 😀

You may want to add that to the documentation.

•My M24 mouse driver uses the text cursor as the pointer when in text modes
-> Why did you use the mouse ? You did not use the 2rd release I made with the frequency adjust with Right/Left ?

I did use it, all testing was on V2. I just tried to use the mouse for other stuff, like "Interpolation" (which doesn't do anything, probably because no 16-bit yet).

-> I know, but as Mod Master is the only player doing it, I never took time to corret (Even in 1996) I even think about removing it...

Ok, it could be removed.

•The samples list shows corrupted info for empty instrument slots for .FAR modules.
-> Corrected, I spent time on it but this format is really limited, not worth the effort.

Should probably remove it then.

•I tried to load some ULT files but got "ULT format error" which led to an error that there wasn't enough memory to load them
-> Corrected, it was the Pattern loader having a bug. .ULt Files are often >8 Channels and the loader is still not perfect...

There aren't many modules in ULT format. The big advantage for ULT at the time was that it supposed 16-bit samples and played only on the GUS. Once FastTracker II came out, everyone stopped using ULT (FT2 is better in every way). You can probably remove ULT support.

•Provide an option to not disable the hardware cursor
-> Done, it is nit removed it you use the /C parameter (Need to add it all the time)

Cool, I'll test, thanks.

-> It is done in Debug mode even if not accurate. Some values are displayed in the main mixing loop but not this one. The value is lower when the mix is too slow.

Is debug mode compiled in as a command-line switch in this version?

•You don't support E0 😉
-> NO 😀

Just think, you could be world first...

I'll test the new version on both 8086@8 as well as 8088@4.77 but I probably won't be able to test until the weekend, sorry.

Reply 44 of 929, by FreddyV

User metadata
Rank Oldbie
Rank
Oldbie

For the debug mode, Press F6 while playing the module.

What the mixing does:
If the mixing is one buffer late : Does nothing
2 Buffers late : increase the minimum volume to play a sample
3 Buffers late : Drop the next channels mixing. (Stop the mixing)
4 Buffers late : Impossible, otherwise the SB start to play the currently mixing buffer.
You can see this clearly with the debug mode.

I tried putting my 8088 at 4,77MHz.
In fact, GLX is still faster, ahead by some hundreds of KHz (To have Mod Master starting to drop some channels)
But at the same mixing frequency, the sound quality is much better with Mod Master, we hear more the difference if the mixing frequency is lower.

At the end, Mod Master is around 500Hz slower, but even by mixing at 1KHz less, the sound is much better.

Anyway, like I wrote many time, I was curious to see what can be done with my code. I Prefere to have a better sound than be faster. 500Hz/1KHz difference is not a lot.

Reply 46 of 929, by 640K!enough

User metadata
Rank Oldbie
Rank
Oldbie
MobyGamer wrote:

You can't, it doesn't work. GUS needs 16-bit ISA slot and the ability to remap/mask the NMI to function properly, both things an 8088-based PC can't do.

At the very least, the InterWave has some support for 8-bit slots. I haven't bothered to look in detail, but as long as the chip can be configured to use ports in the right range, and your software doesn't use features that can't be done as a series of 8-bit operations, in theory, it should be possible to get something working.

If I'm not mistaken, the NMI requirement is only for the provided emulation software, which wouldn't be needed in this case. Furthermore, even some of the emulation functionality can do without NMI, and the option is provided right in the configuration menu.

This might be quite different in practise. The included software is sometimes limited, so custom tools may be required, and I haven't checked if the existing cards were designed in a way that would allow it to work. In any case, I am not about to try acquiring a machine old enough to experiment with this.

Reply 47 of 929, by FreddyV

User metadata
Rank Oldbie
Rank
Oldbie

When I check GUS Code, I see that there are some 16 bit registers addressed with 16 bit IN/OUT

-8Bit IN/OUT Work on a 8 bit ISA Bus, it depends only if the board itself support it. there is 99% of chance it is not the case.
We can also upload the samples without using DMA.

I was thinking about doing an hardware mod to have the board allowing 16 bit I/O in 8 bit in this case. Then, it is a long term "Project* / Idea.

I see no reason why it should not work on an XT 286, I will try on it first with GLX.

By the way, as you work on the GUS Clone, its it possible for you to check this ? (16 bit registers can be written in 8 bit ? )

For example, this:

U_Poke  Proc  Near
push DX
push AX
MOV DX,CS:[GUSBasePort]
ADD DX,CommandPort ; Select Register (3x3)
MOV AL,DRAMAddrLo
OUT DX,AL
inc DX ; DataLowPort (3x4)
MOV AX,cx
OUT DX,AX
dec DX ; CommandPort (3x3)
MOV AL,DRAMAddrHi
OUT DX,AL
ADD DX,2 ; DataHighPort (3x5)
MOV AL,bl
OUT DX,AL
ADD DX,2 ; DRAMIOPort (3x7)
pop AX
OUT DX,AL
pop DX
ret
U_Poke EndP

It looks like we write in 16 bit only on the Data Low Port

Last edited by FreddyV on 2019-06-27, 12:22. Edited 2 times in total.

Reply 48 of 929, by FreddyV

User metadata
Rank Oldbie
Rank
Oldbie

Just think, you could be world first....

I did think about it and if the new project I am working on is a success, I will be able to support it with 100% accuracy on a "Special" Hardware. 😀

I'll test the new version on both 8086@8 as well as 8088@4.77 but I probably won't be able to test until the weekend, sorry

Don't worry, it is exceptional for me to have you testing it so take your time.

Reply 49 of 929, by MobyGamer

User metadata
Rank Member
Rank
Member
FreddyV wrote:

I see no reason why it should not work on an XT 286, I will try on it first with GLX.

An XT-286 has 16-bit slots already (it's essentially an IBM AT) so a GUS will work without any trouble. The only 286 I know of that isn't really a full IBM AT clone and only has 8-bit slots is the Tandy 1000 TX.

For example, this: […]
Show full quote

For example, this:

U_Poke  Proc  Near
push DX
push AX
MOV DX,CS:[GUSBasePort]
ADD DX,CommandPort ; Select Register (3x3)
MOV AL,DRAMAddrLo
OUT DX,AL
inc DX ; DataLowPort (3x4)
MOV AX,cx
OUT DX,AX
dec DX ; CommandPort (3x3)
MOV AL,DRAMAddrHi
OUT DX,AL
ADD DX,2 ; DataHighPort (3x5)
MOV AL,bl
OUT DX,AL
ADD DX,2 ; DRAMIOPort (3x7)
pop AX
OUT DX,AL
pop DX
ret
U_Poke EndP

It looks like we write in 16 bit only on the Data Low Port

I'm not sure that code is "valid" -- when you write a 16-bit word to a port, the low byte goes to the port and the high byte goes to the port+1. So AL would go to DataLowPort and AH would go to DataHighPort. Discussion here: http://www.vcfed.org/forum/showthread.php?317 … -O-and-the-8088
However -- this is not guaranteed to work on all clones. It is known to fail on the Olivetti M24 (and clones) systems.

Reply 50 of 929, by FreddyV

User metadata
Rank Oldbie
Rank
Oldbie

I'm not sure that code is "valid" -- when you write a 16-bit word to a port, the low byte goes to the port and the high byte goes to the port+1.

You are right, as the Address+1 is another register, it will fail.
The only way is to build hardware for this.

Reply 51 of 929, by FreddyV

User metadata
Rank Oldbie
Rank
Oldbie

Hi again,
I saw this and make me doubt...
https://www.youtube.com/watch?v=bMBp0wntOSc

So, DataLow and DataHigh are not 2 different "registers", we select the register before.
These are the ports to send the data to the registers.
The only 16 bit OUT sent to the GUS in my code is to send a 16bit value to the Data Register (Using DataLow 3x4)
On an XT, machine it will automatically send 2 bytes to the port 3x4 and 3x5, it should work….

Unfortunately, the Mod Master GUS code does not work on the GUS emulation, so I will need time to check this out...

Reply 52 of 929, by 640K!enough

User metadata
Rank Oldbie
Rank
Oldbie

Keep in mind that this applies to the InterWave. I haven't checked if it equally applies to the GF1.

The chip was designed specifically to operate with a data bus that is either 8- or 16-bit. In general, you can access the 16-bit registers using a series of 8-bit operations. In some cases, there are restrictions on which register (or byte) must be written first (in cases where a value > 16 bits is written to more than one 16-bit register; memory addresses, for instance), so pay attention to the programming guides.

While the chip may be capable of 8-bit-bus operation, it remains unclear if existing card designs will allow this to work, or if a card would have to be specifically designed with that feature in mind. The only way to find out for sure is for someone with the necessary hardware to try it.

Reply 54 of 929, by MobyGamer

User metadata
Rank Member
Rank
Member

Had a chance to set up my 8MHz 8086 again and do some testing on MODMXT3 this weekend:

FreddyV wrote:

•Provide an option to not disable the hardware cursor
-> Done, it is nit removed it you use the /C parameter (Need to add it all the time)

This worked, I can use my 6300/M24 mouse with MM now! 😀

•Show the number of active playing voices onscreen somewhere. -> It is done in Debug mode even if not accurate. Some values are […]
Show full quote

•Show the number of active playing voices onscreen somewhere.
-> It is done in Debug mode even if not accurate. Some values are displayed in the main mixing loop but not this one. The value is lower when the mix is too slow.
It also does not count when there is nothing mixed : The value change fast and is not obvious to read.
With the debug mode counters, you can calculate exactly the % of time it is 1, 2, and 3 buffers late.

By monitoring the cnt, cnt1, and cnt2 variables, I was able to empirically determine that 23KHz is where none of them count up at all on a 4-channel MOD. At 25-26KHz, your buffer/avoidance schemes start to kick in. By 32KHz, I personally consider the result no longer listenable (the dropped instruments are too noticeable).

I did a comparison with GLX and LIBERTIN.MOD (6-channel mod). Observations: GLX could play it at 17KHz, any higher and it starting dropping buffers and bugging out. MODMXT3 when set to the same rate played the entire module with Cnt1: 980 Cnt2:0 Cnt:0. I then decided to set MODMXT3 to rates GLX can NOT play on this hardware to see what would happen:

18KHz: cnt1: 5660 cnt2: 643 Cnt: 47 No obvious perceptible difference
19KHz: cnt1: 6267 cnt2: 2479 Cnt: 270 No obvious perceptible difference
20KHz: cnt1: 7210 cnt2: 3475 Cnt: 647 Some "jumping" audible (ie. stopped mixing), 99% of the song is still listenable.
21KHz: cnt1: 10509 cnt2: 4628 Cnt: 1327 Can audibly hear channels dropping out, song isn't listenable about 10% of the time

I think this is a great result; I consider MODMXT3 equivalent to GLX.

I will try to test on a 4.77 MHz 8088 soon.

Reply 55 of 929, by FreddyV

User metadata
Rank Oldbie
Rank
Oldbie

Hi,

Gravis Ultrasound Code is Back and Working on MODM XT
Then, it may work at least on a 80286.

I did test on the Atari PC2 at 4,77MHz. It is faster than the 5150 and can mix at 15KHz (If I remember well)

To compare with GLX, you are right.
There is no sound mixing skipped When the Cnt1 is increase and most of the time as well with Cnt2
The 100% comparison for the pure mixing speed is with Cnt1=0, because I suppose it is the was GLX Does. (2 Buffer)
Anyway, Technically we should compare with Cnt3=0

Reply 57 of 929, by MobyGamer

User metadata
Rank Member
Rank
Member

I already commented on the video. So, GUS on 8088? I didn't think it was possible, but as soon as you make the new player available, I'll test it for sure. I always believed GUS required a 16-bit slot... happy to be wrong!

Reply 58 of 929, by FreddyV

User metadata
Rank Oldbie
Rank
Oldbie

Hi,

Here si the GUS Version.

Still project to come:
- Amiga 500 Support (You wonder how it is possible ? need to play DOPE.MOD on an amiga 500 )
- Tandy DAC
- Try to add a simple .XM Loader
- Stereo Mixing
- 16 Bit Mixing ? Needed in MODM XT When GUS is Working ?
- Put Back support for > 16 Channel and Pattern compression -> I want to play DOPE.MOD (Again) :-p

Any other idea ?

FreddyV/Useless (Nobody remember USMPlay ? )

Attachments

  • Filename
    MODMXT4.zip
    File size
    73.65 KiB
    Downloads
    63 downloads
    File license
    Fair use/fair dealing exception

Reply 59 of 929, by MobyGamer

User metadata
Rank Member
Rank
Member

I will try to test this in the next week or so. I can't believe I never realized it was possible -- I know that some players fell back to PIO when 16-bit DMA wasn't available, but I never made the connection that PIO uploading of samples is possible on any computer. And the NMI hooking never comes into play if you never run SBOS, so... yes, a GUS can work on 8088. Crazy!

Does MODMXT4 *only* support GUS, or did you retain the covox and SB support?

Tandy DAC should be easy to support, it's BIOS calls for everything. It supports double-buffered playback (auto-init dma). Check ftp://ftp.oldskool.org/pub/drivers/Tandy/1000 … ence_Manual.pdf for the section called "Tandy 1000 SL and Tandy 1000 TL BIOS Sound support". I can't test this for you, I gave away my TL a decade ago.

Your biggest problem making an .XM loader is how to handle oversized modules; many of the later ones have over 1GB of 16-bit samples. You'd have to use EMS to load most decent .XMs, or limit them to only GUS. EMS isn't viable for 8088 sound mixing, it takes too long to switch pages in/out of the page frame. Your second problem is handling the instrument parameters. It is not a trivial thing; I never wrote an .XM or .IT loader because looking at the format was exhausting.

I'd like to see support for 16-bit cards and 16-bit mixing, personally. PAS can work in 8088 and I think SB16 can too if you choose 8-bit DMA.

FreddyV wrote:

FreddyV/Useless (Nobody remember USMPlay ? )

Yes, but not everyone remembers it fondly ("pretty unstable and flawed (mustdie9x-incompatible and broken sync timers)". I have no opinion because I don't think we ever saw it at hornet.org. But you're (re)writing all this code, so you can change history.