<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>The Random Ramblings of a Software Developer</title>
    <description>I live in Curitiba, Brazil. I&apos;m a software developer, A.I. Ph.D. student, music lover and gamer.</description>
    <link>https://www.vitormach.dev/blog/</link>
    <atom:link href="https://www.vitormach.dev/blog/feed.xml" rel="self" type="application/rss+xml" />
    <pubDate>Wed, 16 Sep 2026 03:51:07 +0000</pubDate>
    <lastBuildDate>Wed, 16 Sep 2026 03:51:07 +0000</lastBuildDate>
    <generator>Jekyll v3.10.0</generator>
    
      <item>
        <title>IEM Equalization Extravaganza</title>
        <description>&lt;!-- @format --&gt;

&lt;p&gt;Audiophiles see &lt;a href=&quot;https://en.wikipedia.org/wiki/In-ear_monitor&quot; target=&quot;_blank&quot;&gt;In-ear monitors (IEMs)&lt;/a&gt; as an inexpensive way into audiophilia. Sure, with the recent rise of the “&lt;a href=&quot;https://www.makeuseof.com/what-is-chi-fi/&quot; target=&quot;_blank&quot;&gt;chi-fi&lt;/a&gt;” it has never been so cheap to have access to good sound quality. Still, a certain sound signature might not be to the tastes of everyone, not to mention different ears will literally hear things differently. In such cases, one has the possibility of applying equalization to change the signature of audio hardware.&lt;/p&gt;

&lt;div class=&quot;post-image&quot;&gt;
    &lt;a href=&quot;/blog/img/posts/iem-dusk.jpg&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;/blog/img/posts/iem-dusk.jpg&quot; /&gt;&lt;/a&gt;
    &lt;p class=&quot;post-image-caption&quot;&gt;The legendary &lt;a href=&quot;https://www.flickr.com/photos/vitormach/52220783635/&quot; target=&quot;_blank&quot;&gt;Moondrop Blessing 2:Dusk&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;

&lt;!--more--&gt;

&lt;h5 id=&quot;before-we-proceed&quot;&gt;Before we proceed&lt;/h5&gt;

&lt;p&gt;Before we dive into IEM equalization, there’s a few topics I need to introduce to make sure we’re all on the same page.&lt;/p&gt;

&lt;h6 id=&quot;tonality&quot;&gt;Tonality&lt;/h6&gt;

&lt;p&gt;&lt;strong&gt;Tonality&lt;/strong&gt; is basically how a sound reproduction device outputs each part of the &lt;a href=&quot;https://en.wikipedia.org/wiki/Audio_frequency&quot; target=&quot;_blank&quot;&gt;frequency spectrum&lt;/a&gt;. That is to say, it will determine how much bass, mids and treble the sound will ultimately have.&lt;/p&gt;

&lt;p&gt;As with every hobby, it can always get more complicated. Usually we divide tonality into sub-regions, such as “sub-bass”, “upper-midrange” and “air region” (high treble). There are no precise definitions of where exactly in the frequency spectrum each area is located, and the terms only provide a general idea.&lt;/p&gt;

&lt;p&gt;The famous IEM reviewer crinacle has his own &lt;a href=&quot;https://crinacle.com/2020/04/08/graphs-101-how-to-read-headphone-measurements/&quot; target=&quot;_blank&quot;&gt;definitions&lt;/a&gt;, which are as follows:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;• 20Hz to 80Hz: Sub-bass;&lt;/li&gt;
  &lt;li&gt;• 80Hz to 200Hz: Mid-bass;&lt;/li&gt;
  &lt;li&gt;• 200Hz to 800Hz: Lower midrange;&lt;/li&gt;
  &lt;li&gt;• 800Hz to 1.500Hz: Centre midrange;&lt;/li&gt;
  &lt;li&gt;• 1.500Hz to 5.000Hz: Upper midrange;&lt;/li&gt;
  &lt;li&gt;• 5.000Hz to 10.000Hz: Treble;&lt;/li&gt;
  &lt;li&gt;• 10.000Hz+: Upper treble/”air”.&lt;/li&gt;
&lt;/ul&gt;

&lt;h6 id=&quot;iems-vs-headphones-vs-speakers&quot;&gt;IEMs vs headphones vs speakers&lt;/h6&gt;

&lt;p&gt;At this point, it is important to understand that &lt;strong&gt;different types of devices should have different frequency response curves&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;In a way, speakers have it easy. The sound they output travel along your room, and reach your body like any other “natural” sound would. That is, it will reflect on surfaces, shake your body, interact with the fine structure on your ear’s &lt;a href=&quot;https://en.wikipedia.org/wiki/Auricle_(anatomy)&quot; target=&quot;_blank&quot;&gt;pinna&lt;/a&gt;, until it finally reaches your eardrums. Therefore, whatever influence these things have on the sound, the speakers’ job is merely to reproduce audio like a natural source would, and both will go through the same interactions.&lt;/p&gt;

&lt;p&gt;Now headphones, on the other hand, have a trickier job to perform. They do not interact with the environment, and also bypass most of the interaction with your body. Over-ear headphones do interact with your pinna, but they do so blasting sound at a direct angle onto your ear canals. This is quite different from what a natural sound goes through, and if a headphone does not account for that in its sound signature, it will not sound correct to our brains.&lt;/p&gt;

&lt;p&gt;Finally, IEMs have it even worse, because they bypass the pinna completely and output sound directly down your ear canals (which are also sealed by the IEM).&lt;/p&gt;

&lt;p&gt;All of that is to say: different types of devices will aim for different types of frequency response targets.&lt;/p&gt;

&lt;h6 id=&quot;frequency-response-targets&quot;&gt;Frequency response targets&lt;/h6&gt;

&lt;p&gt;For the remainder of this post, I will focus on IEMs. One of the most famous &lt;strong&gt;target response curves&lt;/strong&gt; in the IEM world is the &lt;a href=&quot;https://headphonesaddict.com/harman-curve/&quot; target=&quot;_blank&quot;&gt;Harman IE target&lt;/a&gt; (&lt;a href=&quot;https://www.aes.org/e-lib/browse.cfm?elib=19436&quot; target=&quot;_blank&quot;&gt;official paper&lt;/a&gt;).&lt;/p&gt;

&lt;div class=&quot;post-image&quot;&gt;
    &lt;a href=&quot;/blog/img/posts/harman-target.png&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;/blog/img/posts/harman-target.png&quot; /&gt;&lt;/a&gt;
    &lt;p class=&quot;post-image-caption&quot;&gt;The Harman target curve&lt;/p&gt;
&lt;/div&gt;

&lt;p&gt;The Harman curve is meant to capture the taste of what most people would consider “good”. It has what audiophiles sometimes describe as a “V-shaped” tonality: lots of bass (mostly focused on the sub-bass area) and goes up again on the treble region. It also accounts for an increased output in the region around 2~5KHz, meant to emulate the effect the ear pinna has on the sound that reaches our ears (remember, an IEM bypasses the pinna completely). This is usually referred to as the “pinna gain”.&lt;/p&gt;

&lt;p&gt;Another important curve is the diffuse field target curve, created by Etymotic Research. This curve is meant to emulate the frequency response reaching the eardrums of a dummy head when sound is arriving at it coming from all directions uniformly. It is usually perceived as a “bright” signature, having more energy in the treble region that a Harman-tuned IEM would.&lt;/p&gt;

&lt;p&gt;Other curves exist, such as Moondrop’s own in-house &lt;a href=&quot;https://crinacle.com/2019/02/02/moondrop-blessing/&quot; target=&quot;_blank&quot;&gt;Virtual Diffuse Sound Field (VDSF)&lt;/a&gt;, or reviewer curves such as crinacle’s &lt;a href=&quot;https://crinacle.com/2020/10/05/in-ear-fidelitys-iem-neutral-target-gets-an-update-database-updates/&quot; target=&quot;_blank&quot;&gt;IEF Neutral&lt;/a&gt;.&lt;/p&gt;

&lt;h6 id=&quot;technicalities&quot;&gt;“Technicalities”?&lt;/h6&gt;

&lt;p&gt;Usually audiophiles divide the sound signature analysis into two groups: tonality and technicalities. Some aspects of the sound signature are hard (or maybe impossible) to describe using frequency response (the tonality) alone. This is where other, more abstract terms start to show up: “soundstage”, “imaging”, “attack speed”, “texture”, “details”, etc…&lt;/p&gt;

&lt;p&gt;Crinacle goes over these topics in great detail &lt;a href=&quot;https://crinacle.com/2019/02/04/what-is-technical-ability-according-to-me-myself-and-i/&quot; target=&quot;_blank&quot;&gt;on this article&lt;/a&gt;, where he states:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;Do note that whatever I write here is still mostly “pseudoscience” in that most of the things here aren’t peer-reviewed or academically researched (or scientifically accurate, for that matter!)&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;I find it quite surprising that in this day and age most of what we use to describe audio is still highly unscientific, veering into the “it’s an art” territory. But nevertheless, this is the state of things. My own personal, unscientific view, is that most of the “detail” stems from a reproduction of the treble region in an accurate and devoid of peaks fashion. Regarding “soundstage” and “imaging”, these are heavily tied to the &lt;a href=&quot;https://en.wikipedia.org/wiki/Head-related_transfer_function&quot; target=&quot;_blank&quot;&gt;Head-Related Transfer Function (HRTF)&lt;/a&gt;, which varies from person to person and is especially hard for IEMs to emulate properly, which is why they tend to fare poorly in this aspect.&lt;/p&gt;

&lt;h6 id=&quot;measurements&quot;&gt;Measurements&lt;/h6&gt;

&lt;p&gt;Now, what use would target curves be if there were no way to &lt;strong&gt;measure&lt;/strong&gt; and analyze how an IEM responds?&lt;/p&gt;

&lt;p&gt;Measurements are a very complicated subject, which I do not have a lot of property to talk about, so I will give you some general pointers of where to go.&lt;/p&gt;

