PUP Reverse Engineering - dekay/vpinball-wiki GitHub Wiki

PUP Pack Reverse Engineering

Despite the incredible works of the developers so far, PUP Pack functionality in Visual Pinball Standalone has a ways to go yet before it reaches parity with its counterpart on Windows. This page attempts to bring together what is known about the closed-source PUP Pack format so far to aid in its reverse engineering effort.

Note

This is not a manual for making PuP packs. It is research for implementing PuP pack functionality on non-Windows systems.

Table of Contents

Credits

This page was initally pulled together from various sources, so let's first give credit where it is due.

What Are Pup Packs and Where Are They Used

PuP Packs are a mix of media and metadata to render animated pinball table backbox screens for the Visual Pinball and Future Pinball ecosystems. The Windows PuP-Pack player is closed-source software written by NailBuster.

Current Status

Several games are playable but not necessarily perfect. Many have missing video layers and labels with incorrect font sizes. jsm174 regularly tests with the following games:

  • Batman 66
  • Total Nuclear Annihilation
  • Transformers
  • Monster Bash
  • Tron NEON
  • Darkest Dungeon
  • Futurama

Basics

To try a pup pack, you need to put the puppack folder (same name as the rom) in a pupvideos folder in the tables external/vpx-table folder. You'll also need to update the VBS file to set 'use pup packs' to true for those tables where the PuP Pack is optional.

Missing features and bugs

General

The system is very flexible and has a lot of options and therefore it is complex. If an option or feature is not implemented, a message is logged in the table log file. Look for the text "Not implemented" in the log for what is not implemented.

Missing functions

The following functions called from the vbscript on the pindisplay object (CreateObject("PinUpPlayer.PinDisplay")) are not implemented yet. These are used rarely. The most used functions are implemented.

  • playlistplay
  • play
  • playpause
  • playresume
  • setAspect
  • setVolume
  • SetLength

Screen z-order

This is important for the order in which the screens lay on top of each other. There are screen options ForceBack (set it to the back), ForceOn (always on top, always visible) and ForcePop (always on top, but only shown if media is played). There are more. Standalone sometimes messes up what should be in front/back. The only workaround is to play with the different options in the screen definitions to try to get it in the correct order.

Z-order in Visual Pinball Standalone is a bit counterintuitive. The z-order is more based on when videos start and stop, what goes into the background etc. In Windows, notice that you can move everything around separately and see that they are all physical windows. Standalone puts them all in the same window so there isn't all that overhead. (Reference)

From @nailbuster

Some items: PuPShapes is a special playlist where the following bmp would reside.

PuPShapes you put 24bit bmps files in there and the pixel color (0,0) will be used as a mask to make a see-through (transparent) shape.

