Mixomat 1.01a

Contents
About Mixomat
License
Installation
Files
Settings
REXX Interface
Scope
Known Problems
Frequently Asked Questions
Future
History
Updates


1. About Mixomat

Mixomat is a mixer for Soundblaster 16/32 and 64 cards. It is optimized for OS/2 Warp 4 but it also works with OS/2 Warp 3 together. MMPM is not necessary.

2. Licence

Mixomat is Homeware, that means that this program is free for all home users (students, pupils, home workers and other none profit users). I know that IBM wants to drop this market. I want to stop these development with my Homeware campaign. I am a student of chemistry.
All other users must buy a license of Mixomat. A license costs 20$ (or Fr. 30.-) for a single version (or send me a license of your program). Please send the money by mail to my address. Write also your e-mail address that I can send you a confirmation. Updates will be free or they will cost a little update fee. That depends on how much new things are in the update.
Questions? e-mail.

Address:

Christoph Bratschi
Felsenweg 16
CH-4123 Allschwil
Switzerland

E-Mail: cbratschi@datacomm.ch

There is only one version of Mixomat without any limitations!

Guarantee: You use this program at your own risk! All rights are reserved!

3. Installation

  1. Create a directory with the name 'MIXOMAT' or choose another name.

  2. Unzip the program archive to this directory: unzip archiv.zip.

  3. Run INSTALL.CMD to create a WPS program folder.

  4. That's it!

4. Files

Filename

Description

MIXOMAT.EXE

Mixomat 1.01 program file

MIXOMAT.HTM

This documentation

SCOPE.EXE

Oscilloscope Beta.*

SBREXX.DLL

REXX DLL*

SBTEST.CMD

REXX DLL demonstration script.*

INSTALL.CMD

Installation script

FILE_ID.DIZ

Description for a BBS

5. Settings

Settings Dialog:

Tab

Options

General

Port

Choose the correct port for your Soundblaster card.
Use 'Find Port' to look for the correct port.*
Use 'Check SB...' to check if you sound card works with Mixomat.*

Load profile

If this profile is the active one it will be initialized otherwise the first profile will be activated.

Set values

The selected values will be set to the Soundblaster.

Full

Shows the full dialog

Mini

Shows the icon view

Save settings

These settings are saved.

No Reset

Do not show the reset command in context menus and ignore the hot key.*

Stop mute

All mutes are stopped.

Save settings pos

The settings dialog pos will be saved.

Time critical port access

Use this if you have problems with other programs.*

Update

Focus

Update the scrollbars on window focus.

Refresh

Refresh some or all values with a timer. If you don't choose all you can select on the Refresh tab which values to be refreshed.

Aggressive

Let some ar all values constant with a timer. If you don't choose all you can select on the Aggressive tab which values to be set.

Mute and Focus/Refresh

The Soundblaster card can't handle a mute command, this is emulated by Mixomat. Here you can choose what Mixomat will do if mute is activated and a refresh should be done: Ignore does nothing, the display will be wrong but the mute isn't broken; Update controls sets the controls to the new values and breaks the mute; Update values does refresh the values in background, if you stop mute the new value will be displayed.

Timer

Thread/PM timer is a good choose. Use the high resolution timer whenever you need a higher precision.*

Test hires timer...

Check if your system supports the high resolution timer.*

Refresh

Check boxes

Choose all values to be refreshed.

Aggressive

Check boxes

Choose all values to be set.
If a values is selected you can use the spin buttons to specify a value or a range. Without a specified value the scrollbar value is used. If the first number is higher than the second all valid values will be outside this range.

Profile

Add

Adds a new profile.

Delete

Deletes a profile.

Name

Name the profile.

Full

Save position

Saves the position of the full dialog.

Open last tab

Opens the last settings tab.*

Value info

Shows the value of scrollbars/sliders in per cent or by value. Choose 'None' if you want to disable it.*

Background start