&lt;p&gt;To measure the frequency response of IEMs instruments known as &lt;a href=&quot;https://www.grasacoustics.com/products/ear-simulator/product/786-ra0402&quot; target=&quot;_blank&quot;&gt;couplers&lt;/a&gt; are used. The IEM is inserted on the opening, and usually a &lt;a href=&quot;https://en.wikipedia.org/wiki/Sine_wave&quot; target=&quot;_blank&quot;&gt;sine wave&lt;/a&gt; sweep is performed on the IEM, which is then used to graph the amplitude of the sound reaching the coupler.&lt;/p&gt;

&lt;p&gt;Due to &lt;a href=&quot;https://en.wikipedia.org/wiki/Acoustic_resonance#Resonance_of_a_tube_of_air&quot; target=&quot;_blank&quot;&gt;ressonances&lt;/a&gt; inside the coupler, IEM frequency response graphs will always end up with some peaks in certain treble frequencies. For consistency, usually reviewers try to position the peak in the same place for every measured IEM, by varying insertion depth. For instance, &lt;a href=&quot;https://www.youtube.com/c/SuperReview/&quot; target=&quot;_blank&quot;&gt;Super* Review&lt;/a&gt; targets 8KHz for the ressonance peak.&lt;/p&gt;

&lt;p&gt;As such, frequency response graphs should be used with care, and its limitations have to be considered. They are most useful when used as a comparison tool between measurements taken with a consistent methodology. Frequency response graphs can be used as an aid for equalization, but one has to be mindful of such limitations, and also differences from person to person (your ear is not a GRAS coupler!), unit variance, etc…&lt;/p&gt;

&lt;div class=&quot;post-image&quot;&gt;
    &lt;iframe width=&quot;560&quot; height=&quot;315&quot; src=&quot;https://www.youtube.com/embed/Qc__cF6i2mw&quot; frameborder=&quot;0&quot; allowfullscreen=&quot;&quot;&gt;&lt;/iframe&gt;
    &lt;p class=&quot;post-image-caption&quot;&gt;Crinacle goes in-depth into IEM measuring equipments&lt;/p&gt;
&lt;/div&gt;

&lt;h6 id=&quot;equalizers&quot;&gt;Equalizers&lt;/h6&gt;

&lt;p&gt;If you’re here, I assume you’re reasonably familiar with the concept of &lt;a href=&quot;https://en.wikipedia.org/wiki/Equalization_(audio)&quot; target=&quot;_blank&quot;&gt;&lt;strong&gt;audio equalization&lt;/strong&gt;&lt;/a&gt;. Still, I will expand a bit on the two most common types of equalizers: band and parametric.&lt;/p&gt;

&lt;p&gt;Band equalizers have filters at specific, static frequencies. They usually provide the user with a simple interface containing multiple bands at certain set frequencies, and the user is able to increase or decrease the amplitude of the audio around each frequency. These are fine for some coarse corrections, but due to the fixed bands it’s often not possible to execute corrections exactly as desired.&lt;/p&gt;

&lt;div class=&quot;post-image&quot;&gt;
    &lt;a href=&quot;/blog/img/posts/fb2k-xnor-eq.png&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;/blog/img/posts/fb2k-xnor-eq.png&quot; /&gt;&lt;/a&gt;
    &lt;p class=&quot;post-image-caption&quot;&gt;&lt;a href=&quot;https://www.foobar2000.org/components/view/foo_dsp_xgeq&quot; target=&quot;_blank&quot;&gt;xnor&apos;s band equalizer&lt;/a&gt; for &lt;a href=&quot;https://www.foobar2000.org/&quot; target=&quot;_blank&quot;&gt;foobar2000&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;

&lt;p&gt;For more precise corrections, we use parametric equalizers. I will leave it to the folks at PreSonus to provide a more &lt;a href=&quot;https://www.presonus.com/learn/technical-articles/What-Is-a-Parametric-Eq&quot; target=&quot;_blank&quot;&gt;in-depth explanation&lt;/a&gt;, but I will very quickly go through the main concepts intuitively. A parametric equalizer filter is composed of three parameters: frequency, Q and gain. Q stands for “quality” (which is a bit of a deceiving title).&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;• Frequency: the frequency at which the filter is centered at;&lt;/li&gt;
  &lt;li&gt;• Q: the “spread” of the filter. A small Q value means the filter is very wide, and a large Q results in a very narrow filter;&lt;/li&gt;
  &lt;li&gt;• Gain: The amplitude at the center of the filter.&lt;/li&gt;
&lt;/ul&gt;

&lt;div class=&quot;post-image&quot;&gt;
    &lt;a href=&quot;/blog/img/posts/q-values.png&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;/blog/img/posts/q-values.png&quot; /&gt;&lt;/a&gt;
    &lt;p class=&quot;post-image-caption&quot;&gt;Different Q values, image courtesy of &lt;a href=&quot;https://wiki.jriver.com/index.php/Parametric_Equalizer&quot; target=&quot;_blank&quot;&gt;JRiver&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;

&lt;p&gt;A very useful tool to build and analyze parametric equalizers is crinacle’s &lt;a href=&quot;https://crinacle.com/graphs/iems/graphtool/&quot; target=&quot;_blank&quot;&gt;graph comparison tool&lt;/a&gt;. It is an open-source tool available on &lt;a href=&quot;https://github.com/mlochbaum/CrinGraph&quot; target=&quot;_blank&quot;&gt;GitHub&lt;/a&gt;, made by Marshall Lochbaum. However, my favorite implementation of it is Super* Review’s &lt;a href=&quot;https://squig.link/&quot; target=&quot;_blank&quot;&gt;Squiglink&lt;/a&gt;. I even have my own deployed &lt;a href=&quot;https://www.vitormach.dev/CrinGraph/&quot; target=&quot;_blank&quot;&gt;here&lt;/a&gt;!&lt;/p&gt;

&lt;p&gt;There are many softwares which you can use to apply band and parametric equalizers, I will mention some which I use and enjoy.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://play.google.com/store/apps/details?id=com.pittvandewitt.wavelet&quot; target=&quot;_blank&quot;&gt;Wavelet&lt;/a&gt; is an Android app that allows you to use system-wide equalization. It has a built-in band equalizer with 9 bands, and a &lt;a href=&quot;https://github.com/jaakkopasanen/AutoEq#convolution-equalizers&quot; target=&quot;_blank&quot;&gt;convolution equalizer&lt;/a&gt;. I will not go into details about convolution equalizers, but suffice to say we will be able to export a Wavelet settings file using CrinGraph’s parametric equalizer (more on that later).&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://github.com/jaakkopasanen/AutoEq&quot; target=&quot;_blank&quot;&gt;AutoEQ&lt;/a&gt; is a project and not a software per se, but a very relevant one.&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;AutoEQ is a project for equalizing headphone frequency responses automatically, and it achieves this by parsing frequency response measurements and producing equalization settings which correct the headphone to a neutral sound.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;It includes a huge database with over 4000 measurements, and parametric equalizer settings tuned to the Harman target. Wavelet has built-in support for the AutoEQ database using its AutoEQ function. However, we will export our own equalizer curve later.&lt;/p&gt;

&lt;p&gt;Finally, we have &lt;a href=&quot;https://equalizerapo.com/&quot; target=&quot;_blank&quot;&gt;Equalizer APO&lt;/a&gt;, an open-source Windows equalizer. It has graphic, parametric and convolution equalizer support, among other features. It’s usually used in conjunction with the &lt;a href=&quot;https://sourceforge.net/projects/peace-equalizer-apo-extension/&quot; target=&quot;_blank&quot;&gt;Peace&lt;/a&gt; interface.&lt;/p&gt;

&lt;p&gt;We are now ready to go into the densest part of this whole thing, which is how I came with my own target curve to help me equalize my own IEMs.&lt;/p&gt;

&lt;h5 id=&quot;my-own-target-curve&quot;&gt;My own target curve&lt;/h5&gt;

&lt;p&gt;I’m not a huge fan of the Harman curve. It has too much bass for me, and I’m also quite sensitive to the 8KHz region, which is very prominent in the Harman curve. The new &lt;a href=&quot;https://www.youtube.com/watch?v=RWzBw3XBn8c&quot; target=&quot;_blank&quot;&gt;Super 22 target curve&lt;/a&gt; made by Super* Review is much closer to my own personal tastes, and served as the basis for my own target curve.&lt;/p&gt;

&lt;div class=&quot;post-image&quot;&gt;
    &lt;a href=&quot;/blog/img/posts/super22-target.png&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;/blog/img/posts/super22-target.png&quot; /&gt;&lt;/a&gt;
    &lt;p class=&quot;post-image-caption&quot;&gt;Super22 target curve&lt;/p&gt;
&lt;/div&gt;

&lt;p&gt;The only things I have decided to change in the Super 22 curve were:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;• added slightly more sub-bass to increase the feeling of bass extension;&lt;/li&gt;
  &lt;li&gt;• removed the scoop between 6~8KHz, which seems arbitrary to me personally.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Hence I came up with the VitorMach target:&lt;/p&gt;

&lt;div class=&quot;post-image&quot;&gt;
    &lt;a href=&quot;/blog/img/posts/vitormach-target.png&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;/blog/img/posts/vitormach-target.png&quot; /&gt;&lt;/a&gt;
    &lt;p class=&quot;post-image-caption&quot;&gt;VitorMach target curve&lt;/p&gt;
&lt;/div&gt;

&lt;p&gt;But wait, how did I get here? Now, it’s time to dive deep into the technical part.&lt;/p&gt;

&lt;h6 id=&quot;room-eq-wizard-rew&quot;&gt;Room EQ Wizard (REW)&lt;/h6&gt;

&lt;p&gt;We’re going to use &lt;a href=&quot;https://www.roomeqwizard.com/&quot; target=&quot;_blank&quot;&gt;Room EQ Wizard (REW)&lt;/a&gt; to create the target curve.&lt;/p&gt;

