<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>Forem: 𝓢𝓸𝓻𝓼𝓴𝓸𝓸𝓽🌷</title>
    <description>The latest articles on Forem by 𝓢𝓸𝓻𝓼𝓴𝓸𝓸𝓽🌷 (@sorskoot).</description>
    <link>https://forem.com/sorskoot</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F176886%2Fbc37ac95-cd21-4596-891e-e914f8144bce.png</url>
      <title>Forem: 𝓢𝓸𝓻𝓼𝓴𝓸𝓸𝓽🌷</title>
      <link>https://forem.com/sorskoot</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/sorskoot"/>
    <language>en</language>
    <item>
      <title>WebXR at Global XR Conference</title>
      <dc:creator>𝓢𝓸𝓻𝓼𝓴𝓸𝓸𝓽🌷</dc:creator>
      <pubDate>Mon, 29 Nov 2021 20:50:56 +0000</pubDate>
      <link>https://forem.com/sorskoot/webxr-at-global-xr-conference-184g</link>
      <guid>https://forem.com/sorskoot/webxr-at-global-xr-conference-184g</guid>
      <description>&lt;p&gt;I posted this to the WebXR discord (&lt;a href="https://discord.gg/Jt5tfaM"&gt;https://discord.gg/Jt5tfaM&lt;/a&gt;), but I thought it might be helpful to anyone interested outside of the Discord as well (but you should join 😉).&lt;/p&gt;




&lt;p&gt;This week is the &lt;a href="https://globalxrconference.com/"&gt;Global XR Conference&lt;/a&gt; (Dec 1 - 3) and there are a couple of WebXR related talks and workshops. &lt;/p&gt;

&lt;p&gt;But I thought I'd make a list of all sessions and workshops that have the tag WebXR... Turned out be more than I thought 🙂 , but here they are:&lt;/p&gt;

&lt;h3&gt;
  
  
  December 1
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;2pm UTC - XR On The Web Is Just a Fad - Jonathan Hale - &lt;a href="https://youtu.be/VCXe0Dm1tJs"&gt;https://youtu.be/VCXe0Dm1tJs&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;2:30pm UTC - (Workshop) Building a VR Space Shooter - Timmy Kokke - &lt;a href="https://youtu.be/zMI9-FpL4NI"&gt;https://youtu.be/zMI9-FpL4NI&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;4pm UTC - WebAR is Re-Inventing QR Codes - Frans Tihveräinen - &lt;a href="https://youtu.be/jMFi-6qFg4I"&gt;https://youtu.be/jMFi-6qFg4I&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;8pm UTC - The Journey to Augmenting Your World - Ven Natarajan &amp;amp; Supun Bhagya - &lt;a href="https://youtu.be/wa-nbNCwyc8"&gt;https://youtu.be/wa-nbNCwyc8&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  December 2
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;1pm UTC - (Workshop) Build a Multi-User Cross-XR App - Jonathan Hale - &lt;a href="https://youtu.be/Ca1IvVk6OQo"&gt;https://youtu.be/Ca1IvVk6OQo&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;1pm UTC - Exploring the Universe Using WebXR - Karan Balkar - &lt;a href="https://youtu.be/4hUPVNGHhkA"&gt;https://youtu.be/4hUPVNGHhkA&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;2pm UTC - How to Build a High Scalable Microfrontend TWA Webxr App as a Single Native App - R Surahutomo Aziz Pradana - &lt;a href="https://youtu.be/bDfS2IwJo-g"&gt;https://youtu.be/bDfS2IwJo-g&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;3pm UTC - (Community) Extended Reality in Africa: Present &amp;amp; Future Prospects - Arome Ibrahim - &lt;a href="https://youtu.be/Yz3z7_2y-Ck"&gt;https://youtu.be/Yz3z7_2y-Ck&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;7:30pm UTC - (Workshop) Mastering the Immersion Platform - Ven Natarajan &amp;amp; Supun Bhagya - &lt;a href="https://youtu.be/rELlPnFHkHw"&gt;https://youtu.be/rELlPnFHkHw&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;9pm UTC - Meta Media Futures - Evo Heyning - &lt;a href="https://youtu.be/4n-foFTqzcw"&gt;https://youtu.be/4n-foFTqzcw&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  December 3
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;1pm UTC - The Rise of Virtual Worlds - Sonya Seddarasan &amp;amp; Jal Shah - &lt;a href="https://youtu.be/JF4GZ0-8ZQk"&gt;https://youtu.be/JF4GZ0-8ZQk&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;4pm UTC - XR in Marketing and Advertisement - Diana Olynick - &lt;a href="https://youtu.be/wBcDwolHT2c"&gt;https://youtu.be/wBcDwolHT2c&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;7pm UTC - My Experience Adapting a Digital Twin WebGL Project for HoloLens 2 - Bruno Capuano - &lt;a href="https://youtu.be/c3hxE1uvLvA"&gt;https://youtu.be/c3hxE1uvLvA&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;They have a &lt;a href="https://discord.gg/F3RSqfJbTC"&gt;discord&lt;/a&gt; as well if you like to reach out to one of the speakers ().&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--WTEu7cSi--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/nvtuy31kvhv93jc8bjje.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--WTEu7cSi--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/nvtuy31kvhv93jc8bjje.png" alt="Global XR Conference Logo" width="880" height="880"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>webxr</category>
    </item>
    <item>
      <title>A-Frame hand-tracking on the HoloLens</title>
      <dc:creator>𝓢𝓸𝓻𝓼𝓴𝓸𝓸𝓽🌷</dc:creator>
      <pubDate>Sat, 24 Oct 2020 21:23:10 +0000</pubDate>
      <link>https://forem.com/sorskoot/a-frame-hand-tracking-on-the-hololens-366a</link>
      <guid>https://forem.com/sorskoot/a-frame-hand-tracking-on-the-hololens-366a</guid>
      <description>&lt;p&gt;On the HoloLens you only have the UWP version of Edge out of the box. This doesn't have the newer WebXR device API implemented. The WebXR device API can even handle hand tracking. But, Edge UWP doesn't, this only has the &lt;em&gt;old&lt;/em&gt; WebVR API. I already noticed you could use the Gamepad API to get an &lt;em&gt;Air tap&lt;/em&gt; event and handle that as a click, but I &lt;del&gt;wanted&lt;/del&gt; needed to get the position of the hands.&lt;/p&gt;

&lt;p&gt;It took me a while to get this figured out this one. It turned out to be a bit easier than I thought. I thought I had to track the controls myself through the gamepad API, but it turned out A-Frame has us covered. &lt;/p&gt;

&lt;p&gt;There's a component that is the basis for a lot of other components that handle tracking on various devices, for example, the Oculus touch controls or the Windows motions controls. If you know what ID is used in a specific situation you can just handle the rest yourself. &lt;/p&gt;

&lt;p&gt;I created a very small test application and used Vorlon as I described in a &lt;a href="https://dev.to/sorskoot/remote-debugging-webxr-on-hololens-gem"&gt;previous post&lt;/a&gt; to get the information. I was implementing the whole thing myself at first, but later realized I could use the Tracked-Controls component that's in A-Frame. Below is a small snippet of HTML from that test app that shows how to use the left and right hand as a controller. The controller numbers 4 and 5 are actually the indices of the gamepads returned by the GamePad API. For the &lt;code&gt;idPrefix&lt;/code&gt; I used &lt;code&gt;Hand&lt;/code&gt;, which is short for 'Hand (Spatial Interaction Source)', the full id. I used the default low poly hand models used by A-Frame, but had to tweak the rotation and position a little bit to make them overlay the real hands a bit better.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;a-entity&lt;/span&gt; &lt;span class="na"&gt;tracked-controls=&lt;/span&gt;&lt;span class="s"&gt;"controller: 4;hand:left; idPrefix: Hand"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;a-entity&lt;/span&gt; &lt;span class="na"&gt;id=&lt;/span&gt;&lt;span class="s"&gt;"hand"&lt;/span&gt; 
            &lt;span class="na"&gt;rotation=&lt;/span&gt;&lt;span class="s"&gt;"-60 0 60"&lt;/span&gt; 
            &lt;span class="na"&gt;position =&lt;/span&gt;&lt;span class="s"&gt;"0 -.03 -.02 "&lt;/span&gt; 
            &lt;span class="na"&gt;gltf-model=&lt;/span&gt;&lt;span class="s"&gt;"src:url(https://cdn.aframe.io/controllers/hands/leftHandLow.glb)"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;/a-entity&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/a-entity&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;a-entity&lt;/span&gt; &lt;span class="na"&gt;tracked-controls=&lt;/span&gt;&lt;span class="s"&gt;"controller: 5;hand:right; idPrefix: Hand"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;a-entity&lt;/span&gt; &lt;span class="na"&gt;id=&lt;/span&gt;&lt;span class="s"&gt;"hand"&lt;/span&gt; 
            &lt;span class="na"&gt;rotation=&lt;/span&gt;&lt;span class="s"&gt;"-60 0 -60"&lt;/span&gt; 
            &lt;span class="na"&gt;position =&lt;/span&gt;&lt;span class="s"&gt;"0 -.03 -.02 "&lt;/span&gt; 
            &lt;span class="na"&gt;gltf-model=&lt;/span&gt;&lt;span class="s"&gt;"src:url(https://cdn.aframe.io/controllers/hands/rightHandLow.glb)"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;/a-entity&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/a-entity&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The only thing that this does not do is track the individual fingers. That's something you need the newer WebXR device API for, but this is better than nothing. I hope, one day, Edge on the HoloLens will support the full WebXR device API.&lt;/p&gt;

&lt;p&gt;Next, I need to figure out a way of creating interaction between hands and objects in 3D space to be able to press buttons or touch objects. More on that in a future post.&lt;/p&gt;

</description>
      <category>aframe</category>
      <category>hololens</category>
      <category>mixedreality</category>
      <category>javascript</category>
    </item>
    <item>
      <title>WebXR Discord</title>
      <dc:creator>𝓢𝓸𝓻𝓼𝓴𝓸𝓸𝓽🌷</dc:creator>
      <pubDate>Sun, 27 Sep 2020 03:10:45 +0000</pubDate>
      <link>https://forem.com/sorskoot/webxr-discord-3bjc</link>
      <guid>https://forem.com/sorskoot/webxr-discord-3bjc</guid>
      <description>&lt;p&gt;During the Covid-19 crisis all over the world, we noticed a lot of people from all over the world joining our meetups and members of our community hanging out in other meetups. We decided to try and bring everyone together in one &lt;a href="http://discord.gg/Jt5tfaM"&gt;Discord server&lt;/a&gt;. Here we can share links to our events and recordings, but also help each other out with issues when developing with A-frame, Babylon.js, or Unity and running your apps on devices like the Oculus Quest or Microsoft Hololens. Now we need &lt;em&gt;you&lt;/em&gt; to join and help grow this community to become the official WebXR community.&lt;/p&gt;

&lt;p&gt;Make sure to share the invite with your friends and colleagues: &lt;a href="http://discord.gg/Jt5tfaM"&gt;WebXR Discord,  http://discord.gg/Jt5tfaM&lt;/a&gt;!&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Remote debugging WebXR on HoloLens</title>
      <dc:creator>𝓢𝓸𝓻𝓼𝓴𝓸𝓸𝓽🌷</dc:creator>
      <pubDate>Sat, 26 Sep 2020 19:35:48 +0000</pubDate>
      <link>https://forem.com/sorskoot/remote-debugging-webxr-on-hololens-gem</link>
      <guid>https://forem.com/sorskoot/remote-debugging-webxr-on-hololens-gem</guid>
      <description>&lt;p&gt;I recently started a new job as a Mixed Reality developer building applications for the Microsoft HoloLens. We build our applications using Unity3D. But, of course, I had to try and run WebXR on the device as well. Microsoft Edge comes with the HoloLens and supports WebVR. And switching to 'VR' removes the browser chrome and your 3D model becomes a hologram in the real world. After that, it gets different from running a WebXR app on other devices very quickly. One of the difficulties I ran into was debugging.&lt;/p&gt;

&lt;h2&gt;
  
  
  Debugging
&lt;/h2&gt;

&lt;p&gt;When running a web application on the Oculus Quest, for example, you can use Edge on your desktop de remotely debug. Just browse to &lt;a href="https://dev.toedge://inspect"&gt;edge://inspect&lt;/a&gt; and without too much hassle you should be able to debug with the same tools you would debug any other website. The HoloLens runs the 'old' UWP version of Edge and can't be debugged with the new Chromium Edge. I've tried a couple of different approaches, but none worked. &lt;/p&gt;

&lt;h2&gt;
  
  
  Vorlon.JS
&lt;/h2&gt;

&lt;p&gt;This is where &lt;a href="http://vorlonjs.com/"&gt;Vorlon.JS&lt;/a&gt; comes in. This nifty little tool can replace the web debug tools and creates a connection to debug your website remotely. Just install the npm package globally on your machine (&lt;code&gt;npm i vorlon -g&lt;/code&gt;). When you run this it spins up a small web server locally, by default on port 1337. You'll have to add a script that is served from this page to your HTML page and you are pretty much good to go. Except that I run my WebXR application using SSL, with a custom certificate (I have a DNS entry that points a local IP) and mixing secure and unsecured connections doesn't work in this case. &lt;/p&gt;

&lt;p&gt;To get this to work you have to find where Vorlon is installed on your Windows machine. In my case it's &lt;code&gt;%AppData%\npm\node_modules\vorlon\Server&lt;/code&gt;. You'll have to edit the &lt;code&gt;config.json&lt;/code&gt; file there. Basically it comes down to changing &lt;code&gt;"useSSL": true&lt;/code&gt;. &lt;br&gt;
When you want to run SSL on LocalHost this is enough. In my case, I wanted to use my own certificate. To get this to work I copied the &lt;code&gt;.crt&lt;/code&gt; and the &lt;code&gt;.key&lt;/code&gt; files to the &lt;code&gt;/cert&lt;/code&gt; folder. I also updated the config to use these. Don't forget to update the script tag in your .html file to use the domain name if that's different now. I added &lt;code&gt;&amp;lt;script src="https://{YOUR-IP}:1337/vorlon.js"&amp;gt;&amp;lt;/script&amp;gt;&lt;/code&gt; to my HTML file. &lt;/p&gt;

&lt;p&gt;After this, you just open the Vorlon URL (&lt;code&gt;https://{YOUR-IP}:1337&lt;/code&gt;) on your desktop and the WebXR app on the HoloLens. Anything that is written to the console will show up on the desktop. But you can explore a lot more on the remote location from your desktop machine. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--hS2s8tSZ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/0whrxizx5kg0qr53swbu.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--hS2s8tSZ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/0whrxizx5kg0qr53swbu.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>webxr</category>
      <category>hololens</category>
      <category>vorlon</category>
    </item>
    <item>
      <title>How is CSS applied to your document?</title>
      <dc:creator>𝓢𝓸𝓻𝓼𝓴𝓸𝓸𝓽🌷</dc:creator>
      <pubDate>Sun, 05 Jan 2020 23:39:13 +0000</pubDate>
      <link>https://forem.com/sorskoot/how-is-css-applied-to-your-document-465a</link>
      <guid>https://forem.com/sorskoot/how-is-css-applied-to-your-document-465a</guid>
      <description>&lt;p&gt;This week I was debugging an issue with the CSS of the application we are building at a client. It turned out that the CSS was applied to the document in an order that I wasn't expecting. It's about time for me to learn how CSS is applied to HTML documents.&lt;/p&gt;

&lt;h2&gt;
  
  
  How and when is CSS loaded?
&lt;/h2&gt;

&lt;p&gt;Before we have a look at how the CSS is applied to a page, the CSS needs to be loaded first. This happens in the following way. &lt;/p&gt;

&lt;p&gt;1) First, the Browser loads an HTML file&lt;br&gt;
2) The HTML file is converted to the Document Object Model (DOM)&lt;br&gt;
3) The browser fetches resources, like CSS or JavaScript &lt;br&gt;
4) The browser parses the CSS and applies the style&lt;br&gt;
5) A render tree is created&lt;br&gt;
6) Lastly, the page is displayed&lt;/p&gt;

