<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="https://www.w3.org/2005/Atom">
  <channel>
    <title>Beepscore</title>
    <description>Beepscore LLC software development
</description>
    <link>https://beepscore.com/</link>
    <atom:link href="https://beepscore.com/feed.xml" rel="self" type="application/rss+xml"/>
    <pubDate>Mon, 15 May 2023 22:52:02 +0000</pubDate>
    <lastBuildDate>Mon, 15 May 2023 22:52:02 +0000</lastBuildDate>
    <generator>Jekyll v3.9.3</generator>
    
      <item>
        <title>How to change directory quickly with fasd</title>
        <description>&lt;figure&gt;
    &lt;img src=&quot;https://beepscore.com/assets/change-directory/fasd.png&quot; alt=&quot;fasd terminal window&quot; /&gt;
    &lt;figcaption&gt;
        fasd output shows files sorted by &quot;frecency&quot;
    &lt;/figcaption&gt;
&lt;/figure&gt;

&lt;h1 id=&quot;fasd&quot;&gt;fasd&lt;/h1&gt;
&lt;p&gt;fasd automatically builds a list of directories and files, sorted by “frecency”.
fasd is a newer alternative to autojump.&lt;/p&gt;

&lt;p&gt;You can change directory via command alias “z”&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;z &amp;lt;directory path last component&amp;gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;e.g.&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;z my_project
pwd
/Users/stevebaker/Documents/projects/python_projects/my_project
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h2 id=&quot;how-to-install&quot;&gt;how to install&lt;/h2&gt;
&lt;p&gt;On macOS you can install via Homebrew:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;brew install fasd
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h1 id=&quot;references&quot;&gt;References&lt;/h1&gt;

&lt;h3 id=&quot;fasd&quot;&gt;fasd&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/clvv/fasd&quot;&gt;https://github.com/clvv/fasd&lt;/a&gt;&lt;/p&gt;

&lt;h3 id=&quot;terminal-fasd&quot;&gt;Terminal users, fasd is worth learning&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;https://rm-rf.ca/posts/2020/fasd/&quot;&gt;https://rm-rf.ca/posts/2020/fasd/&lt;/a&gt;&lt;/p&gt;

&lt;h3 id=&quot;fasd-commandline&quot;&gt;Fasd – A Commandline Tool That Offers Quick Access to Files and Directories&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;https://www.tecmint.com/fasd-quick-access-to-linux-files-and-directories/&quot;&gt;https://www.tecmint.com/fasd-quick-access-to-linux-files-and-directories/&lt;/a&gt;&lt;/p&gt;

&lt;h3 id=&quot;autojump&quot;&gt;autojump&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/wting/autojump&quot;&gt;https://github.com/wting/autojump&lt;/a&gt;&lt;/p&gt;

</description>
        <pubDate>Sat, 09 May 2020 02:35:00 +0000</pubDate>
        <link>https://beepscore.com/website/2020/05/09/how-to-change-directory-quickly-with-fasd.html</link>
        <guid isPermaLink="true">https://beepscore.com/website/2020/05/09/how-to-change-directory-quickly-with-fasd.html</guid>
        
        
        <category>website</category>
        
      </item>
    
      <item>
        <title>How to change directory quickly with vifm</title>
        <description>&lt;figure&gt;
    &lt;img src=&quot;https://beepscore.com/assets/change-directory/vifm.png&quot; alt=&quot;vifm terminal window&quot; /&gt;
    &lt;figcaption&gt;
        vifm and vicd
    &lt;/figcaption&gt;
&lt;/figure&gt;

&lt;h1 id=&quot;vifm&quot;&gt;vifm&lt;/h1&gt;
&lt;p&gt;vifm is a file manager similar to ranger, but supports vim-like keybindings.&lt;/p&gt;

&lt;h2 id=&quot;vicd&quot;&gt;vicd&lt;/h2&gt;
&lt;p&gt;The vifm wiki shows how to add custom command vicd to change directory easily.
You may add this to the .zshrc file.&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;vicd()
{
    local dst=&quot;$(command vifm --choose-dir - &quot;$@&quot;)&quot;
    if [ -z &quot;$dst&quot; ]; then
        echo 'Directory picking cancelled/failed'
        return 1
    fi
    cd &quot;$dst&quot;
}
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Usage: in terminal shell type vicd to open vifm.
Select a directory, press enter.
:q exits vifm and changes directory.
:cq exits vifm without changing directory.&lt;/p&gt;

&lt;h2 id=&quot;how-to-install&quot;&gt;how to install&lt;/h2&gt;
&lt;p&gt;On macOS you can install via Homebrew:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;brew install vifm
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h1 id=&quot;references&quot;&gt;References&lt;/h1&gt;

&lt;h3 id=&quot;vifm&quot;&gt;vifm&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/vifm/vifm&quot;&gt;https://github.com/vifm/vifm&lt;/a&gt;&lt;/p&gt;

&lt;h3 id=&quot;vicd&quot;&gt;vicd for vifm&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;https://wiki.vifm.info/index.php/How_to_set_shell_working_directory_after_leaving_Vifm&quot;&gt;https://wiki.vifm.info/index.php/How_to_set_shell_working_directory_after_leaving_Vifm&lt;/a&gt;&lt;/p&gt;

&lt;h3 id=&quot;ranger&quot;&gt;ranger&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/ranger/ranger&quot;&gt;https://github.com/ranger/ranger&lt;/a&gt;&lt;/p&gt;

</description>
        <pubDate>Sat, 09 May 2020 02:21:00 +0000</pubDate>
        <link>https://beepscore.com/website/2020/05/09/how-to-change-directory-quickly-with-vifm.html</link>
        <guid isPermaLink="true">https://beepscore.com/website/2020/05/09/how-to-change-directory-quickly-with-vifm.html</guid>
        
        
        <category>website</category>
        
      </item>
    
      <item>
        <title>How to change directory quickly with pushd</title>
        <description>&lt;h1 id=&quot;pushd&quot;&gt;pushd&lt;/h1&gt;
&lt;p&gt;pushd changes directory similar to cd, but it also pushes the directory onto a navigation stack.
Then you can use the stack to change to any previous directory.&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;pushd ~/Documents/projects/python_projects/my_project
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;To show the directory stack:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;dirs -v
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Example output&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;0  ~/Documents/projects/ios_projects
1  ~/Documents/Beepscore/Eng/programming_info/HardwareInfo/raspberry_pi_info
2  ~/Documents/projects/python_projects/my_project
3  ~/dotfiles
4  ~
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;You can change directory by referencing its number on the current stack:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;pushd -2
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h2 id=&quot;shell-script&quot;&gt;shell script&lt;/h2&gt;
&lt;p&gt;I wrote a script file to push several directory names onto the stack.
Then to run the script at start, in macOS iTerm / Preferences / Profiles / Command / Login Shell / Send text at start, enter&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;source &amp;lt;script name&amp;gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;For example&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;source ~/bin/terminal_start.zsh
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;figure&gt;
    &lt;img src=&quot;https://beepscore.com/assets/change-directory/iterm-source-shell-script.png&quot; alt=&quot;iterm source shell script&quot; /&gt;
    &lt;figcaption&gt;
        iterm source shell script
    &lt;/figcaption&gt;
&lt;/figure&gt;

&lt;h3 id=&quot;example-shell-script&quot;&gt;example shell script&lt;/h3&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;#!/usr/bin/env zsh
# run as &quot;source terminal_start.zsh&quot; so that commands will have effect in outer shell outside of subshell.
# https://stackoverflow.com/questions/255414/why-doesnt-cd-work-in-a-shell-script

# shellcheck suggests add || return in case pushd fails
printf &quot;%s\n&quot; &quot;&quot;
printf &quot;%s\n&quot; &quot;pushd  push onto directory stack and change directory&quot;
pushd ~/dotfiles || return
pushd ~/Documents/projects/python_projects/my_project || return
pushd ~/Documents/Beepscore/Eng/programming_info/HardwareInfo/raspberry_pi_info || return
pushd ~/Documents/projects/ios_projects || return

# prefer printf over echo
# https://unix.stackexchange.com/questions/65803/why-is-printf-better-than-echo/65819#65819
# https://unix.stackexchange.com/questions/58310/difference-between-printf-and-echo-in-bash?noredirect=1&amp;amp;lq=1
printf &quot;%s\n&quot; &quot;&quot;
printf &quot;%s\n&quot; &quot;dirs -v show directory stack&quot;
dirs -v