&lt;p&gt;Super* Review kindly provided &lt;a href=&quot;https://docs.google.com/spreadsheets/d/165QHVUpf6eEBxxvGhIEDjkRsDVrYfZlWTu_hGEaXOmc/edit?usp=sharing&quot; target=&quot;_blank&quot;&gt;this spreadsheet&lt;/a&gt; to help building the input file for REW. In the first tab (“Custom”), we will be filling in amplitude values (dB) for each relevant frequency we wish to key in. It is recommended that the 1000Hz value is kept at 100, and the other frequencies to be adjusted relative to it. You only need to fill in some of the frequencies, and when you export it, the target curve will be interpolated along them. Switch to the “Export” for more information on how to export the curve.&lt;/p&gt;

&lt;p&gt;Here are the exported keypoints of my own target curve:&lt;/p&gt;

&lt;style&gt;
  .target-keypoints th {
    padding: 0 10px;
    font-size: 0.75rem;
  }
  .target-keypoints td {
    padding: 0;
    font-size: 0.75rem;
  }
&lt;/style&gt;

&lt;table class=&quot;target-keypoints&quot;&gt;
&lt;thead&gt;
  &lt;tr&gt;
    &lt;th&gt;Frequency&lt;/th&gt;
    &lt;th&gt;SPL (dB)&lt;/th&gt;
  &lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
    &lt;td&gt;10&lt;/td&gt;
    &lt;td&gt;107.5&lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
    &lt;td&gt;20&lt;/td&gt;
    &lt;td&gt;107.2&lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
    &lt;td&gt;30&lt;/td&gt;
    &lt;td&gt;106.7&lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
    &lt;td&gt;40&lt;/td&gt;
    &lt;td&gt;106.2&lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
    &lt;td&gt;50&lt;/td&gt;
    &lt;td&gt;105.6&lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
    &lt;td&gt;80&lt;/td&gt;
    &lt;td&gt;104.2&lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
    &lt;td&gt;100&lt;/td&gt;
    &lt;td&gt;103.5&lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
    &lt;td&gt;150&lt;/td&gt;
    &lt;td&gt;102.0&lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
    &lt;td&gt;300&lt;/td&gt;
    &lt;td&gt;100.5&lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
    &lt;td&gt;500&lt;/td&gt;
    &lt;td&gt;100.0&lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
    &lt;td&gt;600&lt;/td&gt;
    &lt;td&gt;100.0&lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
    &lt;td&gt;1,000&lt;/td&gt;
    &lt;td&gt;100.0&lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
    &lt;td&gt;1,500&lt;/td&gt;
    &lt;td&gt;102.5&lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
    &lt;td&gt;2,500&lt;/td&gt;
    &lt;td&gt;107.1&lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
    &lt;td&gt;3,000&lt;/td&gt;
    &lt;td&gt;107.5&lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
    &lt;td&gt;3,500&lt;/td&gt;
    &lt;td&gt;107.1&lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
    &lt;td&gt;5,000&lt;/td&gt;
    &lt;td&gt;105.0&lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
    &lt;td&gt;10,000&lt;/td&gt;
    &lt;td&gt;100.0&lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
    &lt;td&gt;20,000&lt;/td&gt;
    &lt;td&gt;94.0&lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
    &lt;td&gt;22,000&lt;/td&gt;
    &lt;td&gt;93.5&lt;/td&gt;
  &lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;

&lt;p&gt;Obs.: I have manually added in values for 10Hz and 22.000KHz to make the edges of the REW output smoother (the range we will export from REW will be 20Hz to 20.000KHz).&lt;/p&gt;

&lt;p&gt;In REW, go to File &amp;gt; Import &amp;gt; Import frequency response. Choose your keypoints .txt file, and you should see this:&lt;/p&gt;

&lt;div class=&quot;post-image&quot;&gt;
    &lt;a href=&quot;/blog/img/posts/rew-imported.png&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;/blog/img/posts/rew-imported.png&quot; /&gt;&lt;/a&gt;
    &lt;p class=&quot;post-image-caption&quot;&gt;Keypoints file imported in REW&lt;/p&gt;
&lt;/div&gt;

&lt;p&gt;Go in the Graph menu and choose one of the smoothing options to make the curve less “jagged”. In my case I went full smooth and choose 1/1 smoothing (the strongest), but feel free to experiment.&lt;/p&gt;

&lt;p&gt;With that done, go to File &amp;gt; Export &amp;gt; Export measurement as text. Make sure your options look like this:&lt;/p&gt;

&lt;div class=&quot;post-image&quot;&gt;
    &lt;a href=&quot;/blog/img/posts/rew-export.png&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;/blog/img/posts/rew-export.png&quot; /&gt;&lt;/a&gt;
    &lt;p class=&quot;post-image-caption&quot;&gt;REW measurement export dialog&lt;/p&gt;
&lt;/div&gt;

&lt;p&gt;Click OK and save a new txt file. You will notice this file is much larger than your input, because it contains the interpolated values for the entire curve, not just your keypoints.&lt;/p&gt;

&lt;h6 id=&quot;using-the-target-curve&quot;&gt;Using the target curve&lt;/h6&gt;

&lt;p&gt;With the target curve file in hands, it’s simply a matter of going to Squiglink’s Equalizer tab and clicking on “Upload Target” to use your own target curve.&lt;/p&gt;

&lt;p&gt;With the target curve loaded, we can begin to use the parametric equalizer, and the AutoEQ function.&lt;/p&gt;

&lt;p&gt;First, choose your IEM model in the Models tab. Hopefully it’s been measured, but if it hasn’t, check “Other IEM databases” down in the footer for other CrinGraph databases, maybe you will find yours in one of these.&lt;/p&gt;

&lt;p&gt;Now, back to the Equalizer tab, and we are ready to hit the AutoEQ button. You should see something like this:&lt;/p&gt;

&lt;div class=&quot;post-image&quot;&gt;
    &lt;a href=&quot;/blog/img/posts/squig-autoeq.png&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;/blog/img/posts/squig-autoeq.png&quot; /&gt;&lt;/a&gt;
    &lt;p class=&quot;post-image-caption&quot;&gt;Squiglink&apos;s AutoEQ feature&lt;/p&gt;
&lt;/div&gt;

&lt;p&gt;There are a few things to note here.&lt;/p&gt;

&lt;p&gt;First, the number of filters on the left sidebar will determine the maximum number of filters AutoEQ will use. The AutoEQ Range parameter specifies the frequency range which AutoEQ should try to equalize. I would heavily recommend not changing this range, because like I said before, the treble region measurements are very unreliable.&lt;/p&gt;

&lt;p&gt;Speaking of unreliability, I would try to avoid using aggressive (high gain) and narrow (high Q) filters above 7KHz, because this might result in a “correction” that does not work well with your particular unit, or on your own ears. In the treble region, prefer wideband adjustments (low Q) and modest gain settings. Use the AutoEQ result only as a basis, and tweak the values on the left sidebar.&lt;/p&gt;

&lt;p&gt;You should end up with something like this after some tweaks on the treble region:&lt;/p&gt;

&lt;div class=&quot;post-image&quot;&gt;
    &lt;a href=&quot;/blog/img/posts/squig-autoeq-adjusted.png&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;/blog/img/posts/squig-autoeq-adjusted.png&quot; /&gt;&lt;/a&gt;
    &lt;p class=&quot;post-image-caption&quot;&gt;A much less aggressive treble EQ&lt;/p&gt;
&lt;/div&gt;

&lt;p&gt;When you are ready, you can hit the “Export Graphic EQ (For Wavelet)” button if you wish to export a convolution settings file for Wavelet, or you can simply reproduce the parametric equalizer values on your equalizer software of choice.&lt;/p&gt;

&lt;p&gt;As an added tip, you can hit this button to flatten one of the curves:&lt;/p&gt;

&lt;div class=&quot;post-image&quot;&gt;
    &lt;a href=&quot;/blog/img/posts/squig-autoeq-flatten.png&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;/blog/img/posts/squig-autoeq-flatten.png&quot; /&gt;&lt;/a&gt;
    &lt;p class=&quot;post-image-caption&quot;&gt;Original squig flattened&lt;/p&gt;
&lt;/div&gt;

&lt;p&gt;This makes it easier to judge how aggresive your equalizer curve is.&lt;/p&gt;

&lt;h6 id=&quot;custom-cringraph&quot;&gt;Custom CrinGraph&lt;/h6&gt;

&lt;p&gt;As I mentioned before, CrinGraph is an open-source software available on GitHub. I have decided to host my own instance using &lt;a href=&quot;https://pages.github.com/&quot; target=&quot;_blank&quot;&gt;GitHub Pages&lt;/a&gt;, which is free. The repository contains &lt;a href=&quot;https://github.com/mlochbaum/CrinGraph/blob/master/Configuring.md&quot; target=&quot;_blank&quot;&gt;documentation&lt;/a&gt; on the basic configuration for deploying your own instance.&lt;/p&gt;

&lt;h6 id=&quot;conclusion&quot;&gt;Conclusion&lt;/h6&gt;

&lt;p&gt;I hope this was useful to you, and feel free to contact me using the Disqus chat below!&lt;/p&gt;

&lt;h6 id=&quot;resources&quot;&gt;Resources&lt;/h6&gt;

&lt;ul&gt;
  &lt;li&gt;• &lt;a href=&quot;/blog/other/Squig - Aria VitorMach.txt&quot; target=&quot;_blank&quot;&gt;EQ settings - Aria&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;• &lt;a href=&quot;/blog/other/Squig - Chu VitorMach.txt&quot; target=&quot;_blank&quot;&gt;EQ settings - Chu&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;• &lt;a href=&quot;/blog/other/Squig - Dusk VitorMach.txt&quot; target=&quot;_blank&quot;&gt;EQ settings - Dusk&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;• &lt;a href=&quot;/blog/other/Aria VitorMach.txt&quot; target=&quot;_blank&quot;&gt;Wavelet settings - Aria&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;• &lt;a href=&quot;/blog/other/Chu VitorMach.txt&quot; target=&quot;_blank&quot;&gt;Wavelet settings - Chu&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;• &lt;a href=&quot;/blog/other/Dusk VitorMach.txt&quot; target=&quot;_blank&quot;&gt;Wavelet settings - Dusk&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h6 id=&quot;update-november-13-2022&quot;&gt;Update: November 13, 2022&lt;/h6&gt;