Starts the full view in background, behind the window with the focus.*

Flat sliders

Uses flat sliders instead of scrollbars.*

Mini

Direction

Choose the direction of the window.
If you choose Vertical the statusbar and the titlebar are disabled.

Border

Choose the border type.*

Save position

Saves the position of the mini dialog.

Flat buttons

Use the flat buttons or normal buttons.*

Titlebar

Shows the titlebar

Statusbar

Use a statusbar

Mouse help

If your mouse is over a button a help text will be displayed in the statusbar.

Tip

If the statusbar is hidden or Mixomat is in horizontal view yoi can't see the help text in the statusbar. Select tip to show this information in a separate window.*

Auto close

Close the display window if it loses the focus.*

Open last

Open the last opened display window.*

Outside

Show display windows outside the main window.*

Align

Chose the position where Mixomat should be aligned.*

Check Warp Center

Don't align the window above Warp Center.*

Always on top

The main window is always on the top of all other windows.*

Open last tab

Opens the last settings tab.*

Value info

Shows the value of scrollbars/sliders in per cent or by value. Choose 'None' if you want to disable it.*

Sliders

Show scrollbars, flat sliders or circular sliders.*

Background start

Start the mini view in background, behind the window with the focus.*

Icon spacing

Set the width of the space between the icons and the space between the icons and the window frame in pixels.*

Button size

Set the size of the button in pixels.*

Expand mode

In the expand mode you can collapse the mini view. Only the first button is displayed in this mode. With help of a button or the keyboard you can expand the window to full size.*

Fixed position

Set the position of the window which is fix. You can only choose a fixed position if align is set to none. If align is set to a position the collapsed/expanded window will be aligned to this position.*

Show button

Show the expand/collapse button.*

Expanded

Set the window expanded/collapsed.

Visible

These buttons will be shown. If you select separator for a button a separator will be drawn.

Hidden

These buttons are hidden.

Context menu:

Click the right mouse button to open a context menu.

Command line:

Parameter

Description

Number

Loads the profile with this number.

/MINI

Mini view.

/FULL

Full dialog view.

/CFG="filename"*

Use the configuration file filename.

/RESET*

Reset the sound card.

/CHECK*

Check your sound card.

/FONT="fontname"*

Use the font fontname for all windows and the settings dialog. If your default font is to big and you can't read everything then use this parameter.

Examples:
/FONT="8. Tms Rmn"
/FONT="10. Helv"
/FONT="8. WarpSans"
/FONT="12. Swiss"

/BACKGROUND*

Start in Background.

/FOREGROUND*

Start in Foreground.

Keys

Full View

Key

Function

[ALT]-x

Exit

[F2]

Save settings

Mini View

Key

Function

[ALT]-x

Exit

[F2]

Save settings

[F3]

Expand/Collapse

[ALT]-s

Settings

[ALT]-p

Profile

[ALT]-a

Add profile

[ALT]-r

Reset (if allowed)

[ALT]-h

Horizontal

[ALT]-t

Toggle titlebar

[ALT]-b

Toggle statusbar

[ALT]-l

L/R lock

[ALT]-m

Full view

[ALT]-f

Full view

[ALT]-a

About

1..9

Open button at position x (1 = first, 2 = second, ...)

a..p

Open button at position x (a = first, b = second, ...)

6. REXX Interface

Initialization

call RxFuncAdd 'MixLoadFuncs','SBREXX','MixLoadFuncs'
call MixLoadFuncs

Datatypes

Bool  = 0/1
HexNr = 220

Functions

General

HexNr   = MixGetPort()
          MixSetPort(HexPort)
HexNr   = MixCheckPort()
Hi'.'Lo = MixGetDSP()
          MixReset()
Bool    = MixGetTimeCritical()
          MixSetTimeCritical(Bool)

Master