printf &quot;%s\n&quot; &quot;&quot;
printf &quot;%s\n&quot; &quot;pushd toggle between 2 most recent, similar to cd -. Note this changes stack numbering.&quot;
printf &quot;%s\n&quot; &quot;pushd -n navigate to directory number n. Note this changes stack numbering.&quot;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h2 id=&quot;script-disadvantages&quot;&gt;script disadvantages&lt;/h2&gt;
&lt;p&gt;The startup script requires maintenance.
If you start working on a new project using new directories, you must manually edit the script.&lt;/p&gt;

&lt;h2 id=&quot;how-to-install&quot;&gt;how to install&lt;/h2&gt;
&lt;p&gt;pushd is a standard command, no need to install a package.&lt;/p&gt;

&lt;h1 id=&quot;references&quot;&gt;References&lt;/h1&gt;

&lt;h3 id=&quot;pushd-popd&quot;&gt;Use 'pushd' and 'popd' for Efficient Filesystem Navigation in Linux&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;https://www.tecmint.com/pushd-and-popd-linux-filesystem-navigation/&quot;&gt;https://www.tecmint.com/pushd-and-popd-linux-filesystem-navigation/&lt;/a&gt;&lt;/p&gt;

&lt;h3 id=&quot;pushd-popd-cd&quot;&gt;pushd, popd vs cd, cd- in bash and zsh&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;https://unix.stackexchange.com/questions/272965/pushd-popd-vs-cd-cd-in-bash-and-zsh&quot;&gt;https://unix.stackexchange.com/questions/272965/pushd-popd-vs-cd-cd-in-bash-and-zsh&lt;/a&gt;&lt;/p&gt;

&lt;h3 id=&quot;pushd-popd-wiki&quot;&gt;pushd and popd&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;https://en.wikipedia.org/wiki/Pushd_and_popd&quot;&gt;https://en.wikipedia.org/wiki/Pushd_and_popd&lt;/a&gt;&lt;/p&gt;

</description>
        <pubDate>Sat, 09 May 2020 01:23:00 +0000</pubDate>
        <link>https://beepscore.com/website/2020/05/09/how-to-change-directory-quickly-with-pushd.html</link>
        <guid isPermaLink="true">https://beepscore.com/website/2020/05/09/how-to-change-directory-quickly-with-pushd.html</guid>
        
        
        <category>website</category>
        
      </item>
    
      <item>
        <title>How to change directory quickly</title>
        <description>&lt;figure&gt;
    &lt;img src=&quot;https://beepscore.com/assets/change-directory/vifm.png&quot; alt=&quot;vifm terminal window&quot; /&gt;
    &lt;figcaption&gt;
        vifm and vicd
    &lt;/figcaption&gt;
&lt;/figure&gt;

&lt;figure&gt;
    &lt;img src=&quot;https://beepscore.com/assets/change-directory/fasd.png&quot; alt=&quot;fasd terminal window&quot; /&gt;
    &lt;figcaption&gt;
        fasd
    &lt;/figcaption&gt;
&lt;/figure&gt;

&lt;h1 id=&quot;cd&quot;&gt;cd&lt;/h1&gt;
&lt;p&gt;For years, when using the terminal shell I’ve used the “cd” command to change to a different directory.&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;cd  ~/Documents/projects/python_projects/my_project
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;cd is a standard command in macOS, Linux and Windows terminal, no need to install a package.&lt;/p&gt;

&lt;h2 id=&quot;cd-simple-shortcuts&quot;&gt;cd simple shortcuts&lt;/h2&gt;
&lt;h3 id=&quot;cd--&quot;&gt;cd -&lt;/h3&gt;
&lt;p&gt;Changes to previous directory. Can be used repeatedly to toggle between two directories.&lt;/p&gt;
&lt;h3 id=&quot;cd--drag-folder-&quot;&gt;cd &amp;lt; drag folder &amp;gt;&lt;/h3&gt;
&lt;p&gt;On macOS you can type “cd “ and then drag a directory folder from the Finder into the terminal to type the path.&lt;/p&gt;

&lt;h1 id=&quot;faster-ways-to-change-directory&quot;&gt;faster ways to change directory&lt;/h1&gt;
&lt;p&gt;Recently I’ve been using the shell more often, and changing between more directories.
Even with tab-completion, it is cumbersome to type “cd “ and then a long directory path.
So I started looking for more efficient ways to change the current directory.
Here are several alternatives:&lt;/p&gt;

&lt;h2 id=&quot;pushd&quot;&gt;pushd&lt;/h2&gt;
&lt;p&gt;pushd changes directory similar to cd, but it also pushes the directory onto a navigation stack.
Then you can use the stack to change to any previous directory.
pushd is a standard command in macOS and Linux, no need to install a package.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://beepscore.com/website/2020/05/09/how-to-change-directory-quickly-with-pushd.html&quot;&gt;How to change directory quickly with pushd&lt;/a&gt;&lt;/p&gt;

&lt;h2 id=&quot;vifm-and-vicd&quot;&gt;vifm and vicd&lt;/h2&gt;
&lt;p&gt;vifm is a file manager, and can be customized by adding a function like vicd to change directory easily.
vifm is similar to ranger, but supports vim-like keybindings.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://beepscore.com/website/2020/05/09/how-to-change-directory-quickly-with-vifm.html&quot;&gt;How to change directory quickly with vifm&lt;/a&gt;&lt;/p&gt;

&lt;h2 id=&quot;fasd&quot;&gt;fasd&lt;/h2&gt;
&lt;p&gt;fasd automatically builds a list of directories and files, sorted by “frecency” (frequency and recency).
You can set a command “z” and type z &amp;lt; directory path last component &amp;gt; to change directory.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://beepscore.com/website/2020/05/09/how-to-change-directory-quickly-with-fasd.html&quot;&gt;How to change directory quickly with fasd&lt;/a&gt;&lt;/p&gt;
</description>
        <pubDate>Sat, 09 May 2020 01:00:00 +0000</pubDate>
        <link>https://beepscore.com/website/2020/05/09/how-to-change-directory-quickly.html</link>
        <guid isPermaLink="true">https://beepscore.com/website/2020/05/09/how-to-change-directory-quickly.html</guid>
        
        
        <category>website</category>
        
      </item>
    
      <item>
        <title>How to Record Audio to a Computer Using an Audio Interface</title>
        <description>&lt;figure&gt;
    &lt;img src=&quot;https://beepscore.com/assets/automatically-detecting-television-commercials/audio-interface.png&quot; alt=&quot;Audio Interface, Focusrite Scarlett 2i4&quot; class=&quot;center&quot; /&gt;
    &lt;figcaption&gt;
        Audio Interface, Focusrite Scarlett 2i4
    &lt;/figcaption&gt;
&lt;/figure&gt;

&lt;h1 id=&quot;why-use-an-audio-interface&quot;&gt;Why use an audio interface?&lt;/h1&gt;
&lt;p&gt;An audio interface gives a cleaner signal than a computer microphone. It can eliminate room noise.
Musicians and podcasters use them with external instruments and microphones.
Also an audio interface may offer a way to send audio to a Raspberry Pi.&lt;/p&gt;

&lt;h1 id=&quot;application--tv_commercial_silencer&quot;&gt;Application- tv_commercial_silencer&lt;/h1&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/beepscore/tv_commercial_silencer&quot;&gt;tv_commercial_silencer&lt;/a&gt; monitors live audio, detects and automatically mutes commercials
It compares live audio input to a database of “acoustic fingerprints” generated from previously recorded commercials.&lt;/p&gt;

&lt;h2 id=&quot;recording-and-monitoring-television-audio&quot;&gt;recording and monitoring television audio&lt;/h2&gt;
&lt;figure&gt;
    &lt;img src=&quot;https://beepscore.com/assets/automatically-detecting-television-commercials/tv-recording-system.png&quot; alt=&quot;tv recording system&quot; class=&quot;center&quot; /&gt;
    &lt;figcaption&gt;
        Television stereo audio line level outputs to Focusrite Scarlett 2i4 audio interface.
    &lt;/figcaption&gt;