&lt;p&gt;There are two important ways that CSS is applied to a page, its cascading order and the specificity. &lt;/p&gt;
&lt;h2&gt;
  
  
  Cascading Order
&lt;/h2&gt;

&lt;p&gt;The CSS that is applied to a page can come from different origins. The cascading order determines what origin to apply first. &lt;/p&gt;

&lt;p&gt;There are 3 different origins the CSS can come from:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;em&gt;User-Agent&lt;/em&gt;; These style sheets come from the browser and can be real style sheets or hardcoded values.&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Author&lt;/em&gt;; These are the most common style sheets, the style sheets that are added to a website.&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;User&lt;/em&gt;; It's possible for users to override the style sheets and customize the look.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The order in which the origins are applied is:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;Origin&lt;/th&gt;
&lt;th&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;User Agent&lt;/td&gt;
&lt;td&gt;normal&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;User&lt;/td&gt;
&lt;td&gt;normal&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;Author&lt;/td&gt;
&lt;td&gt;normal&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;Animations&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;Author&lt;/td&gt;
&lt;td&gt;!important&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;6&lt;/td&gt;
&lt;td&gt;User&lt;/td&gt;
&lt;td&gt;!important&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;7&lt;/td&gt;
&lt;td&gt;User Agent&lt;/td&gt;
&lt;td&gt;!important&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;8&lt;/td&gt;
&lt;td&gt;Transitions&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Note that later defined styles within the same origin win. &lt;/p&gt;