&lt;p&gt;I have come with a new variant of my target curve. Visit my &lt;a href=&quot;https://www.vitormach.dev/CrinGraph/&quot; target=&quot;_blank&quot;&gt;CrinGraph instance&lt;/a&gt; to check it out.
I also came up with an EQ for the Dusk conforming to this target. Please note that the first and last filters are shelf filters (LSQ and HSQ respectively) instead of the usual peak (PK) type.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;• &lt;a href=&quot;/blog/other/Squig - Dusk VitorMach Nov22.txt&quot; target=&quot;_blank&quot;&gt;EQ settings - Dusk (Nov22)&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</description>
        <pubDate>Sat, 08 Oct 2022 22:40:00 +0000</pubDate>
        <link>https://www.vitormach.dev/blog/2022/10/08/iem-equalization-extravaganza</link>
        <guid isPermaLink="true">https://www.vitormach.dev/blog/2022/10/08/iem-equalization-extravaganza</guid>
        
        <category>audiophile,</category>
        
        <category>audio,</category>
        
        <category>music,</category>
        
        <category>iem,</category>
        
        <category>headphone,</category>
        
        <category>equalizer</category>
        
        
        <category>audio</category>
        
      </item>
    
      <item>
        <title>Tutorial: Vaporwave VHS effect using GIMP</title>
        <description>&lt;p&gt;After a while searching for a good &lt;a href=&quot;https://en.wikipedia.org/wiki/Vaporwave&quot; target=&quot;_blank&quot;&gt;vaporwave&lt;/a&gt; effect, I ended up deciding to do it myself using &lt;a href=&quot;https://en.wikipedia.org/wiki/GIMP&quot; target=&quot;_blank&quot;&gt;GIMP&lt;/a&gt;.&lt;/p&gt;

&lt;div class=&quot;post-image&quot;&gt;
    &lt;a href=&quot;/blog/img/posts/vaporwave-header.jpg&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;/blog/img/posts/vaporwave-header.jpg&quot; /&gt;&lt;/a&gt;
    &lt;p class=&quot;post-image-caption&quot;&gt;Ready for some ａｅｓｔｈｅｔｉｃ?&lt;/p&gt;
&lt;/div&gt;

&lt;!--more--&gt;

&lt;p&gt;Before we start, I suggest you get in the mood:&lt;/p&gt;

&lt;div class=&quot;post-image&quot;&gt;
    &lt;iframe width=&quot;560&quot; height=&quot;315&quot; src=&quot;https://www.youtube.com/embed/bAgmGZ9iQ2Y&quot; frameborder=&quot;0&quot; allowfullscreen=&quot;&quot;&gt;&lt;/iframe&gt;
    &lt;p class=&quot;post-image-caption&quot;&gt;Some classic vaporwave&lt;/p&gt;
&lt;/div&gt;

&lt;p&gt;Here’s our starting image (photography by yours truly):&lt;/p&gt;

&lt;div class=&quot;post-image&quot;&gt;
    &lt;a href=&quot;/blog/img/posts/vaporwave-original.jpg&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;/blog/img/posts/vaporwave-original.jpg&quot; /&gt;&lt;/a&gt;
    &lt;p class=&quot;post-image-caption&quot;&gt;A lovely vintage alarm clock&lt;/p&gt;
&lt;/div&gt;

&lt;p&gt;Our first step will be to decompose the image into the &lt;a href=&quot;https://en.wikipedia.org/wiki/YCbCr&quot; target=&quot;_blank&quot;&gt;YCbCr&lt;/a&gt; color space, which is how video is actually stored (analogically) on an actual VHS tape. We will need to process each channel separately to achieve an authentic effect.&lt;/p&gt;

&lt;p&gt;&lt;b&gt;Colors &amp;gt; Components &amp;gt; Decompose…&lt;/b&gt;&lt;/p&gt;

&lt;div class=&quot;post-image&quot;&gt;
    &lt;a href=&quot;/blog/img/posts/vaporwave-step1.png&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;/blog/img/posts/vaporwave-step1.png&quot; /&gt;&lt;/a&gt;
    &lt;p class=&quot;post-image-caption&quot;&gt;Decompose the image into YCbCr ITU R470&lt;/p&gt;
&lt;/div&gt;

&lt;p&gt;Next, we add a bit of &lt;a href=&quot;https://en.wikipedia.org/wiki/Gaussian_noise&quot; target=&quot;_blank&quot;&gt;noise&lt;/a&gt; to the luma channel only. It will be smoothed out later.&lt;/p&gt;

&lt;p&gt;&lt;b&gt;Filters &amp;gt; Noise &amp;gt; RGB Noise…&lt;/b&gt;&lt;/p&gt;

&lt;div class=&quot;post-image&quot;&gt;
    &lt;a href=&quot;/blog/img/posts/vaporwave-step2.png&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;/blog/img/posts/vaporwave-step2.png&quot; /&gt;&lt;/a&gt;
    &lt;p class=&quot;post-image-caption&quot;&gt;Add a bit of gaussian noise to the luma channel&lt;/p&gt;
&lt;/div&gt;

&lt;p&gt;After that, it’s time for good ol’ &lt;a href=&quot;https://en.wikipedia.org/wiki/Gaussian_blur&quot; target=&quot;_blank&quot;&gt;gaussian blur&lt;/a&gt; on the luma channel. Take note of the values, they will be different later on for the chroma channels due to the effect of &lt;a href=&quot;en.wikipedia.org/wiki/Chroma_subsampling&quot; target=&quot;_blank&quot;&gt;chroma subsampling&lt;/a&gt; in actual VHS.&lt;/p&gt;

&lt;p&gt;&lt;b&gt;Filters &amp;gt; Blur &amp;gt; Gaussian Blur…&lt;/b&gt;&lt;/p&gt;

&lt;div class=&quot;post-image&quot;&gt;
    &lt;a href=&quot;/blog/img/posts/vaporwave-step3.png&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;/blog/img/posts/vaporwave-step3.png&quot; /&gt;&lt;/a&gt;
    &lt;p class=&quot;post-image-caption&quot;&gt;Some gaussian blur to the luma channel&lt;/p&gt;
&lt;/div&gt;

&lt;p&gt;It’s time for the &lt;a href=&quot;https://en.wikipedia.org/wiki/Unsharp_masking&quot; target=&quot;_blank&quot;&gt;unsharp mask&lt;/a&gt; (a.k.a. sharpening). Turns out &lt;a href=&quot;https://en.wikipedia.org/wiki/Videocassette_recorder&quot; target=&quot;_blank&quot;&gt;VCRs&lt;/a&gt; add some rudimentary sharpening to the luma channel to attempt to alleviate some of the blurriness. It introduces the halo effects we are used to seeing in VHS footage.&lt;/p&gt;

&lt;p&gt;&lt;b&gt;Filters &amp;gt; Enhance &amp;gt; Sharpen (Unsharp Mask)…&lt;/b&gt;&lt;/p&gt;

&lt;div class=&quot;post-image&quot;&gt;
    &lt;a href=&quot;/blog/img/posts/vaporwave-step4.png&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;/blog/img/posts/vaporwave-step4.png&quot; /&gt;&lt;/a&gt;
    &lt;p class=&quot;post-image-caption&quot;&gt;Unsharp mask for some nice halos&lt;/p&gt;
&lt;/div&gt;

&lt;p&gt;This might be a good opportunity for a bit of a curve adjustment on the luma channel. VHS doesn’t have that great dynamic range, let’s replicate some of that.&lt;/p&gt;

&lt;p&gt;&lt;b&gt;Colors &amp;gt; Curves…&lt;/b&gt;&lt;/p&gt;

&lt;div class=&quot;post-image&quot;&gt;
    &lt;a href=&quot;/blog/img/posts/vaporwave-step5.png&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;/blog/img/posts/vaporwave-step5.png&quot; /&gt;&lt;/a&gt;
    &lt;p class=&quot;post-image-caption&quot;&gt;Adjust the curves of the luma channel&lt;/p&gt;
&lt;/div&gt;

&lt;p&gt;Now it’s time to add gaussian blur to both of the color channels. Repeat this process for both the redness and blueness channels.&lt;/p&gt;

&lt;p&gt;&lt;b&gt;Filters &amp;gt; Blur &amp;gt; Gaussian Blur…&lt;/b&gt;&lt;/p&gt;

&lt;div class=&quot;post-image&quot;&gt;
    &lt;a href=&quot;/blog/img/posts/vaporwave-step6.png&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;/blog/img/posts/vaporwave-step6.png&quot; /&gt;&lt;/a&gt;
    &lt;p class=&quot;post-image-caption&quot;&gt;Some gaussian blur to the color channels&lt;/p&gt;
&lt;/div&gt;

&lt;p&gt;We will shift the blueness channel a bit to the left to reproduce some of the fringing distortion that usually appears during the reconstruction of the signal. It’s similar to &lt;a href=&quot;https://en.wikipedia.org/wiki/Purple_fringing&quot; target=&quot;_blank&quot;&gt;purple fringing&lt;/a&gt; in photography, albeit with a different cause.&lt;/p&gt;

&lt;div class=&quot;post-image&quot;&gt;
    &lt;a href=&quot;/blog/img/posts/vaporwave-step7.png&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;/blog/img/posts/vaporwave-step7.png&quot; /&gt;&lt;/a&gt;
    &lt;p class=&quot;post-image-caption&quot;&gt;Moved the blueness channel a bit to the left&lt;/p&gt;
&lt;/div&gt;