Bool   = MixIsMasterAvailable()
Number = MixGetMasterMin()
Number = MixGetMasterMax()
Number = MixGetMasterL()
Number = MixGetMasterR()
L','R  = MixGetMaster()
         MixSetMasterL(Number)
         MixSetMasterR(Number)
         MixSetMaster(L,R)

Voice

Bool   = MixIsVoiceAvailable()
Number = MixGetVoiceMin()
Number = MixGetVoiceMax()
Number = MixGetVoiceL()
Number = MixGetVoiceR()
L','R  = MixGetVoice()
         MixSetVoiceL(Number)
         MixSetVoiceR(Number)
         MixSetVoice(L,R)

Midi

Bool   = MixIsMidiAvailable()
Number = MixGetMidiMin()
Number = MixGetMidiMax()
Number = MixGetMidiL()
Number = MixGetMidiR()
L','R  = MixGetMidi()
         MixSetMidiL(Number)
         MixSetMidiR(Number)
         MixSetMidi(L,R)

CD

Bool   = MixIsCDAvailable()
Number = MixGetCDMin()
Number = MixGetCDMax()
Number = MixGetCDL()
Number = MixGetCDR()
L','R  = MixGetCD()
         MixSetCDL(Number)
         MixSetCDR(Number)
         MixSetCD(L,R)

Line

Bool   = MixIsLineAvailable()
Number = MixGetLineMin()
Number = MixGetLineMax()
Number = MixGetLineL()
Number = MixGetLineR()
L','R  = MixGetLine()
         MixSetLineL(Number)
         MixSetLineR(Number)
         MixSetLine(L,R)

Micro

Bool   = MixIsMicroAvailable()
Number = MixGetMicroMin()
Number = MixGetMicroMax()
Number = MixGetMicro()
         MixSetMicro(Number)

Speaker

Bool   = MixIsSpeakerAvailable()
Number = MixGetSpeakerMin()
Number = MixGetSpeakerMax()
Number = MixGetSpeaker()
         MixSetSpeaker(Number)

Treble

Bool   = MixIsTrebleAvailable()
Number = MixGetTrebleMin()
Number = MixGetTrebleMax()
Number = MixGetTrebleL()
Number = MixGetTrebleR()
L','R  = MixGetTreble()
         MixSetTrebleL(Number)
         MixSetTrebleR(Number)
         MixSetTreble(L,R)

Bass

Bool   = MixIsBassAvailable()
Number = MixGetBassMin()
Number = MixGetBassMax()
Number = MixGetBassL()
Number = MixGetBassR()
L','R  = MixGetBass()
         MixSetBassL(Number)
         MixSetBassR(Number)
         MixSetBass(L,R)

Output

Bool                              = MixIsOutputAvailable()
LineL','LineR','CDL','CDR','Micro = MixGetOutput()
                                    MixSetOutput(LineL,LineR,CDL,CDR,Micro)
Line
Bool = MixIsOutLineAvailable()
Bool = MixIsOutLineLAvailable()
Bool = MixGetOutLineL()
       MixSetOutLineL(Bool)
Bool = MixIsOutLineRAvailable()
Bool = MixGetOutLineR()
       MixSetOutLineR(Bool)
CD
Bool = MixIsOutCDAvailable()
Bool = MixIsOutCDLAvailable()
Bool = MixGetOutCDL()
       MixSetOutCDL(Bool)
Bool = MixIsOutCDRAvailable()
Bool = MixGetOutCDR()
       MixSetOutCDR(Bool)
Micro
Bool = MixIsOutMicroAvailable()
Bool = MixGetOutMicro()
       MixSetOutMicro(Bool)

Input

Left
Bool                                              = MixIsInputLAvailable()
MidiL','MidiR','LineL','LineR','CDL','CDR','Micro = MixGetInputL()
                                                    MixSetInputL(MidiL,MidiR,LineL,LineR,CDL,CDR,Micro)
Midi left
Bool = MixIsInLMidiAvailable()
Bool = MixIsInLMidiLAvailable()
Bool = MixGetInLMidiL()
       MixSetInLMidiL(Bool)