&lt;p&gt;Another thing that you need to keep in mind is animations. The &lt;code&gt;@keyframes&lt;/code&gt; rules work a little bit different. They don't cascade and don't mix together. If multiple &lt;code&gt;@keyframes&lt;/code&gt; are defined, the last one is chosen.  &lt;/p&gt;
&lt;h2&gt;
  
  
  Specificity
&lt;/h2&gt;

&lt;p&gt;Within the cascading of origins, the specificity of the CSS is used. &lt;br&gt;
The specificity is calculated by adding weights to the different declarations:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;0 for &lt;code&gt;*&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;1 for elements (&lt;code&gt;h1&lt;/code&gt;, &lt;code&gt;div&lt;/code&gt;) and pseudo-elements (&lt;code&gt;:before&lt;/code&gt;, &lt;code&gt;:after&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;10 for classes (&lt;code&gt;.something&lt;/code&gt;), attributes(&lt;code&gt;[some-attrib]&lt;/code&gt;) and pseudo-classes (&lt;code&gt;:hover&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;100 for IDs (&lt;code&gt;#specific-ID&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;1000 for inline styles (&lt;code&gt;&amp;lt;div style="color:#ff0000"&amp;gt;&lt;/code&gt;)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Of course in CSS these will be combined which means the values are added together.&lt;/p&gt;

&lt;p&gt;A few examples: &lt;br&gt;
&lt;/p&gt;
&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;


&lt;p&gt;If we have a look at the following CSS, a few things happen there:&lt;br&gt;
&lt;/p&gt;
&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;


&lt;p&gt;The text on a div with the ID &lt;code&gt;some-id&lt;/code&gt; will be &lt;em&gt;red&lt;/em&gt;. This is because line 1 calculates to 101 (an ID and an Element). The second line only calculates to 100, the last one calculates to 11 (and element and an attribute).&lt;/p&gt;

&lt;p&gt;Now assume we have an &lt;code&gt;H1&lt;/code&gt; on the page. Without a class, this will become &lt;em&gt;purple&lt;/em&gt;. Because the latest defined rule wins. If we would add a class (&lt;code&gt;some-class&lt;/code&gt;) the text becomes &lt;em&gt;yellow&lt;/em&gt;, a class is more specific than the element.&lt;/p&gt;

&lt;p&gt;I think I get it now :)&lt;/p&gt;

</description>
      <category>css</category>
      <category>webdev</category>
      <category>html</category>
    </item>
    <item>
      <title>DNS lookup for local IP</title>
      <dc:creator>𝓢𝓸𝓻𝓼𝓴𝓸𝓸𝓽🌷</dc:creator>
      <pubDate>Fri, 20 Dec 2019 15:37:31 +0000</pubDate>
      <link>https://forem.com/sorskoot/dns-lookup-for-local-ip-4e38</link>
      <guid>https://forem.com/sorskoot/dns-lookup-for-local-ip-4e38</guid>
      <description>&lt;p&gt;Sometimes when testing you want to have easy access to your machine. For example, when building and testing a Progressive Web App running on your development machine, you probably want to test it from your phone as well. In a lot of situations, it is sufficient to just type in the IP address of your dev machine (assuming it's on your local network) and browse it. But in the case of a PWA, you need to have the website running on HTTPS. &lt;/p&gt;

&lt;h2&gt;
  
  
  How?
&lt;/h2&gt;

&lt;p&gt;I registered a short domain name, c0dr.nl, and got a wildcard SSL certificate for that. I used &lt;a href="https://digicert.com" rel="noopener noreferrer"&gt;DigiCert&lt;/a&gt;, but &lt;a href="https://letsencrypt.org" rel="noopener noreferrer"&gt;LetsEncrypt&lt;/a&gt; will work just as fine. Now instead of setting up a host with storage and such, just configure the DNS settings. I added an &lt;em&gt;A&lt;/em&gt; record with an easy name, for example: 'twitch'. For the IP address, you'll have to add your &lt;em&gt;local&lt;/em&gt; address. Not the one you got from your ISP, but the one you got from your local DHCP or that you entered in the IP settings. In my case, it's 192.168.1.13. That happens to be the same address I used for testing my PWA in the first place. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2Fjhgtuqg8vcbix5xd8quo.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2Fjhgtuqg8vcbix5xd8quo.png" alt="ISP DNS A-Record"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;What's left is to make sure that whatever you use to run your web app is using the certificate. &lt;/p&gt;

&lt;p&gt;One last note. You don't have to use a wildcard certificate. But it will give you a little bit more flexibility when your IP address changes. You might work in different locations. At home and at the office. You can set up two different subdomains for that. If you only need one, use an '@' instead of a name in the &lt;em&gt;A&lt;/em&gt;-record.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>dns</category>
      <category>pwa</category>
    </item>
    <item>
      <title>Twitch Stream Setup</title>
      <dc:creator>𝓢𝓸𝓻𝓼𝓴𝓸𝓸𝓽🌷</dc:creator>
      <pubDate>Mon, 25 Nov 2019 13:45:00 +0000</pubDate>
      <link>https://forem.com/sorskoot/twitch-stream-setup-4jdp</link>
      <guid>https://forem.com/sorskoot/twitch-stream-setup-4jdp</guid>
      <description>&lt;p&gt;Whenever I have some spare time I get into coding on &lt;a href="https://github.com/sorskoot" rel="noopener noreferrer"&gt;my projects&lt;/a&gt;. A few years ago I started live coding, on LiveCoding.tv at the time. There were some people streaming programming on Twitch at the time, but only game devs and that was not what I was doing. I tried switching over to Twitch, but the lack of growth of the channel and lack of motivation from my side led me to stop. Earlier this year I decided to pick it up again. This time &lt;a href="https://www.twitch.tv/sorskoot" rel="noopener noreferrer"&gt;only on Twitch&lt;/a&gt;, where the community of Live Coders is growing fast. I felt welcome in the community. And I got affiliated pretty quickly, thanks to the support of the community. If you are looking for people coding on Twitch, you should have a look at the &lt;a href="https://www.twitch.tv/team/livecoders" rel="noopener noreferrer"&gt;LiveCoders team&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;A lot is going on when running a stream. In this post, I'd like to give you a look backstage to what is going on during the streams.&lt;/p&gt;

&lt;p&gt;Of course, there's audio, video and a view of my screen. But there's a lot more going on...&lt;/p&gt;

&lt;h2&gt;
  
  
  Hardware/Software
&lt;/h2&gt;

&lt;p&gt;Let's have a look at the hardware I'm using for the live coding streams first.&lt;br&gt;
Because I'm doing projects with VR and graphics for work as well besides web development, my employer (&lt;a href="https://www.centric.eu/EU/Default" rel="noopener noreferrer"&gt;Centric&lt;/a&gt;) was kind enough to provide me with an Alienware 17 R5 laptop. This is perfect for 3D modeling and running the Oculus Rift. But has also enough power to encode video for a live stream. Where I used to have issues with my previous laptop, like dropping frames and such, now this is completely over. I will get into more detail about OBS later.&lt;/p&gt;

&lt;p&gt;This is the list of hardware I'm using:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Alienware 17 R5&lt;/li&gt;
&lt;li&gt;HP LA2405wg Monitor (old, but still works fine)&lt;/li&gt;
&lt;li&gt;Das Keyboard Professional&lt;/li&gt;
&lt;li&gt;Logitech MX Master 2S&lt;/li&gt;
&lt;li&gt;Logitec 920c&lt;/li&gt;
&lt;li&gt;Blue Yeti&lt;/li&gt;
&lt;li&gt;Elgato Stream Deck&lt;/li&gt;
&lt;li&gt;8 port Sitecom powered USB hub&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Software-wise I'm using &lt;a href="https://obsproject.com/" rel="noopener noreferrer"&gt;OBS&lt;/a&gt; to stream. I'm using &lt;a href="https://code.visualstudio.com/" rel="noopener noreferrer"&gt;VSCode&lt;/a&gt; (mostly) to code with the &lt;a href="https://github.com/robb0wen/synthwave-vscode" rel="noopener noreferrer"&gt;Synthwave'84 theme&lt;/a&gt;.&lt;br&gt;
For the audio, I use &lt;a href="https://www.vb-audio.com/Voicemeeter/potato.htm" rel="noopener noreferrer"&gt;VoiceMeeter Potato&lt;/a&gt; to route the audio and to have fine control over the volume of everything. I use &lt;a href="https://www.blackcatsystems.com/software/soundbyte_rack_cart_machine_radio_automation_software.html" rel="noopener noreferrer"&gt;SoundByte&lt;/a&gt; to play soundFX. The music I play in the background during the stream is &lt;a href="https://www.monstercat.com/" rel="noopener noreferrer"&gt;Monstercat&lt;/a&gt;. I build a &lt;a href="https://github.com/sorskoot/Twitch.Sorskoot" rel="noopener noreferrer"&gt;custom player&lt;/a&gt; that runs inside OBS and renders a visualization of the audio. I've also got a chatbot running, which I also build myself. Her name is &lt;a href="https://github.com/sorskoot/RosieBot" rel="noopener noreferrer"&gt;Rosie&lt;/a&gt;, named after the maid in the TV series The Jetsons. At the moment I'm using StreamLabs for the alerts.&lt;/p&gt;

&lt;h2&gt;
  
  
  Audio
&lt;/h2&gt;

&lt;p&gt;In the early days of my stream, I used a cheap headset. The quality of the audio was very bad. The only benefit was that I could take it and stream from pretty much anywhere. I have it replaced with a &lt;a href="https://www.bluedesigns.com/products/yeti/" rel="noopener noreferrer"&gt;Blue Yeti&lt;/a&gt;. This is a UBS microphone that could be used on its stand. I have removed this stand and screwed it onto a boom arm. During a stream, it's just below the camera, between the keyboard and my mouth. When I started streaming I didn't bother too much with the audio. But slowly I'm starting to get more and more obsessed with it. I think it's one of the hardest things to get right when streaming. And I know that at one point in the future I will replace the Yeti with a good XLR mic and replace VoiceMeeter with a hardware mixer. These things cost a lot of money though.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;em&gt;VoiceMeeter&lt;/em&gt;
&lt;/h3&gt;

&lt;p&gt;During a live stream, I have a couple of things going on that make sound. I want to have full control of what the volumes of each are. I used to have everything set in OBS, but that wasn't fine-grained enough. I needed more control. Then I came across VB-Audio VoiceMeeter. Since I wanted to have the most control possible I got the &lt;a href="https://www.vb-audio.com/Voicemeeter/potato.htm" rel="noopener noreferrer"&gt;VoiceMeeter Potato&lt;/a&gt;. This tool is &lt;em&gt;donationware&lt;/em&gt;, which means you can pay whatever couple of $ you want for a license.&lt;/p&gt;

&lt;p&gt;I have my mic, the music, sound effects, and my desktop all going to separate channels. I also use a channel in VoiceMeeter for a USB mixer I use sometimes outside the streams. I also have a channel reserved for Spotify. I'm not using Spotify anymore during the stream but might listen to it while working.&lt;/p&gt;

&lt;p&gt;Let me explain my VoiceMeeter set up in a little bit more detail. Here's a screenshot of my setup:&lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Ftimmykokke.com%2Fimages%2F2019%2F07%2FVoiceMeeter.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Ftimmykokke.com%2Fimages%2F2019%2F07%2FVoiceMeeter.jpg" alt="VoiceMeeter"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If we go over the channels from left to right, we start with the channel for the microphone. I've routed this to &lt;strong&gt;B3&lt;/strong&gt; only. The 'B' channels on the mixer are virtual outputs, where the 'A' channels are routed to real hardware outputs. I'm only using B3 for my microphone. This way I can get it onto a separate input in OBS and have OBS mute it.&lt;/p&gt;

&lt;p&gt;The second channel is the output from OBS. I'm using an extra free program from VB-Audio here as well: &lt;a href="https://www.vb-audio.com/Cable/index.htm" rel="noopener noreferrer"&gt;VB-Cable&lt;/a&gt;. This program gives you an extra 'hardware' audio output to work with. On top of the 3, you get with VoiceMeeter Potato. I've routed this channel to &lt;strong&gt;B2&lt;/strong&gt; for use in OBS and &lt;strong&gt;A1&lt;/strong&gt;. &lt;em&gt;A1&lt;/em&gt; I've routed to my Blue Yeti. The microphone has also a headphone output and volume control on there. Without routing the sound to here I won't hear anything but my voice.&lt;/p&gt;

&lt;p&gt;I'm skipping the other hardware inputs since they are not used for streaming, and go to the virtual inputs. For the stream, I use only VoiceMeeter AUX for my desktop audio and VoiceMeeter VAIO 3 for the sound fx. Both are routed to &lt;strong&gt;B2&lt;/strong&gt; and at least &lt;strong&gt;A1&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Here's a sketch of the setup.&lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Ftimmykokke.com%2Fimages%2F2019%2F07%2FVoiceMeeterSchematic.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Ftimmykokke.com%2Fimages%2F2019%2F07%2FVoiceMeeterSchematic.jpg" alt="VoiceMeeter Schematic"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;As an experiment, I tried having the audio on channel 2 going only to stream (B2) and Spotify only to my headphones (A1). To my surprise this actually works :) This way I can listen to some music while the viewers of the live stream listen to something else. I'm not planning on using this while streaming, but it is nice to know that it is possible to do things like that.&lt;/p&gt;

&lt;p&gt;If you have trouble getting the outputs of your applications routed to the right channel in VoiceMeeter. Try going to the Windows Mixer, by typing &lt;code&gt;mixer&lt;/code&gt; in your start menu.&lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Ftimmykokke.com%2Fimages%2F2019%2F07%2FWindowsMixer.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Ftimmykokke.com%2Fimages%2F2019%2F07%2FWindowsMixer.jpg" alt="Windows Mixer"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Within these settings, you can specify which output should be used for every app. I have set SoundByte to output to &lt;em&gt;VoiceMeeter VAIO3 Input&lt;/em&gt; and OBS to &lt;em&gt;CABLE Input&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;Normally you don't need to route OBS to a separate channel. If you are using alerts from StreamLabs with sound you might, but you'll probably be fine without. I wanted to do something special with the audio. So, I created a music player to play and visualize the audio myself. Since this is running inside a browser window in OBS, I used VoiceMeeter to control the volume.&lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Ftimmykokke.com%2Fimages%2F2019%2F07%2FAudioVisualizer.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Ftimmykokke.com%2Fimages%2F2019%2F07%2FAudioVisualizer.jpg" alt="Windows Mixer"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Audio inputs and routing in a list:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;input&lt;/th&gt;
&lt;th&gt;from&lt;/th&gt;
&lt;th&gt;routed&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Blue Yeti Microphone   &lt;/td&gt;
&lt;td&gt;Hardware In&lt;/td&gt;
&lt;td&gt;B3&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;OBS (music)&lt;/td&gt;
&lt;td&gt;VB-Cable&lt;/td&gt;
&lt;td&gt;A1, B2&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Desktop Audio&lt;/td&gt;
&lt;td&gt;VoiceMeeter AUX&lt;/td&gt;
&lt;td&gt;A1, B2&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Sound FX&lt;/td&gt;
&lt;td&gt;VoiceMeeter VAIO 3   &lt;/td&gt;
&lt;td&gt;A1, B2&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  &lt;em&gt;OBS&lt;/em&gt;
&lt;/h3&gt;

&lt;p&gt;Inside OBS I don't have to do a lot with the audio anymore. I get the correct mix and the mic on a separate channel. I added them to two different input channels in the Audio Settings in OBS.&lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Ftimmykokke.com%2Fimages%2F2019%2F07%2FOBSAudioSettings.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Ftimmykokke.com%2Fimages%2F2019%2F07%2FOBSAudioSettings.jpg" alt="OBS Audio Settings"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Instead of using the VoiceMeeter names I renamed them in the mixer so it's clear what both channels are. I've set the volume of the mic a little bit higher than the rest of the audio.&lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Ftimmykokke.com%2Fimages%2F2019%2F07%2FOBSMixer.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Ftimmykokke.com%2Fimages%2F2019%2F07%2FOBSMixer.jpg" alt="OBS Mixer"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;To make my voice a little bit better I've added a couple of filters to the mic. In OBS you can use VST Plugins. These are plugins that are very common in audio programs. I'm using the free &lt;a href="https://www.reaper.fm/reaplugs/" rel="noopener noreferrer"&gt;Reaper VST plugins&lt;/a&gt; to improve the audio. The settings are not perfected yet and I'm constantly improving them to create a better sound.&lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Ftimmykokke.com%2Fimages%2F2019%2F07%2FOBSVoiceFilters.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Ftimmykokke.com%2Fimages%2F2019%2F07%2FOBSVoiceFilters.jpg" alt="OBS Voice Filters"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If you don't care too much, you only need the first. This is a &lt;em&gt;noise gate&lt;/em&gt;. A noise gate creates a minimum level of audio to be used. If the audio is below this threshold the audio is muted. This removes any noise the mic might pick up when you are not talking. I've used the one that came with OBS. You'll have to play a little bit with the settings to find the settings that are right for you.&lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Ftimmykokke.com%2Fimages%2F2019%2F07%2FOBSNoiseGateSettings.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Ftimmykokke.com%2Fimages%2F2019%2F07%2FOBSNoiseGateSettings.jpg" alt="OBS Noise Gate Settings"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Noise Suppression&lt;/em&gt; is the second most important filter I use. This filter removes a lot of the noise at the times you are talking. There's always a lot of background noise coming from my PC. Noise suppression takes care of that. In this case, I'm using the ReaFir VST. You can train this to create a noise profile and use that to remove it while talking. I've also created a second noise suppression profile for when my fan is blowing. I'd rather not use this one since there's a lot of suppression going, which affects the sound a lot. These are the settings I use normally:&lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Ftimmykokke.com%2Fimages%2F2019%2F07%2FOBSReaperNoiseSuppression.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Ftimmykokke.com%2Fimages%2F2019%2F07%2FOBSReaperNoiseSuppression.jpg" alt="OBS Noise Suppression Settings"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Compression&lt;/em&gt; is used to balance the louder and quieter moments while speaking. This makes sure the audio doesn't get distorted when talking too loud, while also boosting a bit when talking softly.&lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Ftimmykokke.com%2Fimages%2F2019%2F07%2FOBSReaperCompression.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Ftimmykokke.com%2Fimages%2F2019%2F07%2FOBSReaperCompression.jpg" alt="OBS Compression Settings"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The last filter I use &lt;em&gt;EQ&lt;/em&gt;. This filter is used to boost or suppress frequencies. Both the compressor and EQ filters are in constant motion, I tweak these a lot during streams.&lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Ftimmykokke.com%2Fimages%2F2019%2F07%2FOBSReaperEQ.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Ftimmykokke.com%2Fimages%2F2019%2F07%2FOBSReaperEQ.jpg" alt="OBS EQ Settings"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;There are a lot of tutorials on these VSTs available on YouTube. Like this one from &lt;a href="https://www.youtube.com/watch?v=ZbnPiPjyfXs" rel="noopener noreferrer"&gt;Tuts+ Music &amp;amp; Audio&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Video
&lt;/h2&gt;

&lt;p&gt;The first purchases I made for the stream, I think even before my first stream, was a webcam.&lt;br&gt;
From the start, I've been using a Logitech C920 Webcam. The quality of this camera is pretty good, for its price. It is very easy to set up. Just plug in the USB and you are good to go.&lt;/p&gt;

&lt;p&gt;In OBS I have 1 webcam source I use everywhere. It is a bit laggy when started and I don't want it to restart when switching scenes.&lt;/p&gt;

&lt;p&gt;For settings. On the webcam settings, I disabled all of the auto adjustments. I don't want anything to change outside of my control. I'm not moving around so the focus doesn't have to change. And I have people control my lighting through chat, therefore I want to keep white balance and exposure always the same. The only problem I'm having with these settings is that they are reset now and then.&lt;/p&gt;

&lt;p&gt;In OBS I've added a couple of filters on the camera as well.&lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Ftimmykokke.com%2Fimages%2F2019%2F07%2FOBSWebcamFilters.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Ftimmykokke.com%2Fimages%2F2019%2F07%2FOBSWebcamFilters.jpg" alt="OBS Webcam Filters"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The only one that is making a real difference is &lt;em&gt;color correction&lt;/em&gt;. You'll have to play with these settings yourself to see what you like.&lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Ftimmykokke.com%2Fimages%2F2019%2F07%2FOBSWebcamColorCorrection.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Ftimmykokke.com%2Fimages%2F2019%2F07%2FOBSWebcamColorCorrection.jpg" alt="OBS Webcam Color Correction"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I think that without color correction the video seems a bit too gray.&lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Ftimmykokke.com%2Fimages%2F2019%2F07%2FWebCamWithoutColorCorrection.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Ftimmykokke.com%2Fimages%2F2019%2F07%2FWebCamWithoutColorCorrection.jpg" alt="OBS Webcam without Color Correction"&gt;&lt;/a&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Ftimmykokke.com%2Fimages%2F2019%2F07%2FWebCamWithColorCorrection.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Ftimmykokke.com%2Fimages%2F2019%2F07%2FWebCamWithColorCorrection.jpg" alt="OBS Webcam Color with Correction"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The other two filters I use are a &lt;em&gt;crop&lt;/em&gt; for changing the width of the video a bit to make it better fit my layouts and I also add a little tiny bit of sharpness (0.05).&lt;/p&gt;

&lt;h2&gt;
  
  
  Lights
&lt;/h2&gt;

&lt;p&gt;At the moment I'm using 3 lights during my stream. 2 of them can be controlled by the viewers by giving a !light command in the chat.&lt;/p&gt;

&lt;p&gt;I use these lights:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.ikea.com/us/en/catalog/products/20353289/" rel="noopener noreferrer"&gt;IKEA RGB&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.ikea.com/us/en/catalog/products/80339436/" rel="noopener noreferrer"&gt;IKEA White&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.amazon.com/Dimmable-Digital-Camcorder-Panasonic-Samsung/dp/B004TJ6JH6/ref=pd_lpo_sbs_421_t_0?_encoding=UTF8&amp;amp;psc=1&amp;amp;refRID=7T2C979F6TKHCGE07PT2" rel="noopener noreferrer"&gt;Neewer CN-160&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I've got the white IKEA light pretty close to the left of me. The Neewer is a bit further away and pointed towards the wall to give a more diffuse light. The colored one is behind me, just outside the camera view and illuminates the back wall.&lt;/p&gt;

&lt;p&gt;I bought the IKEA light just to try them and see how they look. I've got a couple of Phillips Hue lights around the house as well. The great thing about the IKEA smart lights is that they connect to the base station of the Hue lights and can be controlled in the same way. If you have a Hue bridge you don't need to buy anything else but the light bulbs to use those.&lt;/p&gt;

&lt;h2&gt;
  
  
  OBS
&lt;/h2&gt;

&lt;p&gt;The application I use from the stream itself is &lt;a href="https://obsproject.com/" rel="noopener noreferrer"&gt;Open Broadcast Software or OBS&lt;/a&gt;. This program lets you create scenes, configure what you want to capture and cast it to various sources, like Twitch or YouTube.&lt;/p&gt;

&lt;p&gt;I've never used any other program for streaming. I'm using it to stream to Twitch, but I've also used it to stream to YouTube or record videos. You can have different setups stored and it is easy to switch between them.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Ftimmykokke.com%2Fimages%2F2019%2F07%2FOBSTotal.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Ftimmykokke.com%2Fimages%2F2019%2F07%2FOBSTotal.jpg" alt="OBS Total"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Scenes
&lt;/h3&gt;

&lt;p&gt;OBS makes use of scenes. Scenes are what you see when watching the stream. They build out of various sources like the webcam, desktop capture, animations, texts, and browser windows.&lt;/p&gt;

&lt;p&gt;I recently cleaned up the scenes and the sources. It was a mess with all kinds of old, unused and hidden sources. I created 2 scenes that are reused in various other scenes, &lt;em&gt;alerts&lt;/em&gt;, and &lt;em&gt;texts&lt;/em&gt;. I also added color so I can quickly see what sources are where in the seen. To be sure I don't accidentally move a source, I locked everything.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Ftimmykokke.com%2Fimages%2F2019%2F07%2FOBSScenesDetail.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Ftimmykokke.com%2Fimages%2F2019%2F07%2FOBSScenesDetail.jpg" alt="OBS Scenes detail"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;Pre stream&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;A few minutes before I go live I already start the stream. I send a tweet out at the same time. At this moment my followers are informed that I went live. Having a count down or waiting room gives everyone a few minutes to come in before I start.&lt;/p&gt;

&lt;p&gt;I don't always use the timer. If it's very short or a weird number of minutes before I go live I hide the timer. I added a ticker that shows random texts, just for fun. This is a browser window that's coming from my layouts application.&lt;/p&gt;

&lt;p&gt;The chat is an overlay coming from StreamLabs. I styled it to look similar to the theme I'm using in VSCode.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Ftimmykokke.com%2Fimages%2F2019%2F07%2FOBSPreStream.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Ftimmykokke.com%2Fimages%2F2019%2F07%2FOBSPreStream.jpg" alt="OBS Pre stream"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;Pre stream - Webcam&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;When I start the stream I welcome everyone to the stream using this scene. It has chat and a big webcam view.&lt;br&gt;
I kept the 'almost there' text in there so when people pass by the stream the know I'm about to start.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Ftimmykokke.com%2Fimages%2F2019%2F07%2FOBSPreStream-Webcam.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Ftimmykokke.com%2Fimages%2F2019%2F07%2FOBSPreStream-Webcam.jpg" alt="OBS Pre stream Webcam"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;Regular Stream&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;This scene is what is used most during the stream. It has chat, webcam and a view of the desktop. The background animation in this scene has a mask and is actually on top of the webcam and the desktop view. I want to cut off my Windows taskbar and the easiest way of doing that is just hiding it. I tried using a transparent animation but that was way too CPU intensive, so I used the same MP4 but added a mask filter to it with a black and white image.&lt;/p&gt;

&lt;p&gt;This scene has everything else going as well, the exploding emotes, alerts and the music player.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Ftimmykokke.com%2Fimages%2F2019%2F07%2FOBSRegularStream.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Ftimmykokke.com%2Fimages%2F2019%2F07%2FOBSRegularStream.jpg" alt="OBS Regular Stream"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;Regular Stream - Webcam&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;This scene is the same as the previous one but has the webcam and desktop views switched.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Ftimmykokke.com%2Fimages%2F2019%2F07%2FOBSRegularStream-Webcam.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Ftimmykokke.com%2Fimages%2F2019%2F07%2FOBSRegularStream-Webcam.jpg" alt="OBS Regular Stream Webcam"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;Be Right Back&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Sometimes I'm interrupted and need to leave the computer for a few minutes. It rarely happens, but when it does I use the Be Right Back scene. I've got the chat and the alerts there.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Ftimmykokke.com%2Fimages%2F2019%2F07%2FOBSAFK.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Ftimmykokke.com%2Fimages%2F2019%2F07%2FOBSAFK.jpg" alt="OBS AFK"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;Post Stream - Webcam&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;When the stream ends I switch to this scene. It has a big webcam view and the end credits to the side. The end credits are coming from my layouts. It doesn't have a chat, but still has alerts.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Ftimmykokke.com%2Fimages%2F2019%2F07%2FOBSPostStream-Webcam.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Ftimmykokke.com%2Fimages%2F2019%2F07%2FOBSPostStream-Webcam.jpg" alt="OBS Post stream Webcam"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;Post Stream&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The last scene is similar to the previous but without the webcam. Sometimes I want to have the stream running a little bit longer, for example when I raid someone. When the raid happens I switch to this scene. The raid is not recorded by Twitch, but the normal stream is. This way you won't see my moving around but still have a few seconds extra when watching the VOD.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Ftimmykokke.com%2Fimages%2F2019%2F07%2FOBSPostStream.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Ftimmykokke.com%2Fimages%2F2019%2F07%2FOBSPostStream.jpg" alt="OBS Post Stream"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Control
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;StreamDeck&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;One of the most used pieces of hardware among streamers is the &lt;a href="https://www.elgato.com/en/gaming/stream-deck" rel="noopener noreferrer"&gt;Elgato Stream Deck&lt;/a&gt;. This is a device with programmable buttons. Each button is a small display that can show information. The device is very powerful. I can't live without it anymore.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Ftimmykokke.com%2Fimages%2F2019%2F07%2FStreamDeck.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Ftimmykokke.com%2Fimages%2F2019%2F07%2FStreamDeck.jpg" alt="Stream Deck"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The Stream Deck has a couple of great features I use very often. The first one is the ability to trigger multiple things with 1 button, a &lt;em&gt;Multi-Action&lt;/em&gt;. I use this for example to start all applications I need for streaming, or to change a scene in OBS and mute the Mic at the same time. I also have a couple of Multi Actions that I use when I go live. These send out tweets, set the title of the stream on Twitch, select the right scene in OBS and trigger OBS to start the stream.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Ftimmykokke.com%2Fimages%2F2019%2F07%2FStreamDeckGoLive.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Ftimmykokke.com%2Fimages%2F2019%2F07%2FStreamDeckGoLive.jpg" alt="Stream Deck go Live"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Bot &amp;amp; Tools
&lt;/h2&gt;

&lt;p&gt;To have a little automated help (and fun) I created my personal stream maid, &lt;a href="https://github.com/sorskoot/RosieBot/" rel="noopener noreferrer"&gt;Rosie the Chatbot&lt;/a&gt; in Node.js. She is inspired by the maid in the old cartoon The Jetsons. During the steam and in between I add commands and features to this bot.&lt;/p&gt;

&lt;p&gt;To give an example, I created the !light commands. These commands use the Phillips Hue API on my local network to change the color of the light behind me. This light is also triggered when events happen during the stream.&lt;/p&gt;

&lt;p&gt;Also, the sound effects are a lot of fun. These use Midi notes to trigger the effects in SoundByte. I also use Midi to lower the volume of the music playing during events.&lt;/p&gt;

&lt;p&gt;I integrated Rosie with the &lt;a href="https://www.qnamaker.ai/" rel="noopener noreferrer"&gt;Microsoft QnA platform&lt;/a&gt;. When a question is asked in chat, Rosie does a call to this service to see if there's an answer to frequently asked questions. For example what theme I'm using in VSCode or when my next stream is.&lt;/p&gt;

&lt;p&gt;During the stream, I also run another Node.js application that is responsible for the overlays in OBS. The exploding emotes and even the music is run from here. For the music, I create a player without controls that just plays a random song from a folder. I have another page that is connected through WebSockets to control the music. I use the web audio API to create the visuals of the audio.&lt;/p&gt;

&lt;h2&gt;
  
  
  Closing
&lt;/h2&gt;

&lt;p&gt;I think that's about it. If I forgot something I'll add it. Feel free to ask any questions about the setup, Rosie or layouts during my streams. I'm happy to help. So come and visit me at &lt;a href="https://twitch.tv/sorskoot" rel="noopener noreferrer"&gt;twitch.tv/sorskoot&lt;/a&gt; or join &lt;a href="https://discord.gg/J3j43p8" rel="noopener noreferrer"&gt;the discord&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>twitch</category>
      <category>streamdeck</category>
      <category>obs</category>
      <category>voicemeeter</category>
    </item>
    <item>
      <title>🎃 Halloween Scream Stream👻: Making of</title>
      <dc:creator>𝓢𝓸𝓻𝓼𝓴𝓸𝓸𝓽🌷</dc:creator>
      <pubDate>Wed, 06 Nov 2019 14:43:36 +0000</pubDate>
      <link>https://forem.com/sorskoot/halloween-scream-stream-making-of-40m0</link>
      <guid>https://forem.com/sorskoot/halloween-scream-stream-making-of-40m0</guid>
      <description>&lt;p&gt;This week was Halloween 🎃 and I wanted to do something special for the stream this time. I wanted to make everything a bit more spooky. So, I added some simple effects to the stream, created some spooky music and eventually added a few new shaders and wrote a horror script to end the stream with. This is what was added and how it was done. I hope this post will give you some ideas for your own streams. I might create some detailed tutorials on how to create the effects used in the future.&lt;/p&gt;

&lt;h2&gt;
  
  
  Look and feel
&lt;/h2&gt;

&lt;p&gt;For the look and feel of the Halloween stream, I wanted to create an effect inspired by the dark world called the &lt;em&gt;upside down&lt;/em&gt; from the Stranger Things series.&lt;/p&gt;

&lt;h3&gt;
  
  
  Overlays
&lt;/h3&gt;

&lt;p&gt;I wanted to keep my overlays the same as normal as much as possible, with only a few added animations. I went searching and found a few animated gifs of smoke and floating particles I liked. Unfortunately, these had a black background instead of a green one. A green background can be removed pretty well using a chroma key filter in OBS. But, it turned out a black background can be removed as well. And since these gifs were black and white, the white parts stayed which gave me the look I wanted.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--rubBPIQW--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://timmykokke.com/images/2019/11/OBS-Halloween-Group.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--rubBPIQW--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://timmykokke.com/images/2019/11/OBS-Halloween-Group.png" alt="OBS Halloween Group"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;To make the combination of animations reusable, I created a new &lt;em&gt;scene&lt;/em&gt; in OBS. and added the animations in there.&lt;/p&gt;

&lt;p&gt;Then, in every other scene, I wanted to have the smoke and particles, I could just add a &lt;em&gt;scene source&lt;/em&gt; and reference that scene. This way, whenever I need to make changes to the Halloween scene, I could just change it in one place and everywhere it was used the reference would update.&lt;/p&gt;

&lt;p&gt;At some point, I noticed a higher than usual CPU usage in OBS. It turned out to be the chroma keying of the particle animation. I had to remove it to prevent possible issues while streaming.&lt;/p&gt;

&lt;h3&gt;
  
  
  Camera
&lt;/h3&gt;

&lt;p&gt;In normal streams, I've configured the colors of my camera to be vivid with the default lighting set to blue and purple. This didn't fit the theme for Halloween and wasn't spooky enough.&lt;/p&gt;

&lt;p&gt;I changed two things with regards to the camera. First, I had only the lights in front of me turned on. I made sure the lights stayed this way, I disabled the light commands in the chat (you can type !light with a color to change the color name during the streams). I place the main light on the floor next to me angled upwards. The other one is set to light my face a little bit from the other side.&lt;/p&gt;

&lt;p&gt;Second, I added a color LUT (lookup table) filter to the camera. Normally this is used to change the colors a bit and make the color pop just a little more, but in this case, I dramatically changed it and added a lot more blues while lowering the saturation. This created the look I wanted for the camera.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--VxYB-STo--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://timmykokke.com/images/2019/11/Halloween-webcam-screenshot.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--VxYB-STo--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://timmykokke.com/images/2019/11/Halloween-webcam-screenshot.png" alt="OBS Halloween WebCam"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Music
&lt;/h3&gt;

&lt;p&gt;My main choice for music is the songs from the Monstercat library. But these didn't fit the horror feel I wanted to have for my stream. I wanted to have very slow and long droning sounds. I remembered a tool call &lt;a href="http://hypermammut.sourceforge.net/paulstretch/"&gt;Paul Stretch&lt;/a&gt;. This tool can stretch audio into the extreme. I took a couple of famous horror movie themes, like the theme from the movie Halloween and made it about 20 times as long. This resulted in a couple of songs that were over 1 hour long. To finish them I added a bit of EQ and normalization to them so they all sounded similar.&lt;/p&gt;

&lt;h2&gt;
  
  
  The script
&lt;/h2&gt;

&lt;p&gt;Now that I had the look and feel down I wanted to do something special. I wanted to 'tell a story' during my stream, inspired by my favorite horror movies. I came up with a story of an old haunted house. Every 66 years, with Halloween, the ghost would come back haunting the family living in the house at that time, which would result in a lot of unfortunate deaths.&lt;/p&gt;

&lt;p&gt;During the stream, I mentioned details of this story, like living in an old house and the big fire in the fall of 1953. The stream would start normal, except for the spooky atmosphere. I also mentioned the rain and thunder outside.&lt;/p&gt;

&lt;p&gt;1 hour before the end of the stream I started adding 'events' to the stream, supernatural events. It started with knocking sounds and children crying. I left my screen a few times with the camera running. With me gone or looking the other way, the camera glitches. The door would open by itself and when I'm gone to check it out and close it a black shadow moves past the camera.&lt;/p&gt;

&lt;p&gt;Near the end, the light flickers and a ghost is seen in the background after which I decide to end the stream and check on the family because I keep hearing noises. Again, knocking. So I stand up from my desk and the stream starts glitching and after a bone-chilling scream the stream cuts out.&lt;/p&gt;

&lt;h3&gt;
  
  
  Shaders
&lt;/h3&gt;

&lt;p&gt;A month ago I &lt;a href="https://timmykokke.com/post/2019-10-01-hueshiftshaderobs/"&gt;create a shader&lt;/a&gt; for use in OBS. I decided to do the same again and create a couple of different shaders. I used a tool called &lt;a href="https://hexler.net/products/kodelife"&gt;KodeLife&lt;/a&gt; to create the shaders. I've added 2 custom shaders and used 1 that came with the OBS shader plugin. Both shaders I created are not that complex.&lt;/p&gt;

&lt;p&gt;I wanted to create a shader that would separate the RGB colors as you would sometime see on old CRT TVs.&lt;/p&gt;

&lt;p&gt;This clip from the stream shows the effect around the 15s mark.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://clips.twitch.tv/AmazonianEagerDiscKappaClaus"&gt;Twich Clip of RGB Effect&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The shader is activated only when a semi-random value gets above a certain threshold. At that point, the Red channel shifts a bit to the left and the Blue channel a bit to the right. Below is the shader itself.&lt;/p&gt;


&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;


&lt;p&gt;The other shader I created renders noise and randomizes when it is shown and how much. Again with a certain threshold and a specified speed.&lt;/p&gt;


&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;


&lt;h3&gt;
  
  
  The ghost
&lt;/h3&gt;

&lt;p&gt;The ghost appears two times during the stream. The first time it passes the bottom of the screen as a dark shadow. This was created by overlaying a transparent animation on top of the camera.&lt;/p&gt;

&lt;p&gt;The second appearance was a bit more work. To create the effect of the ghost appearing behind me, I took a screenshot of the webcam without the lights on, but with me looking into the camera. I opened it in Photoshop and added a figure in the back. Looking at the picture itself it looks too fake.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--u8JcvbO9--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://timmykokke.com/images/2019/11/Shadowperson.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--u8JcvbO9--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://timmykokke.com/images/2019/11/Shadowperson.jpg" alt="Ghost standing behind me"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;But, when I added the image to a scene in OBS (behind the camera) and added a flickering effect to the webcam on the alpha channel you just got to see it few milliseconds at a time.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://clips.twitch.tv/HelpfulCrazyWalletCmonBruh"&gt;Twich Clip of Ghost Appearing&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I added a sound effect as well. It really looks like there's some glitch in the lighting. By this time during the stream, I was actually getting the chills, because of the weird lighting and the droning sounds.&lt;/p&gt;

&lt;h3&gt;
  
  
  Timing the events
&lt;/h3&gt;

&lt;p&gt;For the timing of everything that was happening during the stream, I created a custom tool that was running in the background. This was a &lt;em&gt;very&lt;/em&gt; simple web application that would show me a message and execute a function after a specific time had passed.&lt;/p&gt;

&lt;p&gt;The tool reminded me to mention the 'storm' outside and the question of the day. I wanted to talk about horror movies during the stream a bit to try and influence the minds of my viewers. At some point,it started playing audio of knocking and children crying. It should be a message that it played the sound and reminded me what to do. At first, only listen, but later switch to certain scenes to show the glitches.&lt;/p&gt;

&lt;p&gt;The entire code of this app is available at the &lt;a href="https://github.com/sorskoot/TwitchHalloweenSpecial2019"&gt;Halloween Stream Repo&lt;/a&gt; on my Github.&lt;/p&gt;

&lt;p&gt;I might reuse this application and add it to a bigger application I'm planning to create reminders and such for during my stream.&lt;/p&gt;

&lt;p&gt;I also needed to automate a few things in OBS, because I didn't want to trigger things noticeably. There's a plugin for OBS that can help, &lt;a href="https://obsproject.com/forum/resources/advanced-scene-switcher.395/"&gt;Advanced Scene Switcher&lt;/a&gt;. There's an option in this plugin that lets you create sequences, it automates going to a specific scene after some time.&lt;/p&gt;

&lt;p&gt;img-link "/images/2019/11/Horror-scenes.png" "list of horror scenes in OBS" &lt;/p&gt;

&lt;p&gt;I wanted to have a little bit of time before a scene or glitch happened so I added 'pre'-scene to a glitch and timed it to the sequence. This way I could switch to a fullscreen camera, leave and then have a glitch occur. I also used this in the end. Right as I stand up I hit the last button, I stand up and grab my headphones. This way I created the illusion I didn't hit any buttons when the final malfunction happened because my hands are clearly visible.&lt;/p&gt;

&lt;p&gt;I programmed everything into my stream deck and the special tool reminded me what to do.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s---dpbbleo--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://timmykokke.com/images/2019/11/Halloween-Streamdeck.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s---dpbbleo--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://timmykokke.com/images/2019/11/Halloween-Streamdeck.png" alt="GActions on my stream deck"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Wrap up
&lt;/h2&gt;

&lt;p&gt;I had a lot of fun creating the Halloween stream, even though a few things went differently than planned. I think I created the atmosphere I wanted, I actually was on edge during the stream. I did, however, forgot my lines during the end sequence and forgot to mention there was someone at the door again.&lt;/p&gt;

&lt;p&gt;If you like to watch the entire ending you can do so in this &lt;a href="https://www.twitch.tv/videos/502260124"&gt;highlight&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>twitch</category>
      <category>obs</category>
      <category>shaders</category>
      <category>halloween</category>
    </item>
  </channel>
</rss>