&lt;div class=&quot;post-image&quot;&gt;
    &lt;a href=&quot;/blog/img/posts/vaporwave-step8.png&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;/blog/img/posts/vaporwave-step8.png&quot; /&gt;&lt;/a&gt;
    &lt;p class=&quot;post-image-caption&quot;&gt;Set &apos;Layer to image size&apos; to flatten the layer shift&lt;/p&gt;
&lt;/div&gt;

&lt;p&gt;We are ready to recompose the image onto RGB again.&lt;/p&gt;

&lt;p&gt;&lt;b&gt;Colors &amp;gt; Components &amp;gt; Compose…&lt;/b&gt;&lt;/p&gt;

&lt;div class=&quot;post-image&quot;&gt;
    &lt;a href=&quot;/blog/img/posts/vaporwave-step9.png&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;/blog/img/posts/vaporwave-step9.png&quot; /&gt;&lt;/a&gt;
    &lt;p class=&quot;post-image-caption&quot;&gt;Recompose the image from YCbCr ITU R470 back to RGB&lt;/p&gt;
&lt;/div&gt;

&lt;p&gt;Now comes the overkill programmer part. I have made a &lt;a href=&quot;https://en.wikipedia.org/wiki/Node.js&quot; target=&quot;_blank&quot;&gt;Node&lt;/a&gt; (or &lt;a href=&quot;https://en.wikipedia.org/wiki/Deno_(software)&quot; target=&quot;_blank&quot;&gt;Deno&lt;/a&gt;) script, which is available &lt;a href=&quot;https://gist.github.com/vittau/4adda9c2d51de49a15d4011456e50fd8&quot; target=&quot;_blank&quot;&gt;here&lt;/a&gt;, to generate a Curve Bend tool &lt;i&gt;.points&lt;/i&gt; file. This tool is used to add line distortions to the image, which we will use to mimic VHS tearing caused by tape degradation.&lt;/p&gt;

&lt;p&gt;You can run it like this:&lt;/p&gt;

&lt;pre&gt;&lt;code class=&quot;shell&quot;&gt;$ node vhs.js &amp;gt;&amp;gt; vhs-curve-bend.points&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Or you can just use &lt;a href=&quot;/blog/other/vhs-curve-bend.points&quot; target=&quot;_blank&quot;&gt;my &lt;i&gt;.points&lt;/i&gt; file&lt;/a&gt; if you really can’t be bothered.&lt;/p&gt;

&lt;p&gt;And then you can load it into the Curve Bend tool. Don’t forget to set the “Curve Type” to “Free”.&lt;/p&gt;

&lt;p&gt;&lt;b&gt;Filters &amp;gt; Distorts &amp;gt; Curve Bend…&lt;/b&gt;&lt;/p&gt;

&lt;div class=&quot;post-image&quot;&gt;
    &lt;a href=&quot;/blog/img/posts/vaporwave-step10.png&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;/blog/img/posts/vaporwave-step10.png&quot; /&gt;&lt;/a&gt;
    &lt;p class=&quot;post-image-caption&quot;&gt;Example output of the script (there are 256 values in total)&lt;/p&gt;
&lt;/div&gt;

&lt;div class=&quot;post-image&quot;&gt;
    &lt;a href=&quot;/blog/img/posts/vaporwave-step11.png&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;/blog/img/posts/vaporwave-step11.png&quot; /&gt;&lt;/a&gt;
    &lt;p class=&quot;post-image-caption&quot;&gt;Curve bend tool&lt;/p&gt;
&lt;/div&gt;

&lt;p&gt;To increase the vaporwave factor we can add a bit of color balance effects and reduce saturation.&lt;/p&gt;

&lt;p&gt;&lt;b&gt;Colors &amp;gt; Color Balance…&lt;/b&gt;
&lt;br /&gt;
&lt;b&gt;Colors &amp;gt; Saturation…&lt;/b&gt;&lt;/p&gt;

&lt;div class=&quot;post-image&quot;&gt;
    &lt;a href=&quot;/blog/img/posts/vaporwave-step12.png&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;/blog/img/posts/vaporwave-step12.png&quot; /&gt;&lt;/a&gt;
    &lt;p class=&quot;post-image-caption&quot;&gt;Color balance: shift highlights to magenta&lt;/p&gt;
&lt;/div&gt;

&lt;div class=&quot;post-image&quot;&gt;
    &lt;a href=&quot;/blog/img/posts/vaporwave-step13.png&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;/blog/img/posts/vaporwave-step13.png&quot; /&gt;&lt;/a&gt;
    &lt;p class=&quot;post-image-caption&quot;&gt;Color balance: shift midtones to cyan&lt;/p&gt;
&lt;/div&gt;

&lt;div class=&quot;post-image&quot;&gt;
    &lt;a href=&quot;/blog/img/posts/vaporwave-step14.png&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;/blog/img/posts/vaporwave-step14.png&quot; /&gt;&lt;/a&gt;
    &lt;p class=&quot;post-image-caption&quot;&gt;Reduce saturation a bit&lt;/p&gt;
&lt;/div&gt;

&lt;p&gt;And that’s it! Here’s our final result:&lt;/p&gt;

&lt;div class=&quot;post-image&quot;&gt;
    &lt;a href=&quot;/blog/img/posts/vaporwave-final.jpg&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;/blog/img/posts/vaporwave-final.jpg&quot; /&gt;&lt;/a&gt;
    &lt;p class=&quot;post-image-caption&quot;&gt;Our vaporwave&apos;d up photo&lt;/p&gt;
&lt;/div&gt;

&lt;p&gt;For great vaporwave.&lt;/p&gt;
</description>
        <pubDate>Sat, 12 Sep 2020 21:25:00 +0000</pubDate>
        <link>https://www.vitormach.dev/blog/2020/09/12/tutorial-vaporwave-vhs-effect-using-gimp</link>
        <guid isPermaLink="true">https://www.vitormach.dev/blog/2020/09/12/tutorial-vaporwave-vhs-effect-using-gimp</guid>
        
        <category>gimp,</category>
        
        <category>tutorial,</category>
        
        <category>photography,</category>
        
        <category>postprocessing,</category>
        
        <category>vaporwave,</category>
        
        <category>retrowave,</category>
        
        <category>vhs</category>
        
        
        <category>software</category>
        
      </item>
    
      <item>
        <title>Linting JavaScript and TypeScript</title>
        <description>&lt;p&gt;&lt;a href=&quot;https://en.wikipedia.org/wiki/Lint_(software)&quot; target=&quot;_blank&quot;&gt;Linting&lt;/a&gt; consists of the usage of tools to analyze source-code, find and report errors, bugs, and bad coding style. This post is a guide to install and use the &lt;a href=&quot;https://eslint.org/&quot; target=&quot;_blank&quot;&gt;ESLint&lt;/a&gt; and &lt;a href=&quot;https://palantir.github.io/tslint/&quot; target=&quot;_blank&quot;&gt;TSLint&lt;/a&gt; linters with &lt;a href=&quot;https://code.visualstudio.com/&quot; target=&quot;_blank&quot;&gt;Visual Studio Code&lt;/a&gt;, while also using the extension &lt;a href=&quot;https://prettier.io/&quot; target=&quot;_blank&quot;&gt;Prettier&lt;/a&gt; to provide the stylistic opinions. We will also extend the &lt;a href=&quot;https://github.com/airbnb/javascript&quot; target=&quot;_blank&quot;&gt;Airbnb style guide&lt;/a&gt; in the ESLint setup. I will not lie to you, dear reader, the main objective of this post is to serve as future reference for myself when setting up this environment again.&lt;/p&gt;

&lt;div class=&quot;post-image&quot;&gt;
    &lt;a href=&quot;/blog/img/posts/linting.png&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;/blog/img/posts/linting.png&quot; /&gt;&lt;/a&gt;
    &lt;p class=&quot;post-image-caption&quot;&gt;Code formatted by Prettier, with TSLint highlighting my bad usage of var.&lt;/p&gt;
&lt;/div&gt;

&lt;!--more--&gt;

&lt;p&gt;This was tested with &lt;a href=&quot;https://nodejs.org&quot; target=&quot;_blank&quot;&gt;Node.js&lt;/a&gt; 11.4.0 and &lt;a href=&quot;https://yarnpkg.com&quot; target=&quot;_blank&quot;&gt;Yarn&lt;/a&gt; 1.13.0.&lt;/p&gt;

&lt;p&gt;Let’s begin by installing all the global dependencies we will need:&lt;/p&gt;

&lt;pre&gt;&lt;code class=&quot;bash&quot;&gt;
yarn global add typescript eslint tslint prettier eslint-plugin-import eslint-plugin-prettier eslint-config-prettier eslint-config-airbnb-base tslint-config-prettier
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Notice that &lt;i&gt;eslint-plugin-import&lt;/i&gt; is necessary because it is a &lt;a href=&quot;https://nodejs.org/en/blog/npm/peer-dependencies/&quot; target=&quot;_blank&quot;&gt;peer dependency&lt;/a&gt; of &lt;i&gt;eslint-config-airbnb-base&lt;/i&gt;. If you need support for &lt;a href=&quot;https://reactjs.org/&quot; target=&quot;_blank&quot;&gt;React&lt;/a&gt;, consider using &lt;i&gt;eslint-config-airbnb&lt;/i&gt; instead. It has additional peer dependencies, check the &lt;a href=&quot;https://www.npmjs.com/package/eslint-config-airbnb&quot; target=&quot;_blank&quot;&gt;dependency page&lt;/a&gt; for more information.&lt;/p&gt;

&lt;p&gt;The &lt;code class=&quot;inline&quot;&gt;.eslintrc.json&lt;/code&gt; file goes into the user’s home folder (Windows: &lt;code class=&quot;inline&quot;&gt;%UserProfile%&lt;/code&gt;, Linux: &lt;code class=&quot;inline&quot;&gt;~&lt;/code&gt;), and is as follows:&lt;/p&gt;

