Thank you for volunteering to help out with tech in an upcoming Pixel Perfect Event. If you think of a speedrun marathon as a sandwich, with the run as the filling and the host being the butter, the tech is the strong and sturdy bread, keeping everyone protected and in form, and preventing the whole experience from falling apart. Tech volunteers are vital for keeping a marathon running smoothly for everyone, and deserve the praise they receive for putting up with being the first person called upon when something goes wrong!
Unlike runners and hosts, tech shifts don't start and end with runs, rather they'll be set to a specific time frame, with volunteers swapping over whilst a run is ongoing. During your shift, you'll have a @Staff member acting as a Producer to fall back on should anything go wrong, or you need assistance with something outside of your control. You'll also work alongside runners and hosts, with runners expected to follow your instructions, and hosts taking over control of the stream once you've advised that the run is ready to go. Your general workflow is as follows
Setup the next runner and ensure their video and audio looks and sounds correct
Hand the runner over to the Host once the previous run has concluded and the stream is at intermission
Be on hand to respond to any issues or changes (runner details), or make run-specific adjustments (e.g. relay runner change)
It's worth noting that your responsibilities do not include the general switching to or from the intermission or controlling the timer. These are the responsibilities of the host and you will only need to intervene with these should there be an issue.
The runner will have already had a tech check prior to the marathon, so this preparation is only to double-check everything. If you helped out with these tech checks, this section is pretty much the same. In most cases, as long as the runner hasn't changed anything since their tech check, this should be a fairly quick process. Any commentators won't have been present at the prior tech check, so if there are any, make sure to pay extra attention to their setup.
You'll be provided with a tech-specific Portable OBS to prepare the runner, which you'll then transfer any adjustments to the actual stream during the next intermission. Get this set up ahead of the marathon.
Download the zip file which will have been shared with you on Discord.
Extract the files to a suitable location. The extraction folder is password protected; the password will have been provided in Discord.
You can now delete the zipped folder.
Run the file 'OBS Start'. If Windows asks if you're sure you want to open the shortcut, click 'Yes'.
You don't need to change any streaming settings, you won't be streaming yourself. The only setting that may be worth changing is 'Output > Recording Path', and set it to somewhere useful on your computer. This means you can take screenshots or record videos if you have a runner with a problem you want to share with other tech.
In the Sources panel, select the 'Discord capture' source, and from the drop-down list, select your own Discord application (Discord will need to be running). This will allow you to check the runner's and any commentators' voice volume.
Runners are expected to be available 20 minutes before their run starts, so when the current run is about 20 minutes away from its estimated conclusion, ping the next runner(s) in #ppmX-general, asking them and any commentators to join you in the Back Room voice channel. If you've had no contact after five minutes, ping them again. If you've had no contact after 10 minutes, contact your Producer.
If the Host of the upcoming run isn't already hosting, ping them to join you as well. If they're hosting the current run, you'll need to do any checks for them during the intermission.
To view a runner's stream, first ask them to start streaming. In the Sources panel, within the 'solo' folder select the browser source 'Solo_Runner' and click 'Properties'.
In the URL box, you only need to edit the final portion of the string; after 'stream=' (as highlighted on the right). Enter the runner's name as it appears on the schedule sheet, all in lowercase, and excluding any symbols or spaces.
e.g. xx_M1ghty_#9_xx would be entered as xxm1ghty9xx
Click OK and the source should refresh to show the runner's screen. If it doesn't, click 'Refresh'. If it still doesn't show, check:
a. The runner is streaming
b. The runner's stream key matches what you've entered
If you're confident both of these are correct, you'll need to contact your Producer.
Once their stream is visible, check to make sure it looks correct:
The runner is using the correct stream layout
If incorrect, ask them to select a different scene in their OBS; you can check the schedule to see which one they should be using.
There are no black borders around the webcam or game feeds
If the runner's feed is already black like in the screenshot above, ask them to show you some gameplay where the background isn't black. If there are any black borders, ask them to adjust the crop filter on the game/camera source.
An error you might find is where the stream comes through at a constant rate but looks deformed. This is due to the stream not being able to send all of the information in the time we've set.
We host a US and European server, so the first thing to check is that the runner is streaming to their closest server. If they're not, ask them to change their server URL accordingly.
If they are on the right server, you'll need the runner to increase their latency. The server URL they stream to ends with "&latency=500000". Check the Runner Check Sheet, as a different number may have been noted during their Tech Check.
Simply ask the runner to stop streaming, open their settings, and increase this number to the number already noted. If no number was noted, or it still hasn't worked, ask them to add an extra 200000 to it, and repeat this until the stream looks correct. Let your Producer know, as they may need to add a delay to the commentary from Discord to compensate for the extra latency.
The runner's stream should only be sending their game's audio:
If you're receiving their voice through the stream, ask them to remove the mic as a source in their OBS.
If you can't hear their game, ask them to check if they've added their game's audio to their 'PC Audio Capture' source, or ask them to turn the volume up.
Leaving your audio slider at max (0.0dB), the game volume should be peaking around the -25 to -20 mark (it's OK if the occasional SFX hits the orange area).
Get the runner to play a particularly noisy section of the game, and get them to adjust their own OBS slider or in-game volume until the audio is peaking at the right spot.
If the audio is too quiet and the runner can't turn it up any further, ask the runner to right-click on the source in OBS, click 'Filters', and add a 'Gain' filter. Ask them to adjust this filter until the volume is correct.
All voice audio from the runner(s), commentators, and host will come through Discord:
If you can hear the runner's game through Discord, ask the runner to either use headphones or to turn down the volume of the speakers that they're using.
Leaving your audio slider at max (0.0dB), all voice comms at a normal speaking level should peak around -18 to -12, with any shouting peaking no higher than -3.
Do not adjust your own Discord levels, as it won't be your Discord grabbing the audio. Ask each person speaking to ensure 'Automatic Gain Control' is switched off in their Discord Voice & Video settings (two settings below the Krisp logo). Then get each speaker to increase/decrease their microphone level or voice volume in Discord until their voice is peaking at the right spot.
If the Host for this run is hosting the current run, they won't be available during the tech check. You should double-check their audio during intermission, but as they're already hosting, they should already be fine.
If you're doing tech for a race, to more than one runner, simply repeat the process for each runner. In a race setting, instead of using the sources in the 'solo' source folder, use the two sources in the '2p' source folder.
Once you're satisfied the runner is correctly set up, you'll need to wait for the current run to end. Do not join the LIVE voice channel until the Host has taken the run to the Intermission screen. You can view the preview scene and current scene being shown on stream here: https://tech.pixelperfect.events/. This viewer has sub-second latency, so ensure you watch here and not on Twitch, which will be significantly further behind.
It's usually polite to wait until the previous runners have left the LIVE voice channel, but if they're taking too long, feel free to jump in and ask them to jump out or into the Green Room, especially if we're behind schedule. Runners, commentators, and Hosts cannot enter the LIVE voice channel freely, you'll need to drag them in from the Back Room.
If you've been on tech for a marathon before, you'll likely be familiar with NodeCG. Capable of a lot of functions, primarily it acts as a web-based interface for remotely controlling an OBS instance. It is accessible here: https://nodecg.pixelperfect.events. You'll be asked to log in with Discord or Twitch, which will only give you access if we've specifically set up your account on our server. If you can't log in, DM @J4sp3rr.
You'll need to use most of the tabs across the top of the workspace. Any that aren't mentioned in this guide (Graphics, Relay Control & Scene Editing), you should ignore. You also won't need to use the additional tabs in the top right corner, expect to Sign Out when you're finished.
On each tab, you'll have a bunch of different controls. Hovering over the bar at the top of each will allow you to collapse and move them; you're welcome to do this and reorder the controls as you wish, this won't affect the display for other users.
The Main Workspace is primarily used by Hosts, and they should only be using this one page; they should only be changing things on other tabs with permission from you or the Producer. It's still important you understand what they all do, in case you need to jump in and assist:
Run Player
This is useful for looking at the information about any run in the marathon. They're all displayed in schedule order and you can click on the arrow on the right to see more details. You won't need to click on any of the play buttons, switching to the next run is automated elsewhere.
Timer
This controls the timer that is displayed on the stream. Whilst active, most of the other controls are disabled. From left to right the buttons are:
Play/Pause: The runner or commentator will likely do a countdown and the host clicks this when they say go. Whilst the timer is running, this switches to Pause, which is only needed if there's an issue.
Reset: Only used if there is a false start or something happens that causes the runner to restart.
Stop: When the runner calls time, the host clicks stop.
Forfeit: For the setup we have, this actually does the same as Stop, so isn't used.
Undo: When the host pushes stop, the timer continues to run in the background. If they or the runner made a mistake and pressed Stop too early, the Undo button will continue the timer at the correct current time.
During a race, each runner will have their own individual Stop, Forfeit and Undo buttons, simply used as each runner finishes.
After a run, when the Host transitions to Intermission, the timer will automatically reset ready for the next run.
Relay Control
You won't need to use this panel, as we have our own custom relay page instead. You can collapse and ignore it.
Twitch Control
This shows the information being sent to Twitch to update the Stream Title, Game Category, and for users with FFZ Integration, Featured Channels. This should all be automated, but if there's a race or relay, an extra '@' must be added before every additional runner's name in the title, and then click update. For example, a race would automatically display:
PPM2 - Metal Gear Solid | Any%, Normal, Race - @DrPrufr0ck vs. NickRPGreen
And would need to be changed to:
PPM2 - Metal Gear Solid | Any%, Normal, Race - @DrPrufr0ck vs. @NickRPGreen
This is so that all runners appear in the Twitch stream title as clickable links to their Twitch page (we just can't do this automatically for multiple runners yet):
Live Switch
This is where the majority of the action takes place. If you have a Stream Deck or similar device, this works much the same way, as they are simply programmable buttons that perform certain actions. Whilst each button appears self-explanatory, there are a couple of extra actions taking place on each. This gives the Host control to go live when they're ready, rather than relying on you to give a countdown and for you have constantly have an eagle eye on the stream.
Solo Game: The main "Start The Next Run" button, pressed when the Host and the runner are ready to start. Upon pressing OBS will:
- switch to the Solo Game Layout, displaying the runner's game and camera.
- unmute Discord audio, meaning any talking in the LIVE channel will be heard on the stream.
- start a local recording, which is what we use to upload to YouTube.
Race Game: Same as above, but OBS will switch to the Race Game Layout.
Intermission: To go to intermission only after a run has ended. As you can probably work out, this does the opposite of the previous buttons. Upon pressing, OBS will:
- switch to the Intermission Layout; during the transition, NodeCG will also automatically progress to the next run.
- mute Discord audio, meaning you are free to talk in the LIVE channel without it going to the stream.
- stop the local recording
Interview/Opening: Go to the Interview or Opening scenes. Staff will handle going to these scenes.
Closing: The Host of the last run on a day that isn't the last day, instead of going to Intermission, will push this button to go to the Closing scene. The other actions the button performs are the same as the Intermission button.
Discord Enable/Disable: These manually override Discord audio going to the stream. These shouldn't be needed, but they're available just in case of an emergency.
Tech Issue: Whilst the timer is running, the other scene switch buttons are disabled, to avoid accidentally switching whilst a run is in progress. If you have to advise the Host that there is a tech issue and we need to go to Intermission to resolve it, you should ping @PPMX Host in #ppmX-general to do so. The Host will press the Tech Issue button and will go to intermission and mute Discord, but it won't stop the recording. At this point you can jump into the live Discord channel to talk to the Host and Runner. The Host can then use the Discord Enable/Disable buttons to talk to the audience and let them know any information you've advised can be shared. Once the issue is over, the Host will press Solo/Race Game to continue.
This has some additional control for OBS, which for the most part is automated, but is likely your first port of call if there are any issues:
Connection: This shows that NodeCG is connected to OBS. If for any reason it isn't connected, click 'Connect'. If that doesn't work, contact the Producer.
Scene Selection: A manual override for the scene currently being shown on stream. For use in emergencies only.
Output Status: This shows whether the stream is live and whether a recording is in session. If you're the first/last tech of the day, you may be asked to Start/Stop the stream. Recording is automated elsewhere and should only be toggled in an emergency.
Media Source URL: This is where the URL for the runner's stream is inputted. Every runner will stream to a URL with a unique key at the end. Their key must exactly match the input in the appropriate key box in this panel, this is usually a good first check if their stream isn't coming through. The key being updated to the next runner is automatic when the run updates, but if the runner's feed isn't showing on the preview during intermission, this is likely the culprit.
Stats: A one-to-one copy of OBS' stats screen. If there are any issues with the stream as it's shown on Twitch, this is a good place to check for potential reasons.
Screenshot & Source Overview: These are not used and can be collapsed and ignored.
Used for adjusting audio on the fly during a run. This will display volumes for every item on the stream that could have an audio level, but only those that are actually making noise on the streamed scene will display a colored bar. Remember, you won't be able to see volume levels for runners and game audio during the intermission, it only works for the live scene (this is a limitation of OBS, not something we can bypass).
Therefore, this screen is primarily for adjusting volume levels on the fly during the run, in case the runner or game is suddenly much louder or quieter than before. Use the volume slider to make a volume level quieter, or the Gain filter to make a run louder. If you do make any adjustments, ensure they are returned to zero once the run has finished.
This is where the run details are entered that will show on stream. All of these details should already be prepared and shouldn't need any manual entry unless changes are required. The only panel to touch is the Run Editor; you should ignore the other three.
When setting up the next runner, you should find their run in the list, click the dropdown arrow to view the details, and verify with them that each piece of information is correct. If any isn't. you can correct it by clicking on the Edit Run button (third circular button under the details) which will open up the Edit Run panel shown above. Do not use any of the other buttons under the info.
The run editor is fairly self-explanatory, and any details can be updated by simply typing in each box:
Every entry is case-sensitive except for pronouns. Whatever is entered in pronouns will be shown in lowercase on stream.
Region, Released, and Team Name are not used and should remain blank.
Game (Twitch) should match Game unless the name of the game isn't a registered Twitch category. If this is the case, this should have already been replaced, but it's worth checking with the runner in case they recommended a different category.
If the run is a race, there'll be a separate section at the bottom for each racer. In a solo run, there will just be one entry.
Twitch, Pronouns, and Twitter can be left blank if a participant does not want any of these displayed.
Country Code is pulled from Oengus, but we don't use it.
Uses Cam defaults at 'Yes' when left blank, so only needs 'No' entered if the user isn't using a webcam, vtube, or avatar.
At the time of writing, we've not developed a solution for the custom data being spread out over more than one line, so as you can see, it's all squished together. The boxes that are shown are in the following order:
Layout Code: determines which layout is used depending on the game - do not edit this, contact the Producer if there is an issue with this
Commentator 1's Display Name, Pronouns, Twitch, Twitter
Commentator 2's Display Name, Pronouns, Twitch, Twitter
Commentator 3's Display Name, Pronouns, Twitch, Twitter
Host's Display Name, Pronouns, Twitch, Twitter