&lt;/figure&gt;

&lt;h3 id=&quot;configure-macos-to-use-audio-interface-input&quot;&gt;Configure macOS to use audio interface input&lt;/h3&gt;
&lt;p&gt;Go to System Preferences / Sound / Input.
Select the interface.&lt;/p&gt;

&lt;h3 id=&quot;configuring-raspberry-pi-raspbian-to-use-audio-interface-input&quot;&gt;Configuring Raspberry Pi Raspbian to use audio interface input&lt;/h3&gt;
&lt;p&gt;I’ve seen online reports of people doing this. I haven’t done it yet.&lt;/p&gt;

&lt;h3 id=&quot;digital-audio-workstation-daw&quot;&gt;Digital Audio Workstation (DAW)&lt;/h3&gt;
&lt;p&gt;In Ableton Live Lite I set the input as 1/2 for stereo.
Then I recorded audio, split and trimmed into individual clips, one per commercial.&lt;/p&gt;

&lt;h3 id=&quot;mp3-files&quot;&gt;mp3 files&lt;/h3&gt;
&lt;p&gt;I exported each clip as a mp3 file. mp3 maintains separate stereo channels.
In tv_commercial_silencer I stored the files locally in directory data/commercial_mp3.
The project .gitignore ignores the data directory and the recordings aren’t commited to the repository.&lt;/p&gt;

&lt;h1 id=&quot;appendix--audio-interface-configuration&quot;&gt;Appendix- audio interface configuration&lt;/h1&gt;

&lt;h2 id=&quot;input-jacks&quot;&gt;input jacks&lt;/h2&gt;
&lt;p&gt;These accept 1/4 inch (6.35 mm) diameter phone plugs.
Can use TR (tip ring, 2 contacts) or TRS (tip ring sleeve, 3 contacts)&lt;/p&gt;

&lt;h3 id=&quot;unbalanced-input&quot;&gt;unbalanced input&lt;/h3&gt;
&lt;p&gt;Ok for short cables &amp;lt; 20 foot long.
If you connect TR plug, connection is unbalanced mono.&lt;/p&gt;

&lt;h3 id=&quot;balanced-input&quot;&gt;balanced input&lt;/h3&gt;
&lt;p&gt;Good noise rejection over long cable runs.
Uses 1/4 inch phono plug TRS (tip ring sleeve 3 contacts)
One wire carries -1 * signal in another wire, third wire is ground.
If you connect a TRS plug, the interface attempts to process it as a mono “balanced” audio connection.&lt;/p&gt;

&lt;h3 id=&quot;how-to-connect-line-level-stereo-input&quot;&gt;how to connect line level stereo input&lt;/h3&gt;
&lt;p&gt;NOTE: 3 wire stereo output from television must be split out to 2 mono TR plugs, then each plugged in to channel 1 and 2.
I put TIP (gray) on channel 1 and RING (red) on channel 2.&lt;/p&gt;

&lt;h2 id=&quot;input-gain-knob&quot;&gt;input gain knob&lt;/h2&gt;
&lt;p&gt;Turn up as long as ring light is green.
If ring light turns red, amp is clipping. Reduce gain.
I set both channel 1 and channel 2 to approximately 1 o’clock position.&lt;/p&gt;

&lt;h2 id=&quot;input-switch&quot;&gt;input switch&lt;/h2&gt;
&lt;p&gt;For recording line input use LINE not INSTRUMENT.&lt;/p&gt;

&lt;h2 id=&quot;pad&quot;&gt;Pad&lt;/h2&gt;
&lt;p&gt;Attenuates input to avoid clipping. Don’t use unless necessary. I didn’t use it.&lt;/p&gt;

&lt;h2 id=&quot;direct-monitor-knob&quot;&gt;Direct monitor knob&lt;/h2&gt;
&lt;p&gt;Mixes between live input with no delay and playback which may have post-processing latency.&lt;/p&gt;

&lt;h2 id=&quot;direct-monitor-switch&quot;&gt;Direct monitor switch&lt;/h2&gt;
&lt;p&gt;Stereo.&lt;/p&gt;

&lt;h2 id=&quot;source-switch&quot;&gt;source switch&lt;/h2&gt;
&lt;p&gt;For headphones.
Can configure DAW so 1-2 monitors live input, 3-4 monitors playback.&lt;/p&gt;

&lt;h1 id=&quot;references&quot;&gt;References&lt;/h1&gt;

&lt;h2 id=&quot;audio-interface-focusrite-scarlett-2i4&quot;&gt;Audio interface, Focusrite Scarlett 2i4&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://focusrite.com/usb-audio-interface/scarlett/scarlett-2i4&quot;&gt;https://focusrite.com/usb-audio-interface/scarlett/scarlett-2i4&lt;/a&gt;&lt;/p&gt;

&lt;h3 id=&quot;support-download-files-including-user-guide-scarlett2i42ndgenugenv1pdf&quot;&gt;Support download files including User Guide scarlett2i42ndgenugenv1.pdf&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;https://customer.focusrite.com/support/downloads?product=Scarlett%202i4&quot;&gt;https://customer.focusrite.com/support/downloads?product=Scarlett%202i4&lt;/a&gt;&lt;/p&gt;

&lt;h3 id=&quot;guitar-center&quot;&gt;Guitar Center&lt;/h3&gt;
&lt;p&gt;I bought from &lt;a href=&quot;https://www.guitarcenter.com/&quot;&gt;Guitar Center&lt;/a&gt; in Redmond WA and got excellent in-person advice and technical support from salesperson Alex.&lt;/p&gt;

&lt;h2 id=&quot;digital-audio-workstation-daw-ableton-live-lite&quot;&gt;Digital Audio Workstation DAW, Ableton Live Lite&lt;/h2&gt;
&lt;p&gt;bundled with Focusrite audio interface&lt;/p&gt;

&lt;h2 id=&quot;python-data-analysis-to-automatically-detect-and-mute-television-commercials&quot;&gt;Python Data Analysis to Automatically Detect and Mute Television Commercials&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://beepscore.com/website/2019/04/21/automatically-detecting-television-commercials.html&quot;&gt;https://beepscore.com/website/2019/04/21/automatically-detecting-television-commercials.html&lt;/a&gt;&lt;/p&gt;

&lt;h2 id=&quot;tv_commercial_silencer&quot;&gt;tv_commercial_silencer&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/beepscore/tv_commercial_silencer&quot;&gt;https://github.com/beepscore/tv_commercial_silencer&lt;/a&gt;&lt;/p&gt;

&lt;h2 id=&quot;recording-multiple-microphones-in-python&quot;&gt;Recording multiple microphones in python&lt;/h2&gt;
&lt;p&gt;Discusses using PyAudio and Scarlett audio interface
&lt;a href=&quot;https://stackoverflow.com/questions/25620285/recording-multiple-microphones-in-python&quot;&gt;https://stackoverflow.com/questions/25620285/recording-multiple-microphones-in-python&lt;/a&gt;&lt;/p&gt;

</description>
        <pubDate>Mon, 22 Apr 2019 17:36:00 +0000</pubDate>
        <link>https://beepscore.com/website/2019/04/22/how-to-record-audio-to-computer-using-an-audio-interface.html</link>
        <guid isPermaLink="true">https://beepscore.com/website/2019/04/22/how-to-record-audio-to-computer-using-an-audio-interface.html</guid>
        
        
        <category>website</category>
        
      </item>
    
      <item>
        <title>Python Data Analysis to Automatically Detect and Mute Television Commercials</title>
        <description>&lt;figure&gt;
    &lt;img src=&quot;https://beepscore.com/assets/automatically-detecting-television-commercials/tv-commercial-muting-system.png&quot; alt=&quot;television, sound bar, audio interface, computer, raspberry pi&quot; /&gt;
    &lt;figcaption&gt;
        Television Commercial Muting System
    &lt;/figcaption&gt;
&lt;/figure&gt;