&lt;pre&gt;&lt;code class=&quot;javascript&quot;&gt;{
  &quot;extends&quot;: [&quot;airbnb-base&quot;, &quot;prettier&quot;],
  &quot;plugins&quot;: [&quot;prettier&quot;],
  &quot;rules&quot;: {
    &quot;prettier/prettier&quot;: [&quot;error&quot;],
    &quot;linebreak-style&quot;: 0
  }
}&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Notice that we are extending the Airbnb style guide, and then overriding it with the Prettier config. This is to make sure that ESLint and Prettier won’t fight with each other for the correct style.&lt;/p&gt;

&lt;p&gt;The &lt;code class=&quot;inline&quot;&gt;tslint.json&lt;/code&gt; file also goes into the user’s home folder, and is as follows:&lt;/p&gt;

&lt;pre&gt;&lt;code class=&quot;javascript&quot;&gt;{
  &quot;extends&quot;: [&quot;tslint:recommended&quot;, &quot;tslint-config-prettier&quot;],
  &quot;rules&quot;: {
    &quot;typedef&quot;: [
      true,
      &quot;call-signature&quot;,
      &quot;arrow-call-signature&quot;,
      &quot;parameter&quot;,
      &quot;arrow-parameter&quot;,
      &quot;property-declaration&quot;
    ]
  }
}&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Notice this file’s name is not preceded by a dot (it’s not a hidden file).&lt;/p&gt;

&lt;p&gt;Like before, we have extended a configuration to tell TSLint not to fight against Prettier.&lt;/p&gt;

&lt;p&gt;At this point, we are ready to install the Visual Studio Code extensions. The ones we use are &lt;b&gt;Prettier&lt;/b&gt; (&lt;i&gt;esbenp.prettier-vscode&lt;/i&gt;), &lt;b&gt;ESLint&lt;/b&gt; (&lt;i&gt;dbaeumer.vscode-eslint&lt;/i&gt;) and &lt;b&gt;TSLint&lt;/b&gt; (&lt;i&gt;eg2.tslint&lt;/i&gt;). After installing them, add the following lines to the Visual Studio Code’s user settings:&lt;/p&gt;

&lt;pre&gt;&lt;code class=&quot;json&quot;&gt;&quot;eslint.packageManager&quot;: &quot;yarn&quot;,
&quot;tslint.packageManager&quot;: &quot;yarn&quot;,
&quot;javascript.format.enable&quot;: false,
&quot;typescript.format.enable&quot;: false,
&quot;editor.formatOnSave&quot;: true&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;The lines “&lt;i&gt;javascript.format.enable&lt;/i&gt;” and “&lt;i&gt;typescript.format.enable&lt;/i&gt;” are set to &lt;i&gt;false&lt;/i&gt; to disable the built-in formatter, and allow us to use Prettier correctly.&lt;/p&gt;

&lt;p&gt;And we are done! Reload Visual Studio Code if you haven’t already, and the linting should work. Happy coding!&lt;/p&gt;
</description>
        <pubDate>Sat, 12 Jan 2019 15:00:00 +0000</pubDate>
        <link>https://www.vitormach.dev/blog/2019/01/12/linting-javascript-and-typescript</link>
        <guid isPermaLink="true">https://www.vitormach.dev/blog/2019/01/12/linting-javascript-and-typescript</guid>
        
        <category>javascript,</category>
        
        <category>typescript,</category>
        
        <category>prettier,</category>
        
        <category>lint,</category>
        
        <category>eslint,</category>
        
        <category>tslint,</category>
        
        <category>vscode</category>
        
        
        <category>software</category>
        
      </item>
    
      <item>
        <title>Emulating the Sharp X68000 and the Roland MT-32</title>
        <description>&lt;p&gt;Back then in the eighties there was this new technology called &lt;a href=&quot;https://en.wikipedia.org/wiki/MIDI&quot; target=&quot;_blank&quot;&gt;MIDI&lt;/a&gt;. It was the first attempt at a standard for electronic instrument synthesizers. Computers of the time, such as the Japanese &lt;a href=&quot;https://en.wikipedia.org/wiki/X68000&quot; target=&quot;_blank&quot;&gt;Sharp X68000&lt;/a&gt; usually came with some &lt;a href=&quot;https://en.wikipedia.org/wiki/Frequency_modulation_synthesis&quot; target=&quot;_blank&quot;&gt;FM synthesizer&lt;/a&gt; such as the &lt;a href=&quot;https://en.wikipedia.org/wiki/Yamaha_YM2151&quot; target=&quot;_blank&quot;&gt;Yamaha YM2151&lt;/a&gt;, which modulates instrument sounds out of simple waveforms such as a &lt;a href=&quot;https://en.wikipedia.org/wiki/Square_wave&quot; target=&quot;_blank&quot;&gt;square wave&lt;/a&gt; and changes its timbre by altering the frequency.&lt;/p&gt;

&lt;div class=&quot;post-image&quot;&gt;
    &lt;a href=&quot;/blog/img/posts/sharp-x68000.jpg&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;/blog/img/posts/sharp-x68000.jpg&quot; /&gt;&lt;/a&gt;
    &lt;p class=&quot;post-image-caption&quot;&gt;The Sharp X68000. Ain&apos;t that a beautiful piece of hardware?&lt;/p&gt;
&lt;/div&gt;

&lt;p&gt;Other more expensive devices however, had what’s called a &lt;a href=&quot;https://en.wikipedia.org/wiki/Wavetable_synthesis&quot; target=&quot;_blank&quot;&gt;wavetable&lt;/a&gt;. Wavetables are recordings of the actual instruments, of which many samples were taken and music was modulated by chosing the nearest ones and &lt;a href=&quot;https://en.wikipedia.org/wiki/Interpolation&quot; target=&quot;_blank&quot;&gt;interpolating&lt;/a&gt; between them. One such device is the &lt;a href=&quot;https://en.wikipedia.org/wiki/Roland_MT-32&quot; target=&quot;_blank&quot;&gt;Roland MT-32&lt;/a&gt; MIDI synthesizer, which cost almost US$700 back then in 1987 when it was released.&lt;/p&gt;

&lt;p&gt;Are you ready to embark on an exciting adventure into emulation?!&lt;/p&gt;

&lt;!--more--&gt;

&lt;div class=&quot;post-image&quot;&gt;
    &lt;a href=&quot;/blog/img/posts/roland-mt-32.jpg&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;/blog/img/posts/roland-mt-32.jpg&quot; /&gt;&lt;/a&gt;
    &lt;p class=&quot;post-image-caption&quot;&gt;The mighty Roland MT-32 MIDI synthesizer&lt;/p&gt;
&lt;/div&gt;

&lt;p&gt;Great! But before that, first a little bit of motivation (well, at least my motivation). There was this &lt;a href=&quot;https://en.wikipedia.org/wiki/Shoot_%27em_up&quot; target=&quot;_blank&quot;&gt;shmup&lt;/a&gt; I used to play in the &lt;a href=&quot;https://en.wikipedia.org/wiki/Sega_Genesis&quot; target=&quot;_blank&quot;&gt;Sega Genesis&lt;/a&gt; called &lt;a href=&quot;https://en.wikipedia.org/wiki/Sol-Feace&quot; target=&quot;_blank&quot;&gt;Sol-Feace&lt;/a&gt; (which was actually known as “Sol-Deace” in the Genesis. Or as &lt;a href=&quot;https://youtu.be/g2eH3vYbdGo?t=9m14s&quot; target=&quot;_blank&quot;&gt;“Sol-Feaces” by the AVGN&lt;/a&gt;, but I digress). While reading about the Roland MIDI devices, I found out that one of my favorite games by Wolf Team, now &lt;a href=&quot;https://en.wikipedia.org/wiki/Namco_Tales_Studio&quot; target=&quot;_blank&quot;&gt;Namco Tales Studio&lt;/a&gt;, supported the Roland MT-32 hardware in its Sharp X68000 computer version. I, of course, had to play that.&lt;/p&gt;

&lt;div class=&quot;post-image&quot;&gt;
    &lt;a href=&quot;/blog/img/posts/sol-feace-cover.jpg&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;/blog/img/posts/sol-feace-cover.jpg&quot; /&gt;&lt;/a&gt;
    &lt;p class=&quot;post-image-caption&quot;&gt;Front cover of the Japanese exclusive Sol-Feace release for the Sharp X68000&lt;/p&gt;
&lt;/div&gt;

&lt;p&gt;Now, we first actually need a Sharp X68000 emulator, which is not one of the top priorities in the emulation world, therefore there aren’t many quality options to be honest. Our best bet at this is the &lt;a href=&quot;http://retropc.net/pi/xm6/index.html#download&quot; target=&quot;_blank&quot;&gt;XM6 TypeG&lt;/a&gt; emulator (don’t worry, the actual emulator GUI is in English) (&lt;i&gt;link updated on April 24, 2021&lt;/i&gt;). The installation is pretty straightforward, just extract the .zip you downloaded, and run the appropriate executable for your processor architecture, which are found in distinct directories inside the .zip file. You will also need the actual X68000 BIOS ROM files, which are public domain by now. Just google it, and put the files in the same directory as the emulator executable.&lt;/p&gt;

&lt;p&gt;&lt;i&gt;Note: People report that older versions of the emulator were region-locked to Japanese Windows for some reason. Given that I had no problems whatsoever, it appears this restriction has since been removed by the author.&lt;/i&gt;&lt;/p&gt;

&lt;p&gt;Trouble, however, comes when you first try to figure out how you’re supposed to work with the 3 disks Sol-Feace is composed of. Yes, games spawned multiple disks back then.&lt;/p&gt;

&lt;div class=&quot;post-image&quot;&gt;
    &lt;a href=&quot;/blog/img/posts/ys-sharp-x68000-disk.jpg&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;/blog/img/posts/ys-sharp-x68000-disk.jpg&quot; /&gt;&lt;/a&gt;
    &lt;p class=&quot;post-image-caption&quot;&gt;The X68000 used 5.25&quot; floppy disks, such as this glorious &lt;a href=&quot;https://en.wikipedia.org/wiki/Ys_III:_Wanderers_from_Ys&quot; target=&quot;_blank&quot;&gt;Wanderers from Ys&lt;/a&gt; one&lt;/p&gt;