The order in screens.pup is more important than the pupID (#). Screens are created in the order they appear in the csv file (not ordered by pupid#). But windows z-order/creation is different than how standalone is painting on one-canvas, so that needs to be looked at differently.

From follow-on discussion in that Github issue between @tocatta10 and @francisdb, it looks like standalone creates screens in the order of #pupid instead of the order they appear in the csv file. So instead of storing them in a map by id they should be stored in a vector in the order of the screens file (or both if further lookup is a bottleneck).

@toccata10 goes into more details for other tables here on this issue for four tables: Gilligan's Island, Cactus Canyon, Flintstones, and Addams Family.

Gilligan's Island

Gilligan's Island by classicradios

If you take the "Option 4 - Topper on BG No DMD", then no video will play on the topper, nor on the central part (background videos are playing). You need to change:

0,Topper,,,0,ForceBack,,"2,34.2,0.8,31.2,14.8" to

0,Topper,,,0,ForceOn,,"2,34.2,0.8,31.2,14.8"

and

7,Other1/BackGlass2,,,0,ForcePopBack,,"2,23.5,16.3,54.0,69.5" to

7,Other1/BackGlass2,,,0,ForcePop,,"2,23.5,16.3,54.0,69.5"

Then it plays well.

Cactus Canyon

For Cactus Canyon, the layers are more complicated.

Option 1 - BG and DMD Separate

By default, most of the time it's a bluescreen. Replacing this line in the screens.pup:

12,"Backglass Videos",,,0,ForcePopBack,,"2,10.8,6.7,78.4,78.1" with

12,"Backglass Videos",,,0,ForcePop,,"2,10.8,6.7,78.4,78.1"

And removing this line

16,"PupShapes Videos",,,0,ForcePop,,"2,0,0,100,100"

gives me the best results. There are 3 overlapping layers, so for example, a ball drain will trigger:

3,1,Ball_Drain,D1,12,Drain,,,20,,,,SkipSamePrty,0 54,1,Underlay_Drain,D1,14,PupUnderlays,Underlay_Drain.mp4,,20,,,,SkipSamePrty,0 100,1,PupShapes_Drain,D1,16,ShapesVideos,PupShapes_Drain.mp4,,20,,,,SkipSamePrty,0

With 3 and 54 only, it's ok. But with 100: it seems to be over the others.

Flintstones

Flinstones by radioclassics

Option 1 - BG, DMD, Topper By default, blue screen very often.

This is more or less the same as Cactus Canyon. So the best results were obtained by changing

7,Other1/BackGlass2,,,0,ForcePopBack,,"2,21.44,3.11,55.19,73.67" to

7,Other1/BackGlass2,,,0,ForcePop,,"2,21.44,3.11,55.19,73.67"

Otherwise these central videos will play, but in the background (so sound, but no video will display because it's hidden by Underlay_Default.mp4)

And remove 12,Shapes_Text,,,0,ForcePop,,"2,0,0,100,100" because it appears below the Overlay_Default.png but over the screen 11 defined by 11,Underlays,PupUnderlays,Underlay_Default.mp4,,ForceBack,,"2,0,0,100,100"

The screen 12 should be overlaying the letters as shown in this video.

Maybe those are old puppack and now, there are some new ways to create them, but it's fun to get them working. Main problem seems to be able to control which video is on top (specially when 3 of them are playing).

Addams Family

For the Addams Family

Option 1 - BG, DMD, Topper, change

13,"Backglass Videos",,,0,ForceBack,,"2,21.56,11.33,55.12,73.44" to

13,"Backglass Videos",,,0,ForceOn,,"2,21.56,11.33,55.12,73.44"

in order to see some videos in the central part of the screen.

Missing Alpha Support in Videos

The Flintstones PuP Pack is currently broken, apparently because of missing alpha support in some cases. From @toccata10 in Discord: In the Flinstones puppack, "Animated_Text" videos are displayed in blue. Same goes for CactusCanyon "ShapesVideos_TEXT". I suppose the blue part should be rendered transparent ?". @nailbuster has confirmed that the pixel color (0,0) in 24bit BMPs is used as a mask to make a see-through (transparent) shape.

Flintstones - No Alpha

This is how it should look (Reference)

Flintstones - Correct

Video overlays can cause video to stop playing

From @somatik on Discord: "There's also an existing issue where a overlay layer in front if the video layer can cause the video to stop playing. Seen this with trigger that have PlayAction (Loop) on SetBG"

e.g. 1,1,Startup,D0,12,PuPOverlays,1.png,,1,,,,SetBG,0

NeedInfo: A reference to an example table would be useful here.

No transparent background

A pup screen always has a black background, but this can also be transparent (can generate performance issues?). This is a big problem when also the B2S is used, you get blinking in stead of two screens laying on top of each other. When you have the following construction in screens there are two problems:

ScreenNum,ScreenDes,PlayList,PlayFile,Loopit,Active,Priority,CustomPos<br>
2,Backglass,,,0,off,,<br>
11,"Backglass 2",bg,"Movie.mp4",0,ForceOn,,"2,19.5,17,60.9,58.5"

The backglass is turned off, but there is an extra screen 11 with custom position on screen 2 with forceon option. At the moment because in standalone the backglass is turned off everything is not displayed. This is incorrect, because of forceon screen 11 should be shown on a transparent backglass. This is a problem for example in Star Tours and in Tom and Jerry table/puppack combination. This can be fixed to replace off with show for screen 2, but then you have a black background.

Multiple sounds playing

There is a bug in the playstop function. Sometimes, e.g. a background music is playing on a music-only screen, when this function is called the music is not stopped, but keeps playing and when the loop option is set, this plays forever. This can also be the case when there is a stop trigger. If this is called from the script a workaround can be to disable the loop and force to play a sound with zero volume (fix used in Space Cadet Galaxy Edition).

Triggers on screens which are off

A trigger on a screen which is turned off, is sometimes still played. For instance there is a topper screen which is turned off (this has to do with the different display layout you find in puppacks), but the media is still started. Solution is to remove the screens which are turned off and remove the triggers for this screen. But remember a screen can be turned on from the script and then it should not be removed, unless it is a screen which should not be used anyway (e.g. topper) but then also the script code has to be removed.

Conflict vbscript/screens file

Sometimes there is a screens.pup file but the same screens numbers are also created from the script. This gives in standalone a conflict and is handled wrong. The script should overrule the screens.pup. A workaround is to conbine the options from the script in the screens.pup file and remove the script calls.

Triggers skip same priority

In triggers you have the option SkipSamePrty which means that if the new media has the same or lower priority as the currently playing media then the new one is skipped. This is for when there are multiple triggers to determine which one has to play and is the most important. At the moment the problem is in standalone that this should only be done if there is media playing, but in standalone this is also done if there is no media playing. This means you are missing triggers. A workaround is to remove the option, but then you get to many or the wrong one is playing. A better workaround is to play around with the priorities, but this is a lot of try and error. You also have to play the table a lot to test the triggers. I sometimes change the script to trigger the events quicker/more easy.

Label font scaled wrong

Sometimes it works, sometimes it does not. When a text is displayed with LabelSet function on a screen, which has a custom position,width and height, sometimes the font size is wrong. A scaling factor has to be applied. I have not found out yet when it works and when not. Workaround is to apply the font scaling factor (have to calculated by hand) in the script for all the LabelInit calls for this screen.

Label which is an image

At the moment the labelset in standalone only accepts text. But this is not always the case, it can also be an image. For example:

PuPlayer.LabelSet 2,"InfoText","PuPOverlays\\\\info.png",1,"{'mt':2,'color':111111,'width':31,'height':8,'yalign':0,'ypos':0.0,'xpos':50.4 }"

At the moment the image name is displayed and not the image itself. Workaround is to remove the image name from the call to remove the text, but of course you are missing the image.

Label animations

A label can also have animations (e.g. blinking or motion). This is done with a labelset with the option mt:1. This is not supported at the moment and difficult to emulate. For example:

PuPlayer.LabelSet 2,"Service","Blinking text", 1,"{'mt':1,'at':1,'fq':150,'len':1}"

These options are discarded but if the text is totally displayed wrong you have to change mt:1 into mt:2 and you probably have to add options (see mt:2 example above) to correct it. Of course you are missing the animation.

Important files

Pup packs are distributed as directories. Depending on the operating system and the flavour of pinball emulator you have to place them in a specific directory to be activated.

There are usually four main files that set up the PuP-Pack:

Older PuP Packs don't have these files and define this data at runtime in the table script.

Note

Most pup packs come with different .pup files for different screen configurations. Check the .bat files in the root of the pup pack to see what they do. Most of the time it's copying over .pup files from the PuP-Pack_Options/chosen_option directory to the root of the pup pack.

PinUpPlayer.ini

Here's an example PinUpPlayer.ini file:

[INFO]
ScreenXPos=4
ScreenYPos=7
ScreenWidth=500
ScreenHeight=125
volume=100
hidestopped=3
AspectWide=0
AspectHigh=0
fitToWindow=1
ScreenRotation=0
DebugMode=1
VideoDriver=0
FirstRun=0
[INFO1]
ScreenXPos=1400
ScreenYPos=302
ScreenWidth=512
ScreenHeight=128
volume=100
hidestopped=3
AspectWide=0
AspectHigh=0
fitToWindow=1
ScreenRotation=0
DebugMode=1
VideoDriver=0
FirstRun=0
.
.
[INFO10]

In VPX Standalone, these are in the VPinballX.ini:

[Standalone]
PUP<Name>Screen =
PUP<Name>Window =
PUP<Name>WindowX =
PUP<Name>WindowY =
PUP<Name>WindowWidth = 
PUP<Name>WindowHeight =
PUP<Name>WindowRotation =

Since all screens are supported, at this time, only the following can render physical windows:

Name Screen
Topper 0
Backglass 2
DMD 1
Playfield 3
FullDMD 5

If for example you needed to change the Topper to screen 2, you would have the entry:

[Standalone]
PUPTopperScreen = 2

screens.pup

This csv file sets the layout of screens:

ScreenNum,ScreenDes,PlayList,PlayFile,Loopit,Active,Priority,CustomPos
0,Topper,Topper,Topper_Frame1.mp4,0,ForceOn,,
1,DMD,,,0,off,,
2,Backglass,BGDefault,BG_Default1.mp4,0,ForceOn,,
3,PlayField,,,0,off,,
4,Music,,,0,off,,
5,Menu,,,0,off,,
6,Select,,,0,off,,
7,Other1/BackGlass2,,,0,off,,
8,Other2/Topper2,,,0,off,,
9,GameInfo,,,0,off,,
10,GameHelp,,,0,off,,

The headers in the csv do not appear to match the the PuP Pack Editor:

PuP Pack Screens Window

screens.pup PuP Pack Editor
ScreenNum ScreenNum
ScreenDes ScreenDes
PlayList Background Playlist
PlayFile Background Filename
Loopit Transparent
Active Mode
Priority Volume %
CustomPos CustomPos

Question: What are values when the columns are empty? ex, volume% 100 or 0?

playlists.pup

This csv file represents media playlists. Playlists are folders in pupvideos/<rom> directory

ScreenNum,Folder,Des,AlphaSort,RestSeconds,Volume,Priority
0,Topper,,0,30,100,0
0,AttractMode,,0,30,100,0
0,BallDrain,,1,3,100,0
0,BGDefault,,0,30,100,5
0,ExtraBall,,0,30,100,0
0,MultiBall,,0,30,100,0
0,PuPOverlays,,0,30,100,0
0,RandomScoring,,0,30,100,0
0,ShootAgain,,0,30,100,0
0,SkillShot,,1,30,100,0

PuP Pack Playlists Window

playlists.pup PuP Pack Editor
ScreenNum
Folder Folder (Playlist)
Des Description
AlphaSort Randomize
RestSeconds RestSeconds
Volume Volume
Priority Priority

From PinUpPlayerReference.txt:

  • playlists (unlimited) that are really just subfolders of your table root that contain videos.
  • the PinUpPlayer(PUP) will manage playlists and shuffle them
  • RestSeconds is what I use to 'limit' the amount of videos being played. So lets say you want a ramp video to play, but since I set it to 60... you can hit that ramp multiple times but no videos will play until the restSeconds time has passed since last video played.
  • <Sort 1=shuffle, 0 = alpha> So if you want to progress game videos you could name the first one 001.mp4, 002.mp4...099.mp4 That way alpha sort will play in your order.

From PuP-Pack Editor v1.4 Help:

  • AlphaSort: OFF=Random/shuffle, 1= alpha sort
  • Priority (0..10): if another video is playing the one with higher prioirty 'wins'...

Question: What are values when the columns are empty? ex, volume% 100 or 0? Question: Are the files sorted by case sensitivity? ie: alpha1.png, bat1.png, Alpha2.png Note: I think I've seen really priorities way different than 0..10, maybe -1, and 60 (double check so not confusing this with volume, etc)

Update 03-31-2025:

  • Confirmed with @nailbuster that PuP-Pack Editor v1.4 Help is incorrect about AlphaSort. The correct values are: Random=1, AlphaSort=0

triggers.pup

This csv file represents triggers

ID,Active,Descript,Trigger,ScreenNum,PlayList,PlayFile,Volume,Priority,Length,Counter,RestSeconds,Loop,Defaults
2,1,Overlay_Frame,D0,2,PuPOverlays,Metal.png,,,,6,,,0
71,1,Creature1,D1,2,Creature,"Creature Surfacing.mp4",0,3,,,3,,0
4,1,Creature2,D2,2,Creature,"Creature Hand.mp4",0,3,,,3,,0
6,1,Creature3,D3,2,Creature,"Creature Swim2.mp4",0,3,,,3,,0
9,1,"Creature Feature",D4,2,"Creature_Creature Feature",,0,3,,,3,,0
10,1,"Creature Targets",D5,2,Creature,,0,3,,,3,,0
11,1,"Monster Torso",D6,2,Monster_Torso,,0,2,,,3,,0

PuP Pack Triggers Window

triggers.pup PuP Pack Editor
ID
Active Active
Descript Descript
Trigger Trigger
ScreenNum Screen
PlayList Playlist
PlayFile PlayFile
Volume Volume
Priority Priority
Counter Counter
RestSeconds RestSeconds
Loop PlayAction
Defaults

From PinUpPlayerReference.txt:

  • priority(0=none, 1..9) will override the restSeconds....so for a drain or something similar
  • if filename="" then will play next file in playlist (don't have to specify filename, only playlist).

From PuP-Pack Editor v1.4 Help:

  • Trigger example separate by ',' commas (unlimited triggers, but max 5 checks/trigger)
  • if you don't put = then assumes '1'
  • do *NOT use leading zeros like S04=1, its S4=1
  • Counter=20 means it will 'FIRE' video every 20 triggers.
  • loop will loop video until a new video is displayed.
  • restseconds: will not repeat trigger until restseconds have passed. if you leave blank then will use playlist default.

Question: Does Counter 'FIRE' the very first time? or does it wait for 20 triggers? does restseconds factor into counter?

Scripting API

Virtual pinball tables also interact with the PuP-Pack player in their script. All examples below use VBScript which is the scripting language in use by Visual Pinball.

Dim PuPlayer
Set PuPlayer = CreateObject("PinUpPlayer.PinDisplay")

PuPlayer.LabelNew pBackglass,"Play2score",numberfont,	5,0  ,0,0,1,55,85,1,0

PuPlayer.B2SData "E"&EventNum,1  'send event to Pup-Pack
...

Important

Thanks to @NailBuster himself for providing us with the latest PUPDMD framework documentation for v1.5 and allowing it inclusion on the wiki. "v1.4 is the older framework that is a bit different as well for older pupdmds)"

Earlier documentation for the various message types is provided in the subsections that follow.

LabelNew

TODO

PlayAction

All trigger PlayAction types are documented on Nailbuster's wiki

SendMSG

Note

NailBuster thinks nobody should be using these calls directly. However, " many of the PuPDMD authors find it easy enough to just directly use the custom msg/json manually so you'll see them scattered around their table code as well." Some of these are implemented in Visual Pinball Standalone.

Example:

PuPlayer.SendMSG "{ 'mt':301, 'SN': 2, 'FN':15, 'CP':'99,15,15,70,70' }"  'custompos

JSON body but extended where properties can also be quoted with single quotes.

  • MT = ??? (always 301?)
  • SN = screen number (see screens.pup orAddScreen in script)
  • FN = function

Functions:

  • 2 - ???
    Sub pDisableLoopRefresh(PuPID)
       PuPlayer.SendMSG "{ ""mt"":301, ""SN"": "&PuPID& ", ""FN"": 2, ""FF"":0, ""FO"":0 }"   
    end Sub  
  • 3 - hide/show overlay text - { "mt":301, "SN": XX, "FN":3, "OT": 0 } - OT 0/1 overlay text on off bool
    sub pAllVisible(lvis)   '0/1 to show hide pup text overlay and HUD
      PuPlayer.SendMSG "{ ""mt"":301, ""SN"": "& "5"& ",""OT"":"&lvis&", ""FN"": 3 }"             'hideoverlay text force
    end Sub
  • 4 - set StayOnTop - { "mt":301, "SN": XX, "FN":4, "FS":1/0 }
  • 6 - bring screen to front { "mt":301, "SN": XX, "FN":6 }
  • 10 - set ??? volume { "mt":301, "SN": XX, "FN":10, "VL":9} VL=volume level
  • 11 - set screen sound volume 0-100 "{ ""mt"":301, ""SN"": "&pMusic&", ""FN"":11, ""VL"":"&VolMusic&" }"
  • 12 - STOPSCREEN {screenNum=18, screenDes=Apron Right, mode=PUP_SCREEN_MODE_FORCE_BACK}, fn=12, szMsg={ "mt":301, "SN": 18, "FN":12 }
  • 15 - set screen custom position (relative positions in %) { 'mt':301, 'SN':15,'FN':15,'CP':'5,0,0,100,100'} ' show screen { 'mt':301, 'SN':15,'FN':15,'CP':'5,0,0,0,0'} ' Hide the screen
  • 16 - launch executable - WT: Window Title { ""mt"":301, ""SN"": 2, ""FN"":16, ""EX"": """&PuPMiniGameExe &""", ""WT"": """&PuPMiniGameTitle&""", ""RS"":1 , ""TO"":15 , ""WZ"":0 , ""SH"": 1 , ""FT"":""Visual Pinball Player"" } { ""mt"":301, ""SN"": 2, ""FN"":16, ""EX"": ""Pupinit.bat"", ""WT"": """", ""RS"":1 , ""TO"":15 , ""WZ"":0 , ""SH"": 1 , ""FT"":""Visual Pinball Player"" }
  • 17 { ""mt"":301, ""SN"": ""2"", ""FN"":17, ""WT"":""Visual Pinball Player"", ""WZ"": 1, ""WP"": 1 } - WT: Window Title / WZ: HWND_BOTTOM=1 / WP: SWP_NOSIZE=1
    Sub pResynchLayers()	' For desktop users this will force VPX to the back so pup is in front (Disabled since David has cut through working now)
    	exit sub 
    	if bDesktop then
    		' WT: Window Title 
    		' WZ: HWND_BOTTOM=1
    		' WP: SWP_NOSIZE=1
    		PuPlayer.SendMSG "{ ""mt"":301, ""SN"": ""2"", ""FN"":17, ""WT"":""Visual Pinball Player"", ""WZ"": 1, ""WP"": 1 }"
    	End if 
    End Sub
  • 20 - { "mt":301, "SN"": XX, "FN":20, "AM": 1, "AV": 170 } also related to transparency?
  • 22 - set transparency PuPlayer.SendMSG "{ ""mt"":301, ""SN"": " & pTransp &", ""FN"":22, ""AM"":1, ""AV"":255 }" ' make opaque PuPlayer.SendMSG "{ ""mt"":301, ""SN"": " & pTransp &", ""FN"":22, ""AM"":1, ""AV"":80 }" ' Make Transparent
  • 30 - PUPDisplayAsJukebox - {'mt':301, 'SN': XX, 'FN':30, 'PM':1 }
    'jukebox mode will auto advance to next media in playlist and you can use next/prior sub to manuall advance
    'you should really have a specific pupid# display like musictrack that is only used for the playlist
    'sub PUPDisplayAsJukebox(pupid) needs to be called/set prior to sending your first media to that pupdisplay.
    'pupid=pupdiplay# like pMusic
    Sub PUPDisplayAsJukebox(pupid)
    	PuPlayer.SendMSG("{'mt':301, 'SN': " & pupid & ", 'FN':30, 'PM':1 }")
    End Sub
  • 31 - pup jukebox control - {'mt':301, 'SN': XX, 'FN':31, 'PM':1 } - PM 1 = next, PM 2 = previous
    Sub PuPlayListPrior(pupid)
      PuPlayer.SendMSG("{'mt':301, 'SN': " & pupid & ", 'FN':31, 'PM':1 }")
    End Sub
    
    Sub PuPlayListNext(pupid)
      PuPlayer.SendMSG("{'mt':301, 'SN': " & pupid & ", 'FN':31, 'PM':2 }")
    End Sub
  • 32 - no antialias on font render { "mt":301, "SN": 1, "FN":32, "FQ":3 } FQ - font quality (3 = no aa?)
  • 33 - set pupdmd for mirror and hide behind other pups??? "{ "mt":301, "SN": XX, "FN":33 }
  • 34 - hideoverlay text during next videoplay on DMD auto return??? { "mt":301, "SN": XX, "FN": 34 }
  • 41 - set safeloop mode on current playing media - { "mt":301, "SN": XX, "FN":41 }
    'set safeloop mode on current playing media.  Good for background videos that refresh often?  { "mt":301, "SN": XX, "FN":41 }
    Sub pSafeLoopModeCurrentVideo(PuPID)
       PuPlayer.SendMSG "{ ""mt"":301, ""SN"": "&PuPID& ", ""FN"": 41 }"
    end Sub
  • 42 - duck audio volume - { "mt":301, "SN": XX, "FN": 42, "DV": duck_volume , "ALL":1 } ALL 1 = optional
    Sub AudioDuckPuP(MasterPuPID,VolLevel)  
      'will temporary volume duck all pups (not masterid) till masterid currently playing video ends.  will auto-return all pups to normal.
      'VolLevel is number,  0 to mute 99 for 99%  
      PuPlayer.SendMSG "{ ""mt"":301, ""SN"": "& MasterPuPID& ", ""FN"": 42, ""DV"": "&VolLevel&" }"             
    end Sub
    
    Sub AudioDuckPuPAll(MasterPuPID,VolLevel)  
      'will temporary volume duck all pups (not masterid) till masterid currently playing video ends.  will auto-return all pups to normal.
      'VolLevel is number,  0 to mute 99 for 99%  
      PuPlayer.SendMSG "{ ""mt"":301, ""SN"": "& MasterPuPID& ", ""FN"": 42, ""DV"": "&VolLevel&" , ""ALL"":1 }"             
    end Sub
  • 45 - slow pc mode { "mt":301, "SN":XX, "FN":45, "SP":1 } - SP 0/1 = slow pc mode bool
    Sub pSetLowQualityPc  'sets fulldmd to run in lower quality mode (slowpc mode)  AAlevel for text is removed and other performance/quality items.  default is always run quality, 
       PuPlayer.SendMSG "{ ""mt"":301, ""SN"": 5, ""FN"":45, ""SP"":1 }"    'slow pc mode
    end Sub
  • 46 - pad all text { "mt":301, "SN": XX, "FN":46, "PA":1 } - PA 0/1 = padd text bool
    Sub pDMDAlwaysPAD  'will pad all text with a space before and after to help with possible text clipping.
       PuPlayer.SendMSG "{ ""mt"":301, ""SN"": XX, ""FN"":46, ""PA"":1 }"    'slow pc mode
    end Sub
  • 50 - set aspect ratio { "mt":301, ""SN": XX, "FN": 50, "WIDTH": arWidth, "HEIGHT": arHeight }
    Sub pSetAspectRatio(PuPID, arWidth, arHeight)
       PuPlayer.SendMSG "{ ""mt"":301, ""SN"": "&PuPID& ", ""FN"": 50, ""WIDTH"": "&arWidth&", ""HEIGHT"": "&arHeight&" }"
    end Sub
  • 51 - set media play position in ms { "mt":301, "SN": XX, "FN":51, "SP": 3431} - SP position in ms
    Sub pSetVideoPosMS(mPOS)  'set position of video/audio in ms,  must be playing already or will be ignored.  { "mt":301, "SN": XX, "FN":51, "SP": 3431} 
      PuPlayer.SendMSG "{ ""mt"":301, ""SN"": "& "5"& ", ""FN"": 51, ""SP"":"&mPOS&" }"
    end Sub
  • 52 - set text quality, anti aliassing (similar to 32?) - { "mt":301, "SN": XX, "FN":52, "SC": aa_level } SC 0-4 from low to high
    Sub pDMDSetTextQuality(AALevel)  '0 to 4 aa.  4 is sloooooower.  default 1,  perhaps use 2-3 if small desktop view.  only affect text quality.  can set per label too with 'qual' settings.
       PuPlayer.SendMSG "{ ""mt"":301, ""SN"": 5, ""FN"":52, ""SC"": "& AALevel &" }"    'slow pc mode
    end Sub
  • 53 experimental frame rescale -
    Sub pForceFrameRescale(PuPID, fWidth, fHeight)   'Experimental,  FORCE higher frame size to autosize and rescale nicer,  like AA and auto-fit.
         PuPlayer.SendMSG "{ ""mt"":301, ""SN"": "&PuPID& ", ""FN"": 53, ""XW"": "&fWidth&", ""YH"": "&fHeight&", ""FR"":1 }"   
    end Sub  
⚠️ **GitHub.com Fallback** ⚠️