&lt;h1 id=&quot;project-evolution&quot;&gt;Project Evolution&lt;/h1&gt;
&lt;p&gt;
Initially I made a &lt;a href=&quot;https://beepscore.com/website/2019/02/03/raspberry-pi-infrared-remote-control-tv.html&quot;&gt;Raspberry Pi infrared remote control for a television sound bar&lt;/a&gt;.
Then I added a Flask web service for a &lt;a href=&quot;https://beepscore.com/website/2019/02/05/network-enabled-raspberry-pi-tv-remote-control.html&quot;&gt;network enabled Raspberry Pi tv remote control&lt;/a&gt;.
Then &lt;a href=&quot;https://beepscore.com/website/2019/02/11/raspberry-pi-mute-tv-commercials-automatically.html&quot;&gt;Raspberry Pi Mute TV Commercials Automatically&lt;/a&gt;
added stored pre-programmed television commercial times.
At scheduled times, the system made requests to the remote control service.
This approach fails if a show (perhaps a live show) varies the times it plays commercials.
&lt;/p&gt;

&lt;h1 id=&quot;automatic-commercial-detection&quot;&gt;Automatic Commercial Detection&lt;/h1&gt;
&lt;p&gt;
I considered several ways to automatically detect commercials, and then wrote &lt;a href=&quot;https://github.com/beepscore/tv_commercial_silencer&quot;&gt;tv_commercial_silencer&lt;/a&gt;.
It uses audio analysis &quot;acoustic fingerprinting&quot; similar to Shazam or SoundHound.
Then it makes requests to the remote control service to control the sound.
&lt;/p&gt;

&lt;h2 id=&quot;ways-to-automatcially-detect-commercials&quot;&gt;Ways to Automatcially Detect Commercials&lt;/h2&gt;
&lt;ul&gt;
  &lt;li&gt;supervised machine learning&lt;/li&gt;
  &lt;li&gt;closed-caption subtitle text&lt;/li&gt;
  &lt;li&gt;video analysis&lt;/li&gt;
  &lt;li&gt;audio analysis&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;supervised-machine-learning&quot;&gt;supervised machine learning&lt;/h2&gt;
&lt;p&gt;Record hundreds or thousands of short video files.
One or more humans categorize each video as “commercial” or “not commercial”.
Use the files and categorization as training data for supervised machine learning.
The computer can “watch” the video (perhaps by sampling images) and “listen” to the audio.
Then the model can generalize and categorize any video as commercial or not commercial.&lt;/p&gt;

&lt;p&gt;Someone told me they thought it would be difficult to train a model to be fast and accurate.
I realized perhaps this approach was unnecessarily ambitious!
I generally watch a small number of television shows.
The program doesn’t need to be able to recognize ANY television commercial, just the ones I’ve been seeing.&lt;/p&gt;

&lt;h2 id=&quot;closed-caption-subtitle-text&quot;&gt;closed-caption subtitle text&lt;/h2&gt;
&lt;p&gt;Create a set of words or phrases from commercials (e.g. ‘Lexus dealer’, ‘ask your doctor if’).
Parse the text stream and check phrases or words against the pre-defined set.
I think the text stream may be easier to access from NTSC television broadcasts than from cable HDMI.
CCExtractor may be able to extract text from pre-recorded video. I don’t know if the captions need to be visible in the video.&lt;/p&gt;

&lt;h2 id=&quot;video-analysis&quot;&gt;video analysis&lt;/h2&gt;
&lt;p&gt;Projects like Comskip analyze video files for things like black frames.
I think currently it requires a pre-recorded file as input.&lt;/p&gt;

&lt;h2 id=&quot;audio-analysis&quot;&gt;audio analysis&lt;/h2&gt;
&lt;p&gt;Shazam and SoundHound listen to microphone input to identify an audible song.
First they process each of many songs into “acoustic fingerprints” and store them in a database.
The acoustic fingerprint is based on a spectogram of sound intensity at different frequencies vs time.
Then to identify one song from microphone input they calculate its fingerprint and check for a match in the database.&lt;/p&gt;

&lt;h3 id=&quot;dejavu&quot;&gt;Dejavu&lt;/h3&gt;
&lt;p&gt;This wonderful library implements audio fingerprinting and recognition in Python.
It has recognizers for recorded files and for live microphone input.
Originally by worldveil/dejavu, forked by DataWookie/dejavu and &lt;a href=&quot;https://github.com/bcollazo/dejavu&quot;&gt;bcollazo/dejavu.&lt;/a&gt;
In 2019-03 bcollazo/dejavu appeared to be the most active fork.&lt;/p&gt;

&lt;h1 id=&quot;implementation--detecting-commercials-via-audio-analysis&quot;&gt;Implementation- Detecting Commercials via Audio Analysis&lt;/h1&gt;
&lt;p&gt;I wrote tv_commercial_silencer, it uses Dejavu.
&lt;a href=&quot;https://github.com/beepscore/tv_commercial_silencer&quot;&gt;https://github.com/beepscore/tv_commercial_silencer&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I added audio_recognizer.py with methods like recognize_audio_from_microphone:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;def recognize_audio_from_microphone(self, djv, seconds=5):
    &quot;&quot;&quot;
    method samples 'seconds' number of seconds
    :param djv: a dejavu instance, preconfigured by having run fingerprint_directory
    :param seconds: number of seconds to recognize audio
    :return: match_dict if confidence is &amp;gt;= confidence_minimum, else None
    &quot;&quot;&quot;
    match_dict = djv.recognize(MicrophoneRecognizer, seconds=seconds)
    logger.debug('match_dict: {}'.format(match_dict))
    # example output
    # 2019-04-22 17:47:34 DEBUG    recognize_audio_from_microphone line:79 match_dict:
    # {'song_id': 4, 'song_name': 'google-help-cooper', 'confidence': 146,
    # 'offset': 17, 'offset_seconds': 0.78948, 'file_sha1': '5b2709b5d22011c18f9a7b6ab7f04f0e89da4d41'}

    if match_dict is None:
        # &quot;Nothing recognized -- did you play the song out loud so your mic could hear it? :)&quot;
        return None

    else:
        # use confidence_minimum to help avoid false positives,
        # e.g. avoid algorithm accidentally matching to background noise with confidence ~ 10
        # by manual observation of logs, 100 seems overly conservative
        confidence_minimum = 40
        confidence = match_dict.get('confidence')

        if confidence is not None and confidence &amp;gt;= confidence_minimum:
            commercial_name = match_dict.get('song_name')
            duration_seconds = media_duration_dict.get(commercial_name)
            offset_seconds = match_dict.get('offset_seconds')
            duration_remaining_seconds = AudioRecognizer.time_remaining_seconds(duration_seconds,
                                                                                offset_seconds, seconds)

            duration_remaining_seconds_min = 8
            if duration_remaining_seconds &amp;gt;= duration_remaining_seconds_min:
                # duration_remaining_seconds is long enough for tv service
                # to emulate multiple remote control button presses.

                logger.debug('is_call_tv_service_enabled: {}'.format(self.is_call_tv_service_enabled))

                if self.is_call_tv_service_enabled:
                    # Don't call mute, too easy for app to get toggle confused
                    tv_service.volume_decrease_increase(duration_seconds=duration_remaining_seconds)

                    # disable calling tv service again until duration_remaining_seconds has elapsed
                    # this prevents multiple calls for one commercial
                    self.is_call_tv_service_enabled = False
                    # at run_date, scheduler will re-enable calling tv service
                    run_date = datetime.now() + timedelta(seconds=duration_remaining_seconds)
                    # add_job, implicitly create the trigger
                    # args is for function enable_call_tv_service
                    self.background_scheduler.add_job(self.enable_call_tv_service, 'date',
                                                      run_date=run_date, args=[True])

            return match_dict

    return None
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h2 id=&quot;acquiring-audio&quot;&gt;acquiring audio&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://beepscore.com/website/2019/04/22/how-to-record-audio-to-computer-using-an-audio-interface.html&quot;&gt;How to Record Audio to a Computer Using an Audio Interface&lt;/a&gt;
describes recording and monitoring television audio.
I stored the files locally in directory data/commercial_mp3.
The project .gitignore ignores the data directory and the recordings aren’t commited to the repository.&lt;/p&gt;