&lt;/div&gt;

&lt;p&gt;The fact that most of the game is in Japanese doesn’t help matters too much. After fiddling with it for a bit, I figured out that you need disk 3 inserted into FDD0, and disk 2 inserted into FDD1 to get to the main menu. Disk 1 contains the intro, which you can skip entirely (if you wanna watch it, just put disk 1 in the FDD0 slot). At this point, you’ll be greeted with FM synth music being modulated by the internal Sharp X68000’s Yamaha YM2151 chip (emulated chip, of course).&lt;/p&gt;

&lt;div class=&quot;post-image&quot;&gt;
    &lt;iframe width=&quot;560&quot; height=&quot;315&quot; src=&quot;https://www.youtube.com/embed/cqur1C6kg_s&quot; frameborder=&quot;0&quot; allowfullscreen=&quot;&quot;&gt;&lt;/iframe&gt;
    &lt;p class=&quot;post-image-caption&quot;&gt;The Yamaha YM2151 trying its best at &quot;Cosmic Illusion&quot;, the first level music&lt;/p&gt;
&lt;/div&gt;

&lt;p&gt;You are, obviously, not satisfied. You need Roland MT-32 goodness in your life, right? At this point, you have two options: shell out around 170 bucks for a used Roland MT-32, and a USB-to-MIDI cable, both of which you can find on eBay. Some people &lt;a href=&quot;https://www.youtube.com/watch?v=eiMP-PlL6VM&quot; target=&quot;_blank&quot;&gt;go to great lengths&lt;/a&gt; to pursuit this kind of approach. Or you can use an emulator called &lt;a href=&quot;https://github.com/munt/munt&quot; target=&quot;_blank&quot;&gt;Munt&lt;/a&gt;, which closely resembles the sound of the actual device, with some minor inconsistencies. You’ll also need the original Roland MT-32 BIOS ROM files, which are also public domain just like the Sharp X68000 ROM. Installation is also straightforward, and in the options you point Munt to the directory where the ROM files are located.&lt;/p&gt;

&lt;div class=&quot;post-image&quot;&gt;
    &lt;iframe width=&quot;560&quot; height=&quot;315&quot; src=&quot;https://www.youtube.com/embed/j_5RWxHHVvE&quot; frameborder=&quot;0&quot; allowfullscreen=&quot;&quot;&gt;&lt;/iframe&gt;
    &lt;p class=&quot;post-image-caption&quot;&gt;&lt;a href=&quot;https://www.philscomputerlab.com/&quot; target=&quot;_blank&quot;&gt;PhilsComputerLab&lt;/a&gt; posted this comprehensive guide for the installation of the Munt emulator. In our case, finishing step 2 will suffice&lt;/p&gt;
&lt;/div&gt;

&lt;p&gt;Now, while running Munt, open the XM6 emulator and go to the settings. There, you’ll find a tab for MIDI which you’ll have to set up like the screenshot below.&lt;/p&gt;

&lt;div class=&quot;post-image&quot;&gt;
    &lt;a href=&quot;/blog/img/posts/xm6-settings.png&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;/blog/img/posts/xm6-settings.png&quot; /&gt;&lt;/a&gt;
    &lt;p class=&quot;post-image-caption&quot;&gt;XM6 TypeG settings to pass-through the MIDI signal onto the Munt emulator device&lt;/p&gt;
&lt;/div&gt;

&lt;p&gt;To actually boot up the game in MIDI mode, you have to hold the 登録 key (the one next to the HELP key in the X68000 keyboard, and key number 53 in the emulator keyboard settings) right after you insert the disk onto the FDD0 port in the emulator. Hold it until the game’s splash screen appears, and you should see the emulated MT-32 LED display come to life in the Munt window. Success!!!&lt;/p&gt;

&lt;div class=&quot;post-image&quot;&gt;
    &lt;a href=&quot;/blog/img/posts/munt-xm6.png&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;/blog/img/posts/munt-xm6.png&quot; /&gt;&lt;/a&gt;
    &lt;p class=&quot;post-image-caption&quot;&gt;Munt emulator&apos;s screen showing the emulated LED display and the instruments&apos; states&lt;/p&gt;
&lt;/div&gt;

&lt;p&gt;&lt;i&gt;Note: After you make sure everything is working fine, you don’t need to have the Munt GUI opened to use the MT-32 emulation, it will work just the same regardless. Just don’t start playback with the window open, and then close it, or else it WILL break in this case.&lt;/i&gt;&lt;/p&gt;

&lt;p&gt;Now you can listen to some proper game music!&lt;/p&gt;

&lt;div class=&quot;post-image&quot;&gt;
    &lt;audio src=&quot;/blog/music/cosmic-illusion-mt-32.mp3&quot; controls=&quot;&quot; preload=&quot;auto&quot; autobuffer=&quot;&quot;&gt;&lt;/audio&gt;
    &lt;p class=&quot;post-image-caption&quot;&gt;&quot;Cosmic Illusion&quot; in its full Roland MT-32 glory&lt;/p&gt;
&lt;/div&gt;

&lt;p&gt;And thus, we have reached the end of our emulation journey, hope you’ve enjoyed the nostalgia trip, back to this era where stuff we take for granted today, was new and exciting!&lt;/p&gt;

&lt;div class=&quot;post-image&quot;&gt;
    &lt;iframe width=&quot;560&quot; height=&quot;315&quot; src=&quot;https://www.youtube.com/embed/gV9HclMPBRI&quot; frameborder=&quot;0&quot; allowfullscreen=&quot;&quot;&gt;&lt;/iframe&gt;
    &lt;p class=&quot;post-image-caption&quot;&gt;As a bonus, here&apos;s further motivation with the &lt;a href=&quot;https://en.wikipedia.org/wiki/The_Secret_of_Monkey_Island&quot; target=&quot;_blank&quot;&gt;Secret of Monkey Island&lt;/a&gt; theme!&lt;/p&gt;
&lt;/div&gt;
</description>
        <pubDate>Sun, 19 Nov 2017 12:05:00 +0000</pubDate>
        <link>https://www.vitormach.dev/blog/2017/11/19/emulating-the-sharp-x68000-and-the-roland-mt-32</link>
        <guid isPermaLink="true">https://www.vitormach.dev/blog/2017/11/19/emulating-the-sharp-x68000-and-the-roland-mt-32</guid>
        
        <category>emulator,</category>
        
        <category>sharp,</category>
        
        <category>roland,</category>
        
        <category>games,</category>
        
        <category>midi,</category>
        
        <category>sound</category>
        
        
        <category>software</category>
        
      </item>
    
      <item>
        <title>The perfect programming font?</title>
        <description>&lt;p&gt;Ok I’ll share a secret here: I have a tendency to obsess over little details. A &lt;a href=&quot;http://www.azlyrics.com/lyrics/poetsofthefall/stay.html&quot; target=&quot;_blank&quot;&gt;poet&lt;/a&gt; once said “it’s the little things that make the world”, and this is one of the greatest truths to me.&lt;/p&gt;

&lt;p&gt;So let’s talk about one of these little things I can obsess about: fonts.&lt;/p&gt;

&lt;!--more--&gt;

&lt;p&gt;After having spent way more time than I probably should searching for the perfect programming font, I have come up with some candidates. My criteria includes first and foremost readability, but also character proportions, slashed/dotted zeros, l (L) vs I, and yes, even beauty.&lt;/p&gt;

&lt;p&gt;One of the first fonts I remember using other than the Windows’ default &lt;a href=&quot;https://en.wikipedia.org/wiki/Consolas&quot; target=&quot;_blank&quot;&gt;Consolas&lt;/a&gt; was &lt;a href=&quot;http://nodnod.net/2009/feb/12/adding-straight-single-and-double-quotes-inconsola/&quot; target=&quot;_blank&quot;&gt;Inconsolata-dz&lt;/a&gt; (a variant of &lt;a href=&quot;https://fonts.google.com/specimen/Inconsolata&quot; target=&quot;_blank&quot;&gt;Inconsolata&lt;/a&gt;). It is a readable and beautiful font, but one of the little things that annoy me is the width and character spacing, which tends to spread stuff horizontally more than I’d like.&lt;/p&gt;

&lt;p&gt;Then I tried &lt;a href=&quot;https://en.wikipedia.org/wiki/Monaco_(typeface)&quot; target=&quot;_blank&quot;&gt;Monaco&lt;/a&gt;, a font that ships with macOS (except I put it on Windows). It’s a very stylish one, for sure. I used it for quite a while, until I got annoyed by it’s, how should I put it, “opinionated” style. I don’t know, it’s as if it’s simply too stylish for a programming font. By the way, check out &lt;a href=&quot;http://eurofurence.net/monofur.html&quot; target=&quot;_blank&quot;&gt;monofur&lt;/a&gt; if you DO like your stylish programming fonts.&lt;/p&gt;

&lt;p&gt;Then I did try &lt;a href=&quot;https://adobe-fonts.github.io/source-code-pro/&quot; target=&quot;_blank&quot;&gt;Source Code Pro&lt;/a&gt; for a while, but felt it suffered from the same problem as the Inconsolata family.&lt;/p&gt;

&lt;p&gt;I stumbled upon &lt;a href=&quot;http://madmalik.github.io/mononoki/&quot;&gt;mononoki&lt;/a&gt;, an awesome font. I ended up not using it after having &lt;a href=&quot;https://github.com/madmalik/mononoki/issues/38#issuecomment-225941213&quot; target=&quot;_blank&quot;&gt;some problems&lt;/a&gt; with JetBrains software, but I still think it’s a great font. Readable, good spacing, pleasant to look at.&lt;/p&gt;