Bool = MixIsInLMidiRAvailable()
Bool = MixGetInLMidiR()
       MixSetInLMidiR(Bool)
Line left
Bool = MixIsInLLineAvailable()
Bool = MixIsInLLineLAvailable()
Bool = MixGetInLLineL()
       MixSetInLLineL(Bool)
Bool = MixIsInLLineRAvailable()
Bool = MixGetInLLineR()
       MixSetInLLineR(Bool)
CD left
Bool = MixIsInLCDAvailable()
Bool = MixIsInLCDLAvailable()
Bool = MixGetInLCDL()
       MixSetInLCDL(Bool)
Bool = MixIsInLCDRAvailable()
Bool = MixGetInLCDR()
       MixSetInLCDR(Bool)
Micro left
Bool = MixIsInLMicroAvailable()
Bool = MixGetInLMicro()
       MixSetInLMicro(Bool)
Right
Bool                                              = MixIsInputRAvailable()
MidiL','MidiR','LineL','LineR','CDL','CDR','Micro = MixGetInputR()
                                                    MixSetInputR(MidiL,MidiR,LineL,LineR,CDL,CDR,Micro)
Midi right
Bool = MixIsInRMidiAvailable()
Bool = MixIsInRMidiLAvailable()
Bool = MixGetInRMidiL()
       MixSetInRMidiL(Bool)
Bool = MixIsInRMidiRAvailable()
Bool = MixGetInRMidiR()
       MixSetInRMidiR(Bool)
Line right
Bool = MixIsInRLineAvailable()
Bool = MixIsInRLineLAvailable()
Bool = MixGetInRLineL()
       MixSetInRLineL(Bool)
Bool = MixIsInRLineRAvailable()
Bool = MixGetInRLineR
       MixSetInRLineR(Bool)
CD right
Bool = MixIsInRCDAvailable()
Bool = MixIsInRCDLAvailable()
Bool = MixGetInRCDL()
       MixSetInRCDL(Bool)
Bool = MixIsInRCDRAvailable()
Bool = MixGetInRCDR()
       MixSetInRCDR(Bool)
Micro right
Bool = MixIsInRMicroAvailable()
Bool = MixGetInRMicro()
       MixSetInRMicro(Bool)

Output gain

Bool   = MixIsOutGainAvailable()
Number = MixGetOutGainMin()
Number = MixGetOutGainMax()
Number = MixGetOutGainL()
Number = MixGetOutGainR()
L','R  = MixGetOutGain()
         MixSetOutGainL(Bool)
         MixSetOutGainR(Bool)
         MixSetOutGain(L,R)

Input gain

Bool   = MixIsInGainAvailable()
Number = MixGetInGainMin()
Number = MixGetInGainMax()
Number = MixGetInGainL()
Number = MixGetInGainR()
L','R  = MixGetInGain()
         MixSetInGainL(Bool)
         MixSetInGainR(Bool)
         MixSetInGain(L,R)

AGC

Bool = MixIsAGCAvailable()
Bool = MixGetAGC()
       MixSetAGC(Bool)

Example

/* SBRexx Test */

call RxFuncAdd 'MixLoadFuncs','SBREXX','MixLoadFuncs'
call MixLoadFuncs

Say MixVer()
Say MixCopyright()
Say