&lt;h2 id=&quot;first-test--play-mp3-file-through-computer-speakers-use-computer-microphone-as-input&quot;&gt;first test- play mp3 file through computer speakers, use computer microphone as input&lt;/h2&gt;
&lt;p&gt;I selected computer microphone as input.
I used QuickTime to loop play one of the commercial mp3 files through the computer speakers.
Then while the commercial was playing I ran:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;python3 audio_recognizer.py
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;It successfully recognizes commercials! Example output:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;2019-04-20 21:01:40 DEBUG    recognize_audio_from_microphone line:79
    From mic with 5 seconds we recognized: {&quot;song_id&quot;: 13, &quot;song_name&quot;: &quot;chantix&quot;, &quot;confidence&quot;: 376,
    &quot;offset&quot;: 525, &quot;offset_seconds&quot;: 24.38095,
    &quot;file_sha1&quot;: &quot;7050797273712b325559706c4d6878594238583866486d4b4371493d0a&quot;}
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h2 id=&quot;second-test--play-recorded-television-video-use-audio-interface-as-input&quot;&gt;second test- play recorded television video use audio interface as input&lt;/h2&gt;
&lt;p&gt;I selected sound input Scarlett 2i4 USB audio interface.
I played a recorded show on the television.
The program successfully recognized multiple different commercials and muted the audio.&lt;/p&gt;

&lt;h2 id=&quot;todo&quot;&gt;TODO:&lt;/h2&gt;

&lt;h3 id=&quot;consider-run-commercial-detection-on-raspberry-pi&quot;&gt;Consider run commercial detection on Raspberry Pi&lt;/h3&gt;
&lt;p&gt;Currently the commercial detection code is running on macOS.
See if a Raspberry Pi is fast enough to run commercial detection.
Could run code on the same Raspberry Pi running remy_python, or on a separate Raspberry Pi.&lt;/p&gt;

&lt;h1 id=&quot;references&quot;&gt;References&lt;/h1&gt;

&lt;h2 id=&quot;tv_commercial_silencer&quot;&gt;tv_commercial_silencer&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/beepscore/tv_commercial_silencer&quot;&gt;https://github.com/beepscore/tv_commercial_silencer&lt;/a&gt;&lt;/p&gt;

&lt;h2 id=&quot;remy_python&quot;&gt;remy_python&lt;/h2&gt;
&lt;p&gt;A Raspberry Pi infrared remote control. The Python app has three parts: Functions to send commands to the infrared transmitter. A Flask web service to accept television command requests (e.g. volume decrease, volume increase). A scheduler that automatically sends remote control commands at programmed times (e.g. mute during TV commercials).
&lt;a href=&quot;https://github.com/beepscore/remy_python&quot;&gt;https://github.com/beepscore/remy_python&lt;/a&gt;&lt;/p&gt;

&lt;h2 id=&quot;audio-analysis-1&quot;&gt;audio analysis&lt;/h2&gt;

&lt;h3 id=&quot;audio-fingerprinting-with-python-and-numpy&quot;&gt;Audio Fingerprinting with Python and Numpy&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;https://willdrevo.com/fingerprinting-and-audio-recognition-with-python/&quot;&gt;https://willdrevo.com/fingerprinting-and-audio-recognition-with-python/&lt;/a&gt;&lt;/p&gt;

&lt;h3 id=&quot;acoustic-fingerprint&quot;&gt;Acoustic Fingerprint&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;https://en.wikipedia.org/wiki/Acoustic_fingerprint&quot;&gt;https://en.wikipedia.org/wiki/Acoustic_fingerprint&lt;/a&gt;&lt;/p&gt;

&lt;h3 id=&quot;an-industrial-strength-audio-search-algorithm&quot;&gt;An Industrial-Strength Audio Search Algorithm&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;https://www.ee.columbia.edu/~dpwe/papers/Wang03-shazam.pdf&quot;&gt;https://www.ee.columbia.edu/~dpwe/papers/Wang03-shazam.pdf&lt;/a&gt;&lt;/p&gt;

&lt;h3 id=&quot;dejavu-1&quot;&gt;Dejavu&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/beepscore/dejavu/tree/beepscore&quot;&gt;https://github.com/beepscore/dejavu/tree/dejavu&lt;/a&gt;&lt;/p&gt;

&lt;h2 id=&quot;audio-interface&quot;&gt;Audio interface&lt;/h2&gt;

&lt;h3 id=&quot;how-to-record-audio-to-a-computer-using-an-audio-interface&quot;&gt;How to Record Audio to a Computer Using an Audio Interface&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;https://beepscore.com/website/2019/04/22/how-to-record-audio-to-computer-using-an-audio-interface.html&quot;&gt;https://beepscore.com/website/2019/04/22/how-to-record-audio-to-computer-using-an-audio-interface.html&lt;/a&gt;&lt;/p&gt;

&lt;h3 id=&quot;focusrite-scarlett-2i4&quot;&gt;Focusrite Scarlett 2i4&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;https://focusrite.com/usb-audio-interface/scarlett/scarlett-2i4&quot;&gt;https://focusrite.com/usb-audio-interface/scarlett/scarlett-2i4&lt;/a&gt;&lt;/p&gt;

&lt;h3 id=&quot;recording-multiple-microphones-in-python&quot;&gt;Recording multiple microphones in python&lt;/h3&gt;
&lt;p&gt;Discusses using PyAudio and Scarlett audio interface
&lt;a href=&quot;https://stackoverflow.com/questions/25620285/recording-multiple-microphones-in-python&quot;&gt;https://stackoverflow.com/questions/25620285/recording-multiple-microphones-in-python&lt;/a&gt;&lt;/p&gt;

&lt;h3 id=&quot;convert-multi-channel-pyaudio-into-numpy-array&quot;&gt;Convert multi-channel PyAudio into NumPy array&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;https://stackoverflow.com/questions/22636499/convert-multi-channel-pyaudio-into-numpy-array&quot;&gt;https://stackoverflow.com/questions/22636499/convert-multi-channel-pyaudio-into-numpy-array&lt;/a&gt;&lt;/p&gt;

&lt;h2 id=&quot;closed-captioning&quot;&gt;Closed captioning&lt;/h2&gt;

&lt;h3 id=&quot;enough-already-by-matt-richardson&quot;&gt;Enough Already by Matt Richardson&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;https://makezine.com/2011/08/16/enough-already-the-arduino-solution-to-overexposed-celebs/&quot;&gt;https://makezine.com/2011/08/16/enough-already-the-arduino-solution-to-overexposed-celebs/&lt;/a&gt;&lt;/p&gt;

&lt;h3 id=&quot;video-experimenter-shield-for-arduino&quot;&gt;Video Experimenter Shield for Arduino&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;https://nootropicdesign.com/ve/&quot;&gt;https://nootropicdesign.com/ve/&lt;/a&gt;&lt;/p&gt;

&lt;h3 id=&quot;ccextractor&quot;&gt;CCExtractor&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;https://www.ccextractor.org/start&quot;&gt;https://www.ccextractor.org/start&lt;/a&gt;&lt;/p&gt;

&lt;h3 id=&quot;cool-external-projects-that-use-subtitles-or-do-sorcery-with-a-video-stream&quot;&gt;Cool external projects that use subtitles or do sorcery with a video stream&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;https://www.ccextractor.org/public:general:coollinkswithsubfs&quot;&gt;https://www.ccextractor.org/public:general:coollinkswithsubfs&lt;/a&gt;&lt;/p&gt;

&lt;h3 id=&quot;supervised-machine-learing&quot;&gt;Supervised machine learing&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;https://en.wikipedia.org/wiki/Supervised_learning&quot;&gt;https://en.wikipedia.org/wiki/Supervised_learning&lt;/a&gt;&lt;/p&gt;

&lt;h2 id=&quot;video-analysis-1&quot;&gt;video analysis&lt;/h2&gt;

&lt;h3 id=&quot;comskip&quot;&gt;Comskip&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;https://www.kaashoek.com/comskip/&quot;&gt;https://www.kaashoek.com/comskip/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://github.com/erikkaashoek/Comskip&quot;&gt;https://github.com/erikkaashoek/Comskip&lt;/a&gt;&lt;/p&gt;

&lt;h3 id=&quot;how-to-automatically-skip-commercials-in-nextpvr-with-comskip&quot;&gt;How to Automatically Skip Commercials in NextPVR with Comskip&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;https://www.howtogeek.com/251405/how-to-automatically-skip-commercials-in-nextpvr-with-comskip/&quot;&gt;https://www.howtogeek.com/251405/how-to-automatically-skip-commercials-in-nextpvr-with-comskip/&lt;/a&gt;&lt;/p&gt;