&lt;p&gt;I believe that’s around the time when I found about &lt;a href=&quot;https://en.wikipedia.org/wiki/Typographic_ligature&quot; target=&quot;_blank&quot;&gt;font ligatures&lt;/a&gt;. What it does is merge multiple characters into one, useful to turn stuff like &lt;i&gt;==&lt;/i&gt;, &lt;i&gt;&amp;gt;=&lt;/i&gt; and &lt;i&gt;=&amp;lt;&lt;/i&gt; that we use all the time into more pleasant-looking glyphs. So, the first ones I tried were &lt;a href=&quot;https://github.com/tonsky/FiraCode&quot; target=&quot;_blank&quot;&gt;Fira Code&lt;/a&gt; and &lt;a href=&quot;http://larsenwork.com/monoid/&quot; target=&quot;_blank&quot;&gt;Monoid&lt;/a&gt;. The problem is that, while the ligatures are pretty cool, for some reason I couldn’t get myself into liking these fonts’ styles.&lt;/p&gt;

&lt;div class=&quot;post-image&quot;&gt;
    &lt;a href=&quot;/blog/img/posts/firacode.png&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;/blog/img/posts/firacode.png&quot; /&gt;&lt;/a&gt;
    &lt;p class=&quot;post-image-caption&quot;&gt;Ligatures!&lt;/p&gt;
&lt;/div&gt;

&lt;p&gt;At this moment I felt like I’ve seen it all. As if I had mastered the &lt;a href=&quot;http://www.taobackup.com&quot; target=&quot;_blank&quot;&gt;Tao of Backup&lt;/a&gt;, but for fonts. That’s when I stumbled upon &lt;a href=&quot;http://input.fontbureau.com/&quot; target=&quot;_blank&quot;&gt;Input&lt;/a&gt;. It’s a non-&lt;a href=&quot;https://en.wikipedia.org/wiki/Monospaced_font&quot; target=&quot;_blank&quot;&gt;monospace&lt;/a&gt; programming font. The blasphemy, right?! What about our carefully aligned ASCII art? Well, turns out you don’t really NEED a monospace font to program. It’s not like Sublime Text will yell at you or something. No, really, I promise. While I didn’t particularly enjoy Input’s look and eventually dropped it, I felt it’s a very important turning point for programming font development. You can design a font for programming and have it not be monospaced. I hope we get to see more of these with time…&lt;/p&gt;

&lt;p&gt;So, what am I using right now? I’m currently testing this font called &lt;a href=&quot;https://be5invis.github.io/Iosevka/&quot; target=&quot;_blank&quot;&gt;Iosevka&lt;/a&gt;. It’s a beautiful and readable font, and a pretty narrow one. Maybe a little bit TOO narrow, but I like it. Oh yes, it has ligatures too. Currently pairing it with the &lt;a href=&quot;https://marketplace.visualstudio.com/items?itemName=idleberg.hopscotch&quot; target=&quot;_blank&quot;&gt;Hopscotch&lt;/a&gt; theme for &lt;a href=&quot;https://code.visualstudio.com/&quot; target=&quot;_blank&quot;&gt;Visual Studio Code&lt;/a&gt; (Yes, I think it’s better than Sublime Text, Atom and Brackets. No, it’s not a bloated mess like Visual Studio). I think it’s one of the most readable and pleasant-looking combos I’ve come up with so far.&lt;/p&gt;

&lt;p&gt;My conclusion to this topic is that there’s no conclusion. Fonts are a very personal thing, people have different priorities and different aesthetics standards. So I encourage you to try out all these fonts and more to find the one that suits you the best. If you do, please report back in the comments!&lt;/p&gt;

&lt;div class=&quot;post-image&quot;&gt;
    &lt;a href=&quot;/blog/img/posts/iosevka.png&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;/blog/img/posts/iosevka.png&quot; /&gt;&lt;/a&gt;
    &lt;p class=&quot;post-image-caption&quot;&gt;Hopscotch + Iosevka in Visual Studio Code&lt;/p&gt;
&lt;/div&gt;
</description>
        <pubDate>Sat, 22 Apr 2017 21:49:00 +0000</pubDate>
        <link>https://www.vitormach.dev/blog/2017/04/22/the-perfect-programming-font</link>
        <guid isPermaLink="true">https://www.vitormach.dev/blog/2017/04/22/the-perfect-programming-font</guid>
        
        <category>font,</category>
        
        <category>programming</category>
        
        
        <category>software</category>
        
      </item>
    
      <item>
        <title>Darkenizer - Dark theme generator</title>
        <description>&lt;p&gt;One of these days while I was preparing a dark version of a SCSS, I noticed this process could probably be automated with decent results. So I had the idea to make &lt;a href=&quot;https://www.vitormach.dev/darkenizer&quot; target=&quot;_blank&quot;&gt;darkenizer&lt;/a&gt;.&lt;/p&gt;

&lt;div class=&quot;post-image&quot;&gt;
    &lt;a href=&quot;/blog/img/posts/darkenizer.png&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;/blog/img/posts/darkenizer.png&quot; /&gt;&lt;/a&gt;
    &lt;p class=&quot;post-image-caption&quot;&gt;darkenizer screenshot&lt;/p&gt;
&lt;/div&gt;

&lt;!--more--&gt;

&lt;p&gt;It works by parsing the CSS/SCSS file searching for hex colors, and then transforms these colors into &lt;a href=&quot;https://en.wikipedia.org/wiki/HSL_and_HSV&quot; target=&quot;_blank&quot;&gt;HSL color space&lt;/a&gt;. After that, it’s only a matter of inverting the “lightness” (L) channel to create a darker version of the color while preserving its original hue and saturation.&lt;/p&gt;

&lt;p&gt;In the future I plan to add some configurations such as contrast, and an easy way to replace certain colors manually with a color picker.&lt;/p&gt;

&lt;p&gt;It was developed using &lt;a href=&quot;https://vuejs.org/&quot; target=&quot;_blank&quot;&gt;Vue.js&lt;/a&gt;, &lt;a href=&quot;https://www.npmjs.com/package/scss-parser&quot; target=&quot;_blank&quot;&gt;scss-parser&lt;/a&gt; + &lt;a href=&quot;https://www.npmjs.com/package/query-ast&quot; target=&quot;_blank&quot;&gt;query-ast&lt;/a&gt; and &lt;a href=&quot;https://www.npmjs.com/package/hex-to-hsl&quot; target=&quot;_blank&quot;&gt;hex-to-hsl&lt;/a&gt; + &lt;a href=&quot;https://www.npmjs.com/package/hsl-to-hex&quot; target=&quot;_blank&quot;&gt;hsl-to-hex&lt;/a&gt;. I have to say it was a breath of fresh air using Vue.js after a year of Angular 2 development, but that’s subject for another post…&lt;/p&gt;
</description>
        <pubDate>Sat, 08 Apr 2017 13:45:00 +0000</pubDate>
        <link>https://www.vitormach.dev/blog/2017/04/08/darkenizer-dark-theme-generator</link>
        <guid isPermaLink="true">https://www.vitormach.dev/blog/2017/04/08/darkenizer-dark-theme-generator</guid>
        
        <category>css,</category>
        
        <category>scss,</category>
        
        <category>dark-theme,</category>
        
        <category>utility</category>
        
        
        <category>software</category>
        
      </item>
    
      <item>
        <title>Trying out f.lux</title>
        <description>&lt;p&gt;I decided to try &lt;a href=&quot;https://justgetflux.com&quot; target=&quot;_blank&quot;&gt;f.lux&lt;/a&gt; today. What is it you might wonder?&lt;/p&gt;

&lt;p&gt;It’s a neat little software that adjusts the &lt;a href=&quot;https://en.wikipedia.org/wiki/Color_balance&quot; target=&quot;_blank&quot;&gt;white balance&lt;/a&gt; of your monitor automatically according to your location and the time of the day. As such, you don’t get that harsh blue tint that keeps you awake at night (seriously, it can affect your sleep).&lt;/p&gt;

&lt;div class=&quot;post-image&quot;&gt;
    &lt;a href=&quot;/blog/img/posts/flux-shot.png&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;/blog/img/posts/flux-shot.png&quot; /&gt;&lt;/a&gt;
    &lt;p class=&quot;post-image-caption&quot;&gt;f.lux beta screenshot&lt;/p&gt;
&lt;/div&gt;

&lt;!--more--&gt;

&lt;p&gt;Installation was very straightforward, and so are the options.&lt;/p&gt;

&lt;p&gt;It does thake some getting used to, but after awhile if you look back at how it was you’ll squint your eyes in agony. So I’m guessing it’s doing its job.&lt;/p&gt;
</description>
        <pubDate>Wed, 05 Apr 2017 23:55:00 +0000</pubDate>
        <link>https://www.vitormach.dev/blog/2017/04/05/trying-out-flux</link>
        <guid isPermaLink="true">https://www.vitormach.dev/blog/2017/04/05/trying-out-flux</guid>
        
        <category>software,</category>
        
        <category>color-calibration,</category>
        
        <category>white-balance</category>
        
        
        <category>software</category>
        
      </item>
    
      <item>
        <title>Starting out</title>
        <description>&lt;p&gt;It’s time to start my own blog!&lt;/p&gt;

&lt;p&gt;Here I will write about my software development findings, photography tips and ideas, music I like, or maybe some random thoughts I think are worth sharing.&lt;/p&gt;

&lt;p&gt;The blog theme is based on &lt;a href=&quot;https://github.com/rowanoulton/travelog-theme&quot; target=&quot;_blank&quot;&gt;Travelog&lt;/a&gt;.&lt;/p&gt;
</description>
        <pubDate>Wed, 05 Apr 2017 23:10:00 +0000</pubDate>
        <link>https://www.vitormach.dev/blog/2017/04/05/starting-out</link>
        <guid isPermaLink="true">https://www.vitormach.dev/blog/2017/04/05/starting-out</guid>
        
        <category>blog</category>
        
        
        <category>blog</category>
        
      </item>
    
  </channel>
</rss>
