├── .github └── FUNDING.yml ├── ACTIONS.md ├── CONFIGURATION.md ├── ChangeLog.md ├── EVENTS.md ├── EXAMPLES.md ├── FEEDBACKS.md ├── FILES.md ├── LICENSE ├── PRESENTATION.md ├── README.md ├── TROUBLESHOOTING.md ├── add-in.md ├── assets ├── companion-window.png ├── connection_examples │ ├── broadcast.png │ ├── connnection_examples.pptx │ ├── connnection_examples │ │ ├── Slide1.PNG │ │ ├── Slide2.PNG │ │ └── Slide3.PNG │ ├── one_machine.png │ ├── three_machines.png │ ├── two_machines.png │ └── two_machines_b.png ├── kofi_s_tag_dark_sm.png ├── notes_trigger.png ├── oscpoint-icon-64.png ├── oscpoint-icon-72-padded-whitebg.png ├── oscpoint-icon-72-padded.png ├── oscpoint-icon-72.png ├── oscpoint-icon-padded-v2.png ├── oscpoint-icon-padded-v3.png ├── oscpoint-icon-padded-v4.png ├── oscpoint-icon.png ├── oscpoint-icon.psd ├── oscpoint-icon.svg ├── oscpoint-logo-editable.svg ├── oscpoint-logo-small.png ├── oscpoint-logo-white-bg.png ├── oscpoint-logo.png ├── oscpoint-logo.svg ├── powered-by.psd ├── releases.png ├── ribbon.png ├── sticker v2.png ├── sticker.psd ├── streamdeck-flat.png ├── streamdeck.png ├── version-check.png └── zip-download.png ├── companion-module.md └── privacy.md /.github/FUNDING.yml: -------------------------------------------------------------------------------- 1 | # These are supported funding model platforms 2 | 3 | github: # Replace with up to 4 GitHub Sponsors-enabled usernames e.g., [user1, user2] 4 | patreon: # Replace with a single Patreon username 5 | open_collective: # Replace with a single Open Collective username 6 | ko_fi: nickrobertsuk # Replace with a single Ko-fi username 7 | tidelift: # Replace with a single Tidelift platform-name/package-name e.g., npm/babel 8 | community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry 9 | liberapay: # Replace with a single Liberapay username 10 | issuehunt: # Replace with a single IssueHunt username 11 | otechie: # Replace with a single Otechie username 12 | lfx_crowdfunding: # Replace with a single LFX Crowdfunding project-name e.g., cloud-foundry 13 | custom: # Replace with up to 4 custom sponsorship URLs e.g., ['link1', 'link2'] 14 | -------------------------------------------------------------------------------- /ACTIONS.md: -------------------------------------------------------------------------------- 1 | # OSCPoint actions 2 | 3 | OSC actions are messages you can send to OSCPoint to control PowerPoint. These must be sent as properly formatted OSC messages and transmitted via UDP. 4 | 5 | OSC bundles are supported, but have not been extensively tested. 6 | 7 | > [!NOTE] 8 | > OSC string arguments only support ASCII characters - so as of v3.0.0 it's possible to send UTF-8 strings as encoded binary blobs. 9 | > When OSCPoint receives a message it'll detect the type of argument being sent, and any binary blob data will be assumed to be UTF-8 encoded text. 10 | > 11 | > Send either a string or a blob - not both! 12 | 13 | ## Slide control 14 | 15 | - `/oscpoint/next` 16 | Go to next slide (or next slide build) in active slide show. 17 | 18 | - `/oscpoint/previous` 19 | Go to previous slide (or back one slide build) in active slide show. 20 | 21 | - `/oscpoint/goto/slide [integer: n]` 22 | Goto to slide *n*. Will default to first or last slide in *n* is out-of-range. 23 | 24 | - `/oscpoint/goto/slide/first` 25 | Goto to first slide in active slide show. 26 | *Note: This will go to the first slide in the presentation even if it's hidden. See [this issue](https://github.com/phuvf/oscpoint/issues/1#issue-1968312581) for details.* 27 | 28 | - `/oscpoint/goto/slide/last` 29 | Goto to last slide in active slide show. 30 | *Note: This will go to the last slide in the presentation even if it's hidden. See [this issue](https://github.com/phuvf/oscpoint/issues/1#issue-1968312581) for details.* 31 | 32 | - `/oscpoint/goto/section [string: sectionName ASCII] OR [blob: sectionName UTF-8]` 33 | Goto to first slide in section *sectionName*. Will do nothing if *sectionName* is not found. 34 | *Note: sectionName is case sensitive. UTF-8 support requires v2.1.x+* 35 | 36 | - `/oscpoint/slide/hide [integer: n]` 37 | Hide slide *n*. Will do nothing if *n* is out-of-range. 38 | *Note: Hiding slides while in slide show mode seems to work fine when clicking forward, but they may still be shown if the user clicks back.* 39 | 40 | - `/oscpoint/slide/unhide [integer: n]` 41 | Unhide slide *n*. Will do nothing if *n* is out-of-range. 42 | 43 | ## Slide show control 44 | 45 | - `/oscpoint/slideshow/start` 46 | Start slideshow from top (slide 1), based on active (focused) window. 47 | 48 | > [!NOTE] 49 | > As of v2.0.0 an optional integer can be added to start from a specific slide - for example `/oscpoint/slideshow/start [Integer: 5]` to start at slide 5. 50 | 51 | - `/oscpoint/slideshow/end` 52 | End active slide show. 53 | 54 | - `/oscpoint/slideshow/start/current` 55 | Start slideshow from current slide, based on active (focused) window. 56 | 57 | - `/oscpoint/slideshow/start/section [string: sectionName ASCII] OR [blob: sectionName UTF-8]` 58 | Start slideshow from first slide in section *sectionName*. Will do nothing if *sectionName* is not found. 59 | 60 | > [!NOTE] 61 | > If you're not starting a slideshow from the top of the deck, you may see a flash of slide 1 before the correct slide is shown. 62 | > This is a limitation of the PowerPoint object model - set slide 1 to be black to hide this, if necessary. 63 | 64 | - `/oscpoint/slideshow/black [optional integer: n]` 65 | Sets black screen overlay. *n* = 1 black on, *n* = 0 black off. If no integer is provided, black screen will toggle. 66 | 67 | - `/oscpoint/slideshow/white [optional integer: n]` 68 | Sets white screen overlay. *n* = 1 white on, *n* = 0 white off. If no integer is provided, white screen will toggle. 69 | 70 | - `/oscpoint/slideshow/laserpointer [optional integer: n]` 71 | Turns on/off virtual laser pointer. *n* = 1 laser on, *n* = 0 laser off. If no integer is provided, laser will toggle. 72 | 73 | - `/oscpoint/slideshow/setwallpaper [optional integer: width px] [optional integer: height px]`  74 | Sets the current slide as the desktop wallpaper. 75 | - Exports current slide to temporary folder at resolution `width` x `height` px. Will default to 1920x1080 if no width and height are provided. 76 | - Sets exported image as fill-style wallpaper for all monitors on machine. 77 | 78 | - `/oscpoint/slideshow/pause`  79 | Pause slide show timed auto-advance 80 | 81 | - `/oscpoint/slideshow/resume`  82 | Resume slide show auto-advance 83 | 84 | ## Media control 85 | 86 | *Due to the way PowerPoint handles media, these actions will only work if you're in slideshow mode and there's a single media element on the current slide.* 87 | 88 | - `/oscpoint/media/play` 89 | - `/oscpoint/media/pause` 90 | - `/oscpoint/media/playpause` 91 | Will toggle between play and pause states. 92 | 93 | - `/oscpoint/media/stop` 94 | Stops playback and sets playhead to start of media 95 | 96 | - `/oscpoint/media/goto/position/fromstart [integer: n]` 97 | Move playhead to position *n* milliseconds from start point of clip. 98 | 99 | - `/oscpoint/media/goto/position/beforeend [integer: n]` 100 | Move playhead to position *n* milliseconds before end point of clip. 101 | 102 | - `/oscpoint/media/goto/position/forward [integer: n]` 103 | Move playhead forward *n* milliseconds from current position. 104 | 105 | - `/oscpoint/media/goto/position/back [integer: n]` 106 | Move playhead backward *n* milliseconds from current position. 107 | 108 | - `/oscpoint/media/goto/position/percent [float: f]` 109 | Move playhead to position *f* percent from start point of clip. 110 | 111 | - `/oscpoint/media/goto/bookmark/next` 112 | Move playhead to next bookmark. 113 | 114 | - `/oscpoint/media/goto/bookmark/previous` 115 | Move playhead to previous bookmark 116 | 117 | ## File control 118 | 119 | > [!NOTE] 120 | > The *Allow file system access* setting must be enabled in the OSCPoint tab on settings for these actions to work. 121 | > For security reasons, this can only be enabled locally on the PowerPoint machine. 122 | 123 | - `/oscpoint/files/setpath [string: path ASCII] OR [blob: path UTF-8]`  124 | Set active folder to *path*, relative to user folder. For example, setting the active folder to `Desktop\myfolder\oscpoint` will mean OSCPoint will look for PowerPoint presentations in `C:\Users\[USERNAME]\Desktop\myfolder\oscpoint`. 125 | If this folder does not exist, it will be created. 126 | *Note: UTF-8 support requires v2.1.x+* 127 | 128 | - `/oscpoint/files/list`  129 | Prompt OSCPoint to return a `/oscpoint/v2/files` message with details of files in active folder 130 | 131 | - `/oscpoint/files/open [string: filename ASCII] OR [blob: filename UTF-8]`  132 | Open file (in active folder) with name *filename*. Only files ending in `.ppt` and `.pptx` are supported. Will switch to open presentation if file is already open. 133 | *Note: UTF-8 support requires v2.1.x+* 134 | 135 | - `/oscpoint/presentations/activate [string: filename ASCII] OR [blob: filename UTF-8]`  136 | Switch to open presentation with name *filename*. If file is not open, will do nothing. Note that this action does not require file access permissions, unlike the `/oscpoint/files/open` action. 137 | *Note: UTF-8 support requires v2.1.x+* 138 | 139 | ### Closing a file 140 | 141 | When closing a file with unsaved changes, a decision needs to be made as to what action to take. 142 | 143 | > [!WARNING] 144 | > The `/oscpoint/files/close` group of actions can overwrite files and/or lose unsaved file edits without warning. Use with caution. 145 | 146 | - `/oscpoint/files/close [optional string: filename ASCII] OR [optional blob: filename UTF-8]`  147 | Close open presentation *filename*, or the active presentation if no filename specified. 148 | Action when file has unsaved changes: **abort** - action will cancel and file will not close. It is not generally advise to use this method - see note below for more details. 149 | *Note: UTF-8 support requires v2.1.x+* 150 | 151 | - `/oscpoint/files/close/force [optional string: filename ASCII] OR [optional blob: filename UTF-8]`  152 | Close open presentation *filename*, or the active presentation if no filename specified. 153 | Action when file has unsaved changes: **force close** - unsaved changes are discarded and file is closed. 154 | *Note: UTF-8 support requires v2.1.x+* 155 | 156 | - `/oscpoint/files/close/save [optional string: filename ASCII] OR [optional blob: filename UTF-8]`  157 | Close open presentation *filename*, or the active presentation if no filename specified. 158 | Action when file has unsaved changes: **save and close** - unsaved changes are saved and file is closed. This will overwrite the existing file. 159 | *Note: UTF-8 support requires v2.1.x+* 160 | 161 | >[!NOTE] 162 | > Due to the way OSCPoint calculates the starting slide information, starting a slide show will cause the file to be maked as unsaved. 163 | 164 | 165 | ## System control 166 | 167 | Most of these actions adjust settings that can also be configured using the **OSCPoint** tab on the ribbon in PowerPoint. 168 | 169 | - `/oscpoint/actions/enable` 170 | Enable OSC actions. 171 | 172 | - `/oscpoint/actions/disable` 173 | Disable OSC actions. All messages (except `/oscpoint/actions/enable`) will be ignored. 174 | 175 | - `/oscpoint/feedbacks/enable` 176 | Enable OSC feedbacks. 177 | Will also trigger a refresh of all feedbacks. 178 | 179 | - `/oscpoint/feedbacks/disable` 180 | Disable OSC feedbacks. 181 | 182 | - `/oscpoint/feedbacks/refresh` 183 | Resend the most recent feedback values. 184 | -------------------------------------------------------------------------------- /CONFIGURATION.md: -------------------------------------------------------------------------------- 1 | # OSCPoint - Configuration examples 2 | 3 | > Note: These examples are based on the assumption that you are running Companion to control OSCPoint - but any tool that can receive/output OSC can be used. 4 | 5 | - For details on how to change these setting in OSCPoint, see the [add-in documentation](add-in.md). 6 | - For details on how to setup Companion, see the [Companion documentation](https://bitfocus.io/companion/). 7 | 8 | ## One machine running both Companion and PowerPoint 9 | 10 | In this configuration, the both the Companion service and OSCPoint are running on the same machine, and they talk to each other via the localhost network address of `127.0.0.1` 11 | 12 |  13 | 14 | ## One Companion machine, one PowerPoint machine 15 | 16 | In this configuration, the Companion service is running on one machine, and OSCPoint is running on another. The two machines are connected via a network. 17 | 18 |  19 | 20 | ## One Companion machine, two PowerPoint machines 21 | 22 | In this configuration, the Companion service is running on one machine, and OSCPoint is running on two machines. The machines are connected via a network. 23 | 24 | Companion has two OSCPoint connections running. To get feedback from both machines, the feedback port needs to be changed on the second machine. 25 | 26 |  27 | 28 | > [!NOTE] 29 | > Using three or more machines? Just keep adding connections in Companion and make sure each machine is set to a different feedback port. 30 | 31 | ## One combined Companion & PowerPoint machine, plus one extra PowerPoint machine 32 | 33 | In this configuration, one machine is running Companion, OSCPoint and PowerPoint, and another machine is running PowerPoint & OSCPoint. The machines are connected via a network. 34 | 35 |  36 | 37 | ## Broadcasting feedback to multiple machines 38 | 39 | In this configuration, multiple machines on the same network are receiving feedback from OSCPoint, by sending OSC messages to the broadcast address - in this case `192.168.0.255`. 40 | 41 | Calculate the broadcast address for your network using the [broadcast address calculator](https://remotemonitoringsystems.ca/broadcast.php). 42 | 43 |  -------------------------------------------------------------------------------- /ChangeLog.md: -------------------------------------------------------------------------------- 1 | # OSCPoint Change log 2 | 3 | ## 2.1.0.0 4 | 5 | - Better setting persistance when upgrading 6 | - More UTF-8 support 7 | - Better section handling 8 | - Ability to pause/resume auto-advancing slide show 9 | - Support for media start/end points 10 | - Better reporting/handling of hidden slides 11 | 12 | ## 2.0.2.0 13 | 14 | - Added UTF8 support for notes 15 | 16 | ## 2.0.1.0 17 | 18 | - First beta release of OSCPoint v2 19 | 20 | ## 2.0.0.2 21 | 22 | Released 2024-06-04 23 | 24 | - Fixed small bug causing section name mis-reporting 25 | 26 | ## 2.0.0.1 27 | 28 | Released 2024-06-01 29 | 30 | ### System changes 31 | 32 | 33 | - Changed slide show start logic and internal object model calls to improve performance/avoid flash of slide 1 when starting slide show 34 | - Added file handling system so presentations can be opened/closed on remote machine - see [FILES.md](FILES.md) for details 35 | - Added file access toggle to OSCPoint tab to enable/disable file access. For security reasons, this is off by default. 36 | - OSC messages are now queued and sent as bundles every c.200ms to avoid duplicate and out-of-order messages 37 | 38 | > [!NOTE] 39 | > Notes feedback is not bundled - it is sent immediately as it can be a large amount of data that might not survive bundling. 40 | 41 | ### Actions 42 | 43 | 44 | - Added ability to start slide show from any slide number using `/oscpoint/slideshow/start [Integer: 5]` 45 | - Added `/oscpoint/slideshow/setwallpaper [optional integer: width px] [optional integer: height px]` command 46 | - Added `setpath`, `list`, `open` and `close` actions for file handling at `/oscpoint/files/[action]` 47 | - Added `activate` action to switch presentations without needing file access permissions 48 | 49 | ### Feedbacks 50 | 51 | - Added `/oscpoint/v2/event` feedback to allow direct hooking of PowerPoint events. These are not bundled and are sent immediately. 52 | - Added `/oscpoint/v2/presentations` feedback with JSON array of all open presentations 53 | - Added `/oscpoint/v2/presentation` feedback with JSON object of the active presentation 54 | 55 | > [!NOTE] 56 | > The JSON presentation object now includes detail of the presentation itself & slide counts , as well as full details of the sections within the presentation. See [PRESENTATION.md](PRESENTATION.md) for an example JSON object. 57 | 58 | ## 1.0.1.1 59 | 60 | Released 2023-11-05 61 | 62 | - Added `/oscpoint/actions/[enable | disable]` and `/oscpoint/feedbacks/[enable | disable]` actions 63 | - Reworked ribbon tab to suit 64 | - Better user input checking for port and host settings 65 | 66 | ## 1.0.1.0 67 | 68 | Released 2023-11-03 69 | 70 | > [!WARNING] 71 | > Includes breaking change to media position actions 72 | 73 | - Reworked media position actions to avoid negative integer issues 74 | - Added %age position action 75 | 76 | 77 | ## 1.0.0.7 78 | - Better data resetting on slide show end 79 | - Better media object handling 80 | 81 | ## 1.0.0.6 82 | 83 | - Better media object handling 84 | - Better feedback resetting at end of slide show 85 | 86 | ## 1.0.0.5 87 | 88 | - Fixed issue where having no named sections in show file caused feedbacks to break 89 | 90 | ## 1.0.0.2 91 | 92 | - Added logging tools 93 | - Fixed issue where current slide was not being set correctly 94 | 95 | ## 1.0.0.1 96 | 97 | - Started change log 98 | - Added `laserpointer` action 99 | - Removed internal `validActions` checking as no longer required 100 | - Capped length of returned notes string to 32,000 characters 101 | - Added argument type checking to OSC actions 102 | - Added *About* dialog to ribbon so version checking possible. 103 | 104 | 105 | ## 1.0.0.0 106 | 107 | Released 2023-10-30 108 | 109 | - Initial release 110 | -------------------------------------------------------------------------------- /EVENTS.md: -------------------------------------------------------------------------------- 1 | # OSCPoint event feedback 2 | 3 | As of OSCPoint v2.x, selected individual events in PowerPoint are sent as OSC messages. 4 | 5 | To received these, feedback needs to be enabled in the OSCPoint add-in settings. 6 | 7 | - `/oscpoint/v2/event [string: eventType] [args]` 8 | Emitted any time an internal event fires in PowerPoint. 9 | 10 | > [!NOTE] 11 | > UTF-8 strings are sent as blobs and will need to be converted back to text to be readable. 12 | 13 | 14 | Possible `eventTypes` and associated `args` are: 15 | 16 | | Event Name | Arguments | Description | 17 | |-------------------------|-----------------------------------------------------|-------------------------------------------------------------------------------------------------| 18 | | `add_in_startup` | `Add-in version` | - | 19 | | `presentation_open` | `Filename ASCII`, `Filename UTF-8` | - | 20 | | `presentation_close` | `Filename ASCII`, `Filename UTF-8` | - | 21 | | `window_activate` | `Filename ASCII`, `Filename UTF-8` | Occurs when the application window or any document window is activated. | 22 | | `slideshow_next_slide` | `Slide number`, `Click index`, `Click count` | Occurs immediately before the transition to the next slide. For the first slide, occurs immediately after the SlideShowBegin event. | 23 | | `slideshow_on_next` | `Slide number`, `Click index`, `Click count` | Occurs when the user clicks Next to move within the current slide. | 24 | | `slideshow_next_click` | `Slide number`, `Click index`, `Click count` | Occurs on the next click of the slide. | 25 | | `slideshow_next_build` | `Slide number`, `Click index`, `Click count` | Occurs upon mouse-click or timing animation, but before the animated object becomes visible. | 26 | | `slideshow_begin` | `Filename ASCII`, `Filename UTF-8`, `Slide number` | Occurs when a slide show starts. | 27 | | `slideshow_end` | `Filename ASCII`,`Filename UTF-8` | Occurs when a slide show ends. 28 | -------------------------------------------------------------------------------- /EXAMPLES.md: -------------------------------------------------------------------------------- 1 | # OSCPoint usage examples 2 | 3 | This page contains some examples of how to use the OSCPoint library. 4 | 5 | ## Using OSCPoint, Companion and vMix to display live notes 6 | 7 | > **Want to display live notes but not using vMix?** 8 | > 9 | > For live events, I recommend you look at [dNotes from IrisDown](https://www.irisdown.co.uk/), which supports auto-text sizing, countdown clocks and main-backup switching. 10 | > 11 | > For virtual events consider [OctoCue](https://octocue.com), which will share live notes to your presenter's phone. 12 | 13 | vMix can be used to display live slide notes by using a title input, and then sending notes text to that input via the vMix API. 14 | 15 | To do this you'll need 16 | 17 | - A vMix show file with a title input. This input will need least one text field - this is where we'll place the notes text to display. 18 | - A Companion instance with the vMix and the OSCPoint modules enabled 19 | - A copy of PowerPoint running the OSCPoint add-in, and a presentation with notes 20 | 21 | ### Basic workflow 22 | 23 | The basic workflow within Companion is: 24 | 25 | 1. For every slide change, the OSCPoint module will update the variable `$(OSCPoint:notes)` 26 | 2. We'll setup a trigger in Companion to watch for changes to that variable. 27 | 3. When the trigger fires, we'll need to rework the variable a bit fix the line breaks, then send the contents of the variable to vMix via the API. 28 | 29 | ### Handling line breaks 30 | 31 | The main issue we have to solve here is that OSCPoint uses carriage return line breaks (variously `CR`, `\r` or `%0d`). vMix, however, uses line feed line breaks (`LF`, `\n` or `%0a`). 32 | 33 | To convert between the two you can use a custom variable in Companion - this will store a vMix-friendly version of the notes. I've called this `vmix_notes`, but you can use an name you like. 34 | 35 | ### Handling slide changes 36 | 37 | Now we need to plumb everything together: 38 | 39 | 1. Setup a new trigger. This will need to listen to the `On variable change` event, and watch the `$(OSCPoint:notes)` variable. 40 | 2. Add your first action to the trigger - this will update the `$(internal:vmix_notes)` variable and change out the `CR` for `LF`s. The action should look like this: 41 | - Action: `internal: Custom Variable: Set with expression` 42 | - Custom variable: `A custom variable (vmix_notes)` 43 | - Expression: `replaceAll($(OSCPoint:notes), "\r","%0a")` 44 | 3. Add your second action to the trigger - this will send the contents of the `$(internal:custom_vmix_notes)` variable to vMix. The action should look like this: 45 | - Action: `vmix: Title - Adjust title text` 46 | - Input: `[title input name, number or GUID]` 47 | - Layer: `[layer order number for text box in title (0-based)]` 48 | - Adjustment: `Set` 49 | - Text: `$(internal:custom_vmix_notes)` 50 | 51 | *In the screenshot below I've also added a small delay to the second action - not sure if this is 100% needed - let me know how you get on!* 52 | 53 |  54 | _Screenshot shows the trigger setup in Companion_ 55 | 56 | ### Further actions and ideas 57 | 58 | There's currently no way (that I know of) to adjust text size via the vMix API. This means that if you have a lot of text in your notes, it may overflow the text box. You can get around this by using a second title input with a smaller, and then switching between the two inputs as needed. 59 | 60 | > richardgatarski has written with some ideas on this - check https://github.com/phuvf/oscpoint/issues/54 for details 61 | 62 | This could be automated by looking at the length of the notes text, and switching to the smaller input if it's over a certain length. 63 | 64 | Ultimately, at some point it'd be better to use IrisDown's [dNotes](https://www.irisdown.co.uk/) software to display notes as this handles font-sizing much better. 65 | -------------------------------------------------------------------------------- /FEEDBACKS.md: -------------------------------------------------------------------------------- 1 | # OSC Feedbacks 2 | 3 | Feedbacks are the messages OSCPoint sends to your OSC client to tell you about the current state of PowerPoint. They are sent out of OSCPoint as OSC messages via UDP. 4 | 5 | > [!NOTE] 6 | > 7 | > Feedbacks starting with `/oscpoint/v2/` are new in version 2.x of OSCPoint. UTF-8 support requires v2.1.x. 8 | 9 | ## Valid at any time 10 | 11 | - `/oscpoint/v2/event [string: eventType] [args]` 12 | See [EVENTS.md](EVENTS.md) for a full list of events and arguments from this message. 13 | 14 | - `/oscpoint/v2/presentations [string: JSON array of presentation objects]` 15 | List of all presentations currently open in PowerPoint. Includes the name, path, slide count, and whether the presentation is saved and in slide show mode. Also includes a full list of the individual sections that make up the presentation. 16 | For an example of the JSON structure, see [PRESENTATION.md](PRESENTATION.md). 17 | 18 | - `/oscpoint/v2/presentation [string: JSON presentation object ASCII] [blob: JSON presentation object UTF-8]` 19 | The current presentation object. Includes the name, path, slide count, and whether the presentation is saved and in slide show mode. Also includes a full list of the individual sections that make up the presentation. 20 | If no presentation is open, this message include a blank presentation object: 21 | ```json 22 | {"name":"","path":"","slideCount":0,"saved":false,"active":false,"slideshow":false,"sections":null} 23 | ``` 24 | - `/oscpoint/v2/files/enabled [boolean]` 25 | Reports whether OSCPoint has permission to access the file system of the PowerPoint machine. This can only be enabled via the OSCPoint ribbon in PowerPoint. 26 | 27 | - `/oscpoint/v2/files/activefolder [string: path ASCII] [blob: path UTF-8]` 28 | The path to the OSCPoint folder, relative to the user's home directory. For more details about this feature, see [FILES.md](FILES.md). 29 | 30 | - `/oscpoint/v2/files/activefolder/fullpath [string: path ASCII] [blob: path UTF-8]` 31 | The full path to the OSCPoint folder. For more details about this feature, see [FILES.md](FILES.md). 32 | 33 | 34 | 35 | ## Valid whenever a presentation is open 36 | 37 | *Note: These feedbacks will switch values with focus changes if multiple presentations are open.* 38 | 39 | - `/oscpoint/presentation/name [string: presentationFileName ASCII] [blob: presentationFileName UTF-8]` 40 | Current presentation filename. 41 | 42 | - `/oscpoint/presentation/slides/count [integer: n]` 43 | Total number of slides in presentation. 44 | 45 | - `/oscpoint/presentation/slides/count/visible [integer: n]`  46 | Total slide count, excluding hidden slides. 47 | 48 | - `/oscpoint/slideshow/state [string stateName]` 49 | The current state of the presentation. Possible values are: `edit` or `slideshow` (as of v2.1.x: `edit`, `running`, `paused`) 50 | 51 | ## Valid only during a slide show 52 | 53 | > [!NOTE] 54 | > These feedbacks may not update correctly when a slide show is auto-advancing. This is a known issue: https://github.com/phuvf/oscpoint/issues/67 55 | 56 | - `/oscpoint/slideshow/currentslide [integer: n]` 57 | Current slide number (1-based). 58 | 59 | - `/oscpoint/slideshow/builds/position [integer: n]` 60 | The build position of the current slide. 61 | 62 | - `/oscpoint/slideshow/builds/count [integer: n]` 63 | The total number of builds on the current slide. 64 | 65 | - `/oscpoint/slideshow/builds/remaining [integer: n]` 66 | The number of builds remaining on the current slide. 67 | 68 | - `/oscpoint/slideshow/slidesremaining [integer: n]`  69 | Number of slides left in slide show, excluding hidden slides. 70 | 71 | - `/oscpoint/slideshow/notes [string: notesText]` 72 | Current slide notes (ASCII encoding). Line breaks are normally sent as CR, ASCII 13 (0D in hex). 73 | 74 | - `/oscpoint/slideshow/notes-utf8 [blob: notesText UTF-8]`  75 | Current slide notes in UTF-8 encoding. This is sent as raw bytes and will need decoding by your OSC client. 76 | 77 | > [!NOTE] 78 | > ASCII-encoded notes might be deprecated in future versions. 79 | > Use UTF-8 encoded notes for full international character support, but you'll have to do the decoding yourself - or use the Companion Module, which does this for you. 80 | > To avoid busting UDP packet size limits, notes longer than 32,000 characters this will be truncated (that's a lot of notes). 81 | 82 | ### Section info 83 | 84 | - `/oscpoint/slideshow/section/index [integer: n]` 85 | Current section index (1-based). 86 | 87 | - `/oscpoint/slideshow/section/name [string: sectionName ASCII] [blob: sectionName UTF-8]` 88 | Current section name. 89 | 90 | - `/oscpoint/slideshow/section/slidesremaining [integer: n]`  91 | Number of slides left in section, excluding hidden slides. 92 | 93 | ## Valid only during a slideshow, and when there's a media element on the current slide 94 | 95 | *Please also see the note about media in [ACTIONS.md](ACTIONS.md) - all the same caveats apply here* 96 | 97 | These OSC messages will be emitted once every 500ms while the media is in the `playing` state. 98 | 99 | - `/oscpoint/slideshow/media/state [string: stateName]` 100 | The current state of the media element. Possible values are: `playing`, `paused`, `stopped`, `notready` 101 | 102 | - `/oscpoint/slideshow/media/duration [integer: n]` 103 | The total duration of the media clip in milliseconds. 104 | 105 | - `/oscpoint/slideshow/media/durationtrimmed [integer: n]`  106 | The trimmed duration of the media clip in milliseconds (from the clip's start point to the clip's end point). 107 | This will be the same as the total duration if the media clip has not been trimmed. 108 | 109 | - `/oscpoint/slideshow/media/startpoint [integer: n]`  110 | The start point of the media clip in milliseconds, measured from the start of the full clip. 111 | Will be 0 if the media clip has not been trimmed. 112 | 113 | - `/oscpoint/slideshow/media/endpoint [integer: n]`  114 | The end point of the media clip in milliseconds, measured from the start of the full clip. 115 | Will be the same as the total duration if the media clip has not been trimmed. 116 | 117 | - `/oscpoint/slideshow/media/position [integer: n]` 118 | The current position of the media playhead in milliseconds, measured from the start point. 119 | 120 | - `/oscpoint/slideshow/media/remaining [integer: n]` 121 | The remaining playtime (up to the end point) of the media in milliseconds. 122 | -------------------------------------------------------------------------------- /FILES.md: -------------------------------------------------------------------------------- 1 | # OSCPoint file handling 2 | 3 | > [!WARNING] 4 | > OSCPoint v2.x has the ability to read and share data from the PowerPoint machine's local file system. While this can be useful in live show environments, it's also a very powerful tool that could be used maliciously by users on the same network as your PowerPoint machine. 5 | > 6 | > Be aware of the capabilities and limitations of this feature before enabling it via the OSCPoint settings tab. 7 | 8 | ## General description 9 | 10 | OSCPoint can read and share presentation file info from a single nominated folder (called the **active folder**) on the PowerPoint machine's local file system. 11 | 12 | This allows a remote user to command OSCPoint to open and close PowerPoint presentations stored locally on the PowerPoint machine, which can be useful in live show situations. 13 | 14 | ### Capabilities 15 | 16 | - Read the filenames of all PowerPoint presentations in the active folder, and share these via OSC. 17 | - Open PowerPoint presentations contained in the active folder by filename. 18 | - Close PowerPoint presentations, while specifying what action to take if the file contains unsaved changes (*abort*, *save* or *force* close, discarding changes) 19 | - The active folder can be changed via OSC. 20 | 21 | ### Limitations 22 | 23 | - Does not support opening presentations from subfolders within the active folder. 24 | - The active folder is always relative to the user's home directory. 25 | - Only `.ppt` and `.pptx` files are supported. All other file types will be ignored. 26 | 27 | ## Enabling file handling 28 | 29 | File handling is disabled by default in OSCPoint. To enable it, go to the OSCPoint settings tab and check the box next to *Enable file system access*. 30 | 31 | For security reasons, this feature is disabled by default. 32 | 33 | ## Setting the active folder 34 | 35 | By default, the active folder is set to `Desktop\oscpoint`. This folder is created on the user's Desktop when file handling is enabled. 36 | 37 | To change the active folder, send the following OSC message: 38 | 39 | ```/oscpoint/files/setpath [string: path]``` 40 | 41 | The active folder is always relative to the user's home directory. For example, setting the active folder to `Desktop\myfolder\oscpoint` will mean OSCPoint will look for PowerPoint presentations in `C:\Users\[USERNAME]\Desktop\myfolder\oscpoint`. 42 | 43 | If this folder does not exist, it will be created. 44 | 45 | ## Getting a list of presentations in the active folder 46 | 47 | OSCPoint will send a list of all presentations in the active folder as an OSC message when the active folder is set. A list can also be requested at any time by sending the following OSC message: 48 | 49 | - ```/oscpoint/files/list``` 50 | 51 | OSCPoint will respond with a message in the following format: 52 | 53 | - ```/oscpoint/v2/files [string: JSON array of PowerPoint files]``` 54 | 55 | An example of the JSON structure is: 56 | ```JSON 57 | [ 58 | { 59 | "name": "test.pptx", 60 | "fullName": "C:\\Users\\[USERNAME]\\Desktop\\oscpoint\\test_presentation.pptx", 61 | "extension": ".pptx", 62 | "length": 265299837, 63 | "lastAccessTime": "23/04/2024 13:05:22", 64 | "lastWriteTime": "23/04/2024 09:45:52", 65 | "creationTime": "23/04/2024 09:45:51", 66 | "isReadOnly": false 67 | }, 68 | { 69 | "name": "test2.pptx", 70 | "fullName": "C:\\Users\\[USERNAME]\\Desktop\\oscpoint\\test_presentation_2.pptx", 71 | "extension": ".pptx", 72 | "length": 54547477, 73 | "lastAccessTime": "23/04/2024 12:31:57", 74 | "lastWriteTime": "23/04/2024 09:57:25", 75 | "creationTime": "23/04/2024 09:57:25", 76 | "isReadOnly": false 77 | } 78 | ] 79 | ``` 80 | 81 | ## Opening a presentation 82 | 83 | To open a presentation, send the following OSC message: 84 | 85 | - ```/oscpoint/files/open [string: filename]``` 86 | 87 | Where `filename` is the name of the presentation file to open. The filename must match exactly with one of the filenames in the active folder. 88 | 89 | ## Closing a presentation 90 | 91 | To close an open presentation, send the following OSC message: 92 | 93 | - ```/oscpoint/files/close [string: filename]``` 94 | 95 | This will close the presentation with name `filename`. If this presentation is not open, the message will be ignored. 96 | 97 | Use the information from the `/oscpoint/v2/presentations` message to get the list of currently open presentations. 98 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2025 Nick Roberts 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /PRESENTATION.md: -------------------------------------------------------------------------------- 1 | # OSCPoint sample presentation JSON 2 | 3 | OSCPoint uses JSON to represent the state of a presentation. This is a sample JSON object representing a presentation with 48 slides, 3 sections, and the slideshow running. 4 | 5 | ```JSON 6 | { 7 | "name": "test_presentation.pptx", 8 | "path": "C:\\Users\\[USERNAME]\\Desktop\\oscpoint", 9 | "slideCount": 48, 10 | "saved": true, 11 | "active": true, 12 | "slideshow": true, 13 | "sections": [ 14 | { 15 | "id": "{0FD0682D-A8FE-4955-AB04-F07552824B5D}", 16 | "name": "Default Section", 17 | "firstSlide": 1, 18 | "lastSlide": 5, 19 | "slideCount": 5 20 | }, 21 | { 22 | "id": "{ED2008A6-89BF-4DF5-B9D9-493C7E049507}", 23 | "name": "Financials", 24 | "firstSlide": 6, 25 | "lastSlide": 9, 26 | "slideCount": 4 27 | }, 28 | { 29 | "id": "{30ABD9E6-EF6B-43A1-8378-3E37CC4F1495}", 30 | "name": "Summary", 31 | "firstSlide": 10, 32 | "lastSlide": 48, 33 | "slideCount": 39 34 | } 35 | ] 36 | } 37 | ``` -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 |