</description>
        <pubDate>Sun, 21 Apr 2019 05:00:00 +0000</pubDate>
        <link>https://beepscore.com/website/2019/04/21/automatically-detecting-television-commercials.html</link>
        <guid isPermaLink="true">https://beepscore.com/website/2019/04/21/automatically-detecting-television-commercials.html</guid>
        
        
        <category>website</category>
        
      </item>
    
      <item>
        <title>Raspberry Pi Mute TV Commercials Automatically</title>
        <description>&lt;p&gt;In Python app &lt;a href=&quot;https://github.com/beepscore/remy_python&quot;&gt;remy_python&lt;/a&gt; I added a scheduler.&lt;/p&gt;

&lt;p&gt;Now the app has three parts:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Functions to send commands to the infrared transmitter, which then transmits the commands to the television sound bar&lt;/li&gt;
  &lt;li&gt;A Flask web service to accept television command requests (e.g. volume decrease, volume increase)&lt;/li&gt;
  &lt;li&gt;A scheduler that automatically sends remote control commands at programmed times (e.g. mute during TV commercials)&lt;/li&gt;
&lt;/ul&gt;

&lt;figure&gt;
    &lt;img src=&quot;https://beepscore.com/assets/ir-remote/pi-ir-remote-shield.jpg&quot; alt=&quot;Pi IR remote shield&quot; /&gt;
    &lt;figcaption&gt;
        Raspberry Pi with infrared remote control board
    &lt;/figcaption&gt;
&lt;/figure&gt;

&lt;h2 id=&quot;define-quiet-times&quot;&gt;define quiet times&lt;/h2&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;QuietTime = namedtuple('QuietTime', 'start end')

quiet_times17 = [
    QuietTime(datetime.time(hour=17, minute=17, second=0), datetime.time(hour=17, minute=20, second=0)),
    QuietTime(datetime.time(hour=17, minute=27, second=0), datetime.time(hour=17, minute=31, second=20)),
    QuietTime(datetime.time(hour=17, minute=38, second=15), datetime.time(hour=17, minute=41, second=45)),
    QuietTime(datetime.time(hour=17, minute=48, second=0), datetime.time(hour=17, minute=51, second=50)),
    QuietTime(datetime.time(hour=17, minute=54, second=20), datetime.time(hour=17, minute=57, second=50))
]
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h2 id=&quot;use-apscheduler-to-run-jobs-at-scheduled-times&quot;&gt;use apscheduler to run jobs at scheduled times&lt;/h2&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;def add_jobs_mute(quiet_times, scheduler):
    &quot;&quot;&quot; mute sound during each quiet time
    &quot;&quot;&quot;

    for quiet_time in quiet_times:
        # add_job, implicitly create the trigger
        # args is for function transmit_command_ir
        # first call to mute toggles sound off
        scheduler.add_job(transmit_command_ir, cron,
                          day_of_week=day_of_week,
                          hour=quiet_time.start.hour, minute=quiet_time.start.minute, second=quiet_time.start.second,
                          args=[RemoteCommand.MUTE])
        # next call to mute toggles sound on
        scheduler.add_job(transmit_command_ir, cron,
                          day_of_week=day_of_week,
                          hour=quiet_time.end.hour, minute=quiet_time.end.minute, second=quiet_time.end.second,
                          args=[RemoteCommand.MUTE])
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h2 id=&quot;todo&quot;&gt;TODO&lt;/h2&gt;
&lt;p&gt;See if commercial times are consistent enough for scheduler approach to be practical.
If not, consider automatically detect commercials e.g. similar to “Enough Already” by Matt Richardson checking closed captioning text for a word on a list (e.g. “Lexus”, “Tylenol”)&lt;/p&gt;

&lt;h1 id=&quot;references&quot;&gt;References&lt;/h1&gt;

&lt;h2 id=&quot;raspberry-pi-infrared-remote-control-for-a-television-sound-bar&quot;&gt;Raspberry Pi infrared remote control for a television sound bar&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://beepscore.com/website/2019/02/03/raspberry-pi-infrared-remote-control-tv.html&quot;&gt;https://beepscore.com/website/2019/02/03/raspberry-pi-infrared-remote-control-tv.html&lt;/a&gt;&lt;/p&gt;

&lt;h2 id=&quot;network-enabled-raspberry-pi-tv-remote-control&quot;&gt;Network enabled Raspberry Pi tv remote control&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://beepscore.com/website/2019/02/05/network-enabled-raspberry-pi-tv-remote-control.html&quot;&gt;https://beepscore.com/website/2019/02/05/network-enabled-raspberry-pi-tv-remote-control.html&lt;/a&gt;&lt;/p&gt;

&lt;h2 id=&quot;remy_python&quot;&gt;remy_python&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/beepscore/remy_python&quot;&gt;https://github.com/beepscore/remy_python&lt;/a&gt;&lt;br /&gt;
Make a Raspberry Pi infrared remote control. The device can programmatically control television sound bar audio volume. The Raspberry Pi uses LIRC (Linux Infrared Remote Control) to send commands to an attached infrared transmitter.
The README includes links to similar remote control projects, infrared remote control hardware.&lt;/p&gt;

&lt;h2 id=&quot;advanced-python-scheduler&quot;&gt;Advanced Python Scheduler&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://apscheduler.readthedocs.io/en/latest/userguide.html&quot;&gt;https://apscheduler.readthedocs.io/en/latest/userguide.html&lt;/a&gt;&lt;br /&gt;
Advanced Python Scheduler (APScheduler) is a Python library that lets you schedule your Python code to be executed later, either just once or periodically.&lt;/p&gt;

&lt;h2 id=&quot;inspirational-projects&quot;&gt;Inspirational projects&lt;/h2&gt;

&lt;h3 id=&quot;enough-already-by-matt-richardson&quot;&gt;Enough Already by Matt Richardson&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;https://makezine.com/2011/08/16/enough-already-the-arduino-solution-to-overexposed-celebs/&quot;&gt;https://makezine.com/2011/08/16/enough-already-the-arduino-solution-to-overexposed-celebs/&lt;/a&gt;&lt;/p&gt;

&lt;h3 id=&quot;tv-b-gone-kit&quot;&gt;TV-B-Gone Kit&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;https://www.adafruit.com/product/73&quot;&gt;https://www.adafruit.com/product/73&lt;/a&gt;&lt;/p&gt;

&lt;h3 id=&quot;tv-b-gone&quot;&gt;TV-B-Gone&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;https://www.tvbgone.com/&quot;&gt;https://www.tvbgone.com/&lt;/a&gt;&lt;/p&gt;
</description>
        <pubDate>Mon, 11 Feb 2019 03:30:00 +0000</pubDate>
        <link>https://beepscore.com/website/2019/02/11/raspberry-pi-mute-tv-commercials-automatically.html</link>
        <guid isPermaLink="true">https://beepscore.com/website/2019/02/11/raspberry-pi-mute-tv-commercials-automatically.html</guid>
        
        
        <category>website</category>
        
      </item>
    
      <item>
        <title>Swift iOS to Raspberry Pi TV Remote Control</title>
        <description>&lt;figure&gt;
    &lt;img src=&quot;https://beepscore.com/assets/ir-remote/ios-remote.png&quot; alt=&quot;iOS remote control&quot; class=&quot;center&quot; /&gt;
    &lt;figcaption&gt;
        The remote control app displays audio level, has a slider to set the limit, and buttons to send commands.
    &lt;/figcaption&gt;
&lt;/figure&gt;

&lt;p&gt;I made an iOS app to remote control a television sound bar.&lt;/p&gt;

&lt;p&gt;The app makes requests to a raspberry pi running a Flask server on the local network.
The Raspberry Pi uses LIRC (Linux Infrared Remote Control) to send commands to an attached infrared transmitter.&lt;/p&gt;