/* if MixIsMasterAvailable()  = 1 then Say 'Master:  'MixGetMasterL()'/'MixGetMasterR()'' */
if MixIsMasterAvailable() = 1 then
do
parse value MixGetMaster() with L','R
Say 'Master:  'L'/'R''
end;
if MixIsVoiceAvailable()   = 1 then Say 'Voice:   'MixGetVoiceL()'/'MixGetVoiceR()''
if MixIsMidiAvailable()    = 1 then Say 'Midi:    'MixGetMidiL()'/'MixGetMidiR()''
if MixIsCDAvailable()      = 1 then Say 'CD:      'MixGetCDL()'/'MixGetCDR()''
if MixIsLineAvailable()    = 1 then Say 'Line:    'MixGetLineL()'/'MixGetLineR()''
if MixIsMicroAvailable()   = 1 then Say 'Micro:   'MixGetMicro()''
if MixIsSpeakerAvailable() = 1 then Say 'Speaker: 'MixGetSpeaker()''
if MixIsTrebleAvailable()  = 1 then Say 'Treble:  'MixGetTrebleL()'/'MixGetTrebleR()''
if MixIsBassAvailable()    = 1 then Say 'Bass:    'MixGetBassL()'/'MixGetBassR()''
pause
Say
Say 'Output:'
if MixIsOutLineAvailable()  = 1 then Say 'Line:  'MixGetOutLineL()'/'MixGetOutLineR()''
if MixIsOutCDAvailable()    = 1 then Say 'CD:    'MixGetOutCDL()'/'MixGetOutCDR()''
if MixIsOutMicroAvailable() = 1 then Say 'Micro: 'MixGetOutMicro()''
if MixIsOutGainAvailable()      = 1 then 
do
L = MixGetOutGainL()
if L = 0 then L = 'x1'
else if L = 1 then L = 'x2'
else if L = 2 then L = 'x4'
else if L = 3 then L = 'x8'
R = MixGetOutGainR()
if R = 0 then R = 'x1'
else if R = 1 then R = 'x2'
else if R = 2 then R = 'x4'
else if R = 3 then R = 'x8'
Say 'Gain:  'L'/'R''
end
Say
Say 'InputL:'
if MixIsInLMidiAvailable()  = 1 then Say 'Midi:  'MixGetInLMidiL()'/'MixGetInLMidiR()''
if MixIsInLLineAvailable()  = 1 then Say 'Line:  'MixGetInLLineL()'/'MixGetInLLineR()''
if MixIsInLCDAvailable()    = 1 then Say 'CD:    'MixGetInLCDL()'/'MixGetInLCDR()''
if MixIsInLMicroAvailable() = 1 then Say 'Micro: 'MixGetInLMicro()''
Say
Say 'InputR:'
if MixIsInRMidiAvailable()  = 1 then Say 'Midi:  'MixGetInRMidiL()'/'MixGetInRMidiR()''
if MixIsInRLineAvailable()  = 1 then Say 'Line:  'MixGetInRLineL()'/'MixGetInRLineR()''
if MixIsInRCDAvailable()    = 1 then Say 'CD:    'MixGetInRCDL()'/'MixGetInRCDR()''
if MixIsInRMicroAvailable() = 1 then Say 'Micro: 'MixGetInRMicro()''
if MixIsInGainAvailable()      = 1 then 
do
L = MixGetInGainL()
if L = 0 then L = 'x1'
else if L = 1 then L = 'x2'
else if L = 2 then L = 'x4'
else if L = 3 then L = 'x8'
R = MixGetInGainR()
if R = 0 then R = 'x1'
else if R = 1 then R = 'x2'
else if R = 2 then R = 'x4'
else if R = 3 then R = 'x8'
Say 'Gain:  'L'/'R''
end
if MixIsAGCAvailable() = 1 then Say 'AGC:   'MixGetAGC()''

7. Scope

Parameters

Parameter

Function

/?
/HELP

Help

/PORT:x

Defines the port to use. Default: 220.

Example
/PORT:220

/TIMER:x

Defines the update time in ms. Default: 200ms.

Example
/TIMER:200

/NOTTIMECRITICAL

Disable time critical port access.

Attention: This is a beta release of Scope!

8. Known Problems

Problems with Multimedia Presentation Manager

There are several ways to control the Soundblaster from an OS/2 program. The Media Control Interface (MCI) is one way. But the MCI supports only volume, treble, bass, gain and balance. If I use the MCI I couldn't use all capabilities of the Soundblaster card.