&lt;h1 id=&quot;audio-level&quot;&gt;Audio level&lt;/h1&gt;
&lt;p&gt;AudioMonitor.swift levelTimerCallback repeatedly posts a notification containing audio level.
AVAudioRecorder averagePower(forChannel:) normally ranges from -160 dB (quietest) to 0 dB full scale (louder).
“If the signal provided to the audio recorder exceeds ±full scale, then the return value may exceed 0 (that is, it may enter the positive range).”
Indoors I typically see range approximately -60 to -30 dB.&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;@objc func levelTimerCallback() {
    guard let recorder = recorder else { return }

    // To obtain a current average power value,
    // you must call the updateMeters() method before calling averagePower.
    recorder.updateMeters()
    let level = recorder.averagePower(forChannel: 0)

    let isLoud = level &amp;gt; levelDbThreshold

    print(&quot;levelTimerCallback sound level: \(level) decibel, isLoud: \(isLoud)&quot;)

    DispatchQueue.main.async {
        NotificationCenter.default.post(name: AudioMonitor.audioLevelNotificationName,
                                        object: .none,
                                        userInfo: [AudioMonitor.audioLevelKey: level,
                                                   AudioMonitor.isLoudKey: isLoud])
    }
}
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h2 id=&quot;automatic-control&quot;&gt;Automatic control&lt;/h2&gt;
&lt;p&gt;The iOS app could be modified to automatically send a volume decrease command whenever the audio level exceeds the limit.&lt;/p&gt;

&lt;p&gt;Alternatively, the Raspberry Pi app remy_python could be modified to automatically control sound level.
For example the Pi could automatically decrease or mute the sound whenever a commercial is detected e.g.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;at regularly scheduled commercial times (e.g. 19:02, 19:30)&lt;/li&gt;
  &lt;li&gt;analyzing closed captioning text for a word on a list (e.g. “Lexus”, “Tylenol”)&lt;/li&gt;
&lt;/ul&gt;

&lt;h1 id=&quot;references&quot;&gt;References&lt;/h1&gt;

&lt;h2 id=&quot;remy&quot;&gt;Remy&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/beepscore/Remy&quot;&gt;https://github.com/beepscore/Remy&lt;/a&gt;&lt;br /&gt;
Remote control television by sending commands from iOS device to a server.&lt;/p&gt;

&lt;h2 id=&quot;ios---detect-blow-into-mic-and-convert-the-results-swift&quot;&gt;iOS - Detect Blow into Mic and convert the results! (swift)&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://stackoverflow.com/questions/31230854/ios-detect-blow-into-mic-and-convert-the-results-swift&quot;&gt;https://stackoverflow.com/questions/31230854/ios-detect-blow-into-mic-and-convert-the-results-swift&lt;/a&gt;&lt;/p&gt;

&lt;h2 id=&quot;how-to-monitor-audio-input-on-ios-using-swift---example&quot;&gt;how to monitor audio input on ios using swift - example?&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://stackoverflow.com/questions/35929989/how-to-monitor-audio-input-on-ios-using-swift-example&quot;&gt;https://stackoverflow.com/questions/35929989/how-to-monitor-audio-input-on-ios-using-swift-example&lt;/a&gt;&lt;/p&gt;

&lt;h2 id=&quot;network-enabled-raspberry-pi-tv-remote-control&quot;&gt;Network enabled Raspberry Pi tv remote control&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://beepscore.com/website/2019/02/05/network-enabled-raspberry-pi-tv-remote-control.html&quot;&gt;https://beepscore.com/website/2019/02/05/network-enabled-raspberry-pi-tv-remote-control.html&lt;/a&gt;&lt;/p&gt;

&lt;h2 id=&quot;raspberry-pi-infrared-remote-control-for-a-television-sound-bar&quot;&gt;Raspberry Pi infrared remote control for a television sound bar&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://beepscore.com/website/2019/02/03/raspberry-pi-infrared-remote-control-tv.html&quot;&gt;https://beepscore.com/website/2019/02/03/raspberry-pi-infrared-remote-control-tv.html&lt;/a&gt;&lt;/p&gt;

&lt;h2 id=&quot;remy_python&quot;&gt;remy_python&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/beepscore/remy_python&quot;&gt;https://github.com/beepscore/remy_python&lt;/a&gt;&lt;br /&gt;
Make a Raspberry Pi infrared remote control. The device can programmatically control television sound bar audio volume. The Raspberry Pi uses LIRC (Linux Infrared Remote Control) to send commands to an attached infrared transmitter.&lt;/p&gt;

&lt;p&gt;The Python app has two parts:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Functions to send commands to the infrared transmitter, which then transmits the commands to the television sound bar&lt;/li&gt;
  &lt;li&gt;A Flask web service to accept television command requests (e.g. volume decrease, volume increase).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The README includes links to similar remote control projects, infrared remote control hardware.&lt;/p&gt;

</description>
        <pubDate>Fri, 08 Feb 2019 03:21:00 +0000</pubDate>
        <link>https://beepscore.com/website/2019/02/08/swift-ios-to-raspberry-pi-tv-remote-control.html</link>
        <guid isPermaLink="true">https://beepscore.com/website/2019/02/08/swift-ios-to-raspberry-pi-tv-remote-control.html</guid>
        
        
        <category>website</category>
        
      </item>
    
      <item>
        <title>Network enabled Raspberry Pi tv remote control</title>
        <description>&lt;p&gt;The &lt;a href=&quot;https://beepscore.com/website/2019/02/03/raspberry-pi-infrared-remote-control-tv.html&quot;&gt;Raspberry Pi infrared remote control for a television sound bar&lt;/a&gt; also has a Python Flask web service.
This makes the remote control “web enabled”, available over the local wifi network.&lt;/p&gt;

&lt;h2 id=&quot;endpoints&quot;&gt;endpoints&lt;/h2&gt;

&lt;h3 id=&quot;get&quot;&gt;GET&lt;/h3&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;https://10.0.0.4:5000/api/v1/tv/ping/
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h3 id=&quot;post&quot;&gt;POST&lt;/h3&gt;
&lt;p&gt;Send a remote control command.&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;https://10.0.0.4:5000/api/v1/tv/mute/
                    /api/v1/tv/power/
                    /api/v1/tv/voice-decrease/
                    /api/v1/tv/voice-increase/
                    /api/v1/tv/volume-decrease/
                    /api/v1/tv/volume-increase/
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h2 id=&quot;client&quot;&gt;client&lt;/h2&gt;
&lt;p&gt;GET requests can be made via a browser such as Firefox or mobile Safari
POST requests can be made via clients such as terminal curl or POSTMAN or iOS Remy.app&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;curl --request POST https://10.0.0.4:5000/api/v1/tv/volume-decrease/
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h1 id=&quot;references&quot;&gt;References&lt;/h1&gt;

&lt;h2 id=&quot;raspberry-pi-infrared-remote-control-for-a-television-sound-bar&quot;&gt;Raspberry Pi infrared remote control for a television sound bar&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://beepscore.com/website/2019/02/03/raspberry-pi-infrared-remote-control-tv.html&quot;&gt;https://beepscore.com/website/2019/02/03/raspberry-pi-infrared-remote-control-tv.html&lt;/a&gt;&lt;br /&gt;&lt;/p&gt;

&lt;h2 id=&quot;remy_python&quot;&gt;remy_python&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/beepscore/remy_python&quot;&gt;https://github.com/beepscore/remy_python&lt;/a&gt;&lt;br /&gt;
Make a Raspberry Pi infrared remote control. The device can programmatically control television sound bar audio volume. The Raspberry Pi uses LIRC (Linux Infrared Remote Control) to send commands to an attached infrared transmitter.&lt;/p&gt;

&lt;p&gt;The Python app has two parts:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Functions to send commands to the infrared transmitter, which then transmits the commands to the television sound bar&lt;/li&gt;
  &lt;li&gt;A Flask web service to accept television command requests (e.g. volume decrease, volume increase).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The README includes links to similar remote control projects, infrared remote control hardware.&lt;/p&gt;

&lt;h2 id=&quot;remy&quot;&gt;Remy&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/beepscore/Remy&quot;&gt;https://github.com/beepscore/Remy&lt;/a&gt;&lt;br /&gt;
Remote control television by sending commands from iOS device to a server.&lt;/p&gt;

</description>
        <pubDate>Tue, 05 Feb 2019 03:50:00 +0000</pubDate>
        <link>https://beepscore.com/website/2019/02/05/network-enabled-raspberry-pi-tv-remote-control.html</link>
        <guid isPermaLink="true">https://beepscore.com/website/2019/02/05/network-enabled-raspberry-pi-tv-remote-control.html</guid>
        
        
        <category>website</category>
        
      </item>
    
      <item>
        <title>Raspberry Pi infrared remote control for a television sound bar</title>
        <description>&lt;p&gt;I made a Raspberry Pi infrared remote control for a television sound bar.
Programmatic control offers many exciting possibilities! The user could:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;add a python Flask service to make the remote available over local wifi network.&lt;/li&gt;
  &lt;li&gt;write an iOS remote control app with buttons that send requests to the Raspberry Pi remote control service.&lt;/li&gt;
  &lt;li&gt;program the system to automatically decrease the sound whenever it exceeds a threshold.&lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;program the system to automatically decrease or mute the sound whenever a commercial is detected e.g.&lt;/p&gt;

    &lt;ul&gt;
      &lt;li&gt;analyzing closed captioning text for a word on a list (e.g. “Lexus”, “Tylenol”)&lt;/li&gt;
      &lt;li&gt;at regularly scheduled commercial times (e.g. 19:02, 19:30)&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;raspberry-pi-ir-remote-shield&quot;&gt;Raspberry Pi IR remote shield&lt;/h2&gt;
&lt;figure&gt;
    &lt;img src=&quot;https://beepscore.com/assets/ir-remote/pi-ir-remote-shield.jpg&quot; alt=&quot;Pi IR remote shield&quot; class=&quot;center&quot; /&gt;
    &lt;figcaption&gt;
        Raspberry Pi with infrared remote control board
    &lt;/figcaption&gt;
&lt;/figure&gt;

&lt;h2 id=&quot;lirc-linux-infrared-remote-control&quot;&gt;LIRC Linux Infrared Remote Control&lt;/h2&gt;
&lt;p&gt;“LIRC is a package that allows you to decode and send infra-red signals of many (but not all) commonly used remote controls.”&lt;/p&gt;

&lt;h3 id=&quot;calling-lirc-irsend&quot;&gt;Calling LIRC irsend&lt;/h3&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;def transmit_command_ir(command):
    &quot;&quot;&quot;
    instruct infrared transmitter to transmit command
    :parameter command: an IrCommand
    &quot;&quot;&quot;

    ir_command_string = ir_command(command)

    # Don't allow user to run arbitrary string input, that is a security risk.
    #
    # If LIRC irsend isn't installed, throws error:
    # FileNotFoundError: [Errno 2] No such file or directory: 'irsend': 'irsend'
    #
    # subprocess.run requires Python &amp;gt;= 3.5, so don't use it yet.
    subprocess.call([IRSEND, SEND_ONCE, IR_REMOTE, ir_command_string])
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;During initial development I used iPhone front facing camera to check the transmit command blinked the infrared LED.
The rear facing camera filters infrared, but the front-facing selfie camera doesn’t.&lt;/p&gt;
&lt;figure&gt;
    &lt;img src=&quot;https://beepscore.com/assets/ir-remote/ir-led-blink640.gif&quot; alt=&quot;IR LED blink&quot; class=&quot;center&quot; /&gt;
    &lt;figcaption&gt;
        Checking transmit command blinks the infrared remote control LED
    &lt;/figcaption&gt;
&lt;/figure&gt;

&lt;h1 id=&quot;references&quot;&gt;References&lt;/h1&gt;

&lt;h2 id=&quot;remy_python&quot;&gt;remy_python&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/beepscore/remy_python&quot;&gt;https://github.com/beepscore/remy_python&lt;/a&gt;&lt;br /&gt;
Make a Raspberry Pi infrared remote control. The device can programmatically control television sound bar audio volume. The Raspberry Pi uses LIRC (Linux Infrared Remote Control) to send commands to an attached infrared transmitter.&lt;/p&gt;

&lt;p&gt;The Python app has two parts:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Functions to send commands to the infrared transmitter, which then transmits the commands to the television sound bar&lt;/li&gt;
  &lt;li&gt;A Flask web service to accept television command requests (e.g. volume decrease, volume increase).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The README includes links to similar remote control projects, infrared remote control hardware.&lt;/p&gt;

&lt;h2 id=&quot;remy&quot;&gt;Remy&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/beepscore/Remy&quot;&gt;https://github.com/beepscore/Remy&lt;/a&gt;&lt;br /&gt;
Remote control television by sending commands from iOS device to a server.&lt;/p&gt;

&lt;h2 id=&quot;lirc-linux-infrared-remote-control-1&quot;&gt;LIRC Linux Infrared Remote Control&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://lirc.org/&quot;&gt;https://lirc.org/&lt;/a&gt;&lt;/p&gt;

&lt;h2 id=&quot;infrared-remote-control-hardware&quot;&gt;Infrared remote control hardware&lt;/h2&gt;

&lt;h3 id=&quot;raspberry-pi-ir-control-expansion-board&quot;&gt;Raspberry Pi IR Control Expansion Board&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;https://www.raspberrypiwiki.com/index.php/Raspberry_Pi_IR_Control_Expansion_Board&quot;&gt;https://www.raspberrypiwiki.com/index.php/Raspberry_Pi_IR_Control_Expansion_Board&lt;/a&gt;&lt;/p&gt;

&lt;h3 id=&quot;icstation-38khz-ir-infrared-remote-control-transceiver-shield-for-raspberry-pi-2-3-module-b-b&quot;&gt;Icstation 38KHz IR Infrared Remote Control Transceiver Shield for Raspberry Pi 2 3 Module B B+&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;https://www.amazon.com/IR-Remote-Control-Transceiver-Raspberry/dp/B0713SK7RJ/ref=pd_cp_147_1?pd_rd_w=nydwe&amp;amp;pf_rd_p=ef4dc990-a9ca-4945-ae0b-f8d549198ed6&amp;amp;pf_rd_r=NPTQR2NR66SZXGEC1CFF&amp;amp;pd_rd_r=dc222ec9-1d1f-11e9-82b3-7117715d74e2&amp;amp;pd_rd_wg=OnVSD&amp;amp;pd_rd_i=B0713SK7RJ&amp;amp;psc=1&amp;amp;refRID=NPTQR2NR66SZXGEC1CFF&quot;&gt;https://www.amazon.com/IR-Remote-Control-Transceiver-Raspberry/dp/B0713SK7RJ/ref=pd_cp_147_1?pd_rd_w=nydwe&amp;amp;pf_rd_p=ef4dc990-a9ca-4945-ae0b-f8d549198ed6&amp;amp;pf_rd_r=NPTQR2NR66SZXGEC1CFF&amp;amp;pd_rd_r=dc222ec9-1d1f-11e9-82b3-7117715d74e2&amp;amp;pd_rd_wg=OnVSD&amp;amp;pd_rd_i=B0713SK7RJ&amp;amp;psc=1&amp;amp;refRID=NPTQR2NR66SZXGEC1CFF&lt;/a&gt;&lt;/p&gt;

&lt;h2 id=&quot;inspirational-projects&quot;&gt;Inspirational projects&lt;/h2&gt;

&lt;h3 id=&quot;enough-already-by-matt-richardson&quot;&gt;Enough Already by Matt Richardson&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;https://makezine.com/2011/08/16/enough-already-the-arduino-solution-to-overexposed-celebs/&quot;&gt;https://makezine.com/2011/08/16/enough-already-the-arduino-solution-to-overexposed-celebs/&lt;/a&gt;&lt;/p&gt;

&lt;h3 id=&quot;tv-b-gone-kit&quot;&gt;TV-B-Gone Kit&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;https://www.adafruit.com/product/73&quot;&gt;https://www.adafruit.com/product/73&lt;/a&gt;&lt;/p&gt;

&lt;h3 id=&quot;tv-b-gone&quot;&gt;TV-B-Gone&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;https://www.tvbgone.com/&quot;&gt;https://www.tvbgone.com/&lt;/a&gt;&lt;/p&gt;
</description>
        <pubDate>Sun, 03 Feb 2019 19:07:00 +0000</pubDate>
        <link>https://beepscore.com/website/2019/02/03/raspberry-pi-infrared-remote-control-tv.html</link>
        <guid isPermaLink="true">https://beepscore.com/website/2019/02/03/raspberry-pi-infrared-remote-control-tv.html</guid>
        
        
        <category>website</category>
        
      </item>
    
  </channel>
</rss>