I decided to access the sound card directly through ports. This works but I recognized that other programs can use the port at the same time and you can't use the sound card anymore, you must reboot. I've tried many things to handle this problem but it isn't possible. By the way: other mixers have the same problem.

Only the Creative Labs mixer uses a third way to access the sound card: IOCtls (DosDevIOCtl). Creative Labs added this functionality to their Soundblaster device driver. I wrote an e-mail to the former OS/2 developer Hariharan Mahadevan.

Hariharan Mahadevan: "Creative Mixer uses private IOCtls to access the Mixer controls.
We can't release these to the public. However, the new drives do support the standard MIXER IOCtls defined by IBM and you should be able to write a MCI mixer program based on that specs.
"

Creative Labs stopped the development of OS/2 drivers. I thought that I could be possible that they would give me the information how I can use this IOCtls in Mixomat. I answered him that I need the IOCtls, the MCI isn't useful. Second answer:

Hariharan Mahadevan: "Sorry, but can't do. It's not under my jurisdiction to decide whether I can release this info. to third party developers. You have to talk to our developer relations people in the audio group, but really doubt if the answer would be any different(Questions like this have come up before, and all of them have been turned down).

You can contact, Tan Choong Hwee, <chtan@ctlsg.creaf.com>.He's the product manager for audio products and he might be able to help you.

Anyway, it's been a while since I stopped doing audio stuff. In a different dept altogether."

I wrote an e-mail to Tan Choong Hwee but got no answer.

Then I wrote to the Creative Labs Developer Support. They sent me the source code of a DOS and a Window 3.1 mixer. That wasn't very useful to me.

Phillip Williams: "He or she is correct is what they said. The WINDOWS, NT, OS2 ... code is not available, nor will it be made available. Much of the code is proprietary. One of the reason I was given for the droping of OS2 support, is the lack of a standard interface for multi media or that the number of functions not implimented.

I will see what I can find out for OS2, if any commands can be made available."

[...]

"I will see what I can find out for OS2, if any commands can be made available. or what if any IOCtrl commands can be released."

Da steh ich nun ich armer Tor und bin so klug als wie zuvor! [Goethe, Faust I]

After that Phillip Williams sent me the answers of some Create Labs developers:

"We do have a private MIXER interface in our audio PDD(Physical Device Driver). This was necessitated by the lack of mixer support in early versions of OS/2. But these have been superseded by IBM's own MIXER standard which does not expose all the hardware features to the application. This is simply due to the fact that the interface is purely a functional one and not one which can address all future mixer hardware implementations."

"The developer in question here, wants us to expose these private IOCtls so that he can write his own Mixer program. We've had requests like this before, all of which have been turned down."

This was the last message I've received (8. October 1997). I don't know what I can do now, but I hope you know now that I want to create a functional OS/2 Soundblaster mixer. But I can't do it!

The only think you can do is to send e-mails to Creative Labs.
Or send my a better sound card and I will write the best mixer for it.

9. Frequently Asked Questions

Question: I use the sliders to change the volume but they don't work.

Answer: Check your sound card and the selected port. If other programs overwrite the settings then use the aggressive mode: open the settings dialog and enable Update/Aggressive.


Question: I have problems with VoiceType and other programs.

Question: I can't play wave files after using Mixomat. I can only hear 0.5 s of the wave file.

Answer: Read Known Problems.

10. Future

11. History

22. October 1997

Mixomat 1.01a

  • Switch and high resolution timer bugs fixed

  • Scope documentation

17. October 1997

Second release Mixomat 1.01.

  • Some bugfixes

  • Many extensions

22. August 1997

First release: Mixomat 1.01

New things are marked with a *.

12. Updates

Please visit my homepage for updates.

All mentioned products and trade marks belong to their respective owners.


Christoph Bratschi's Homepage
© 1997 by Christoph Bratschi