Files
ioccc/2020/otterness/index.html
T
Landon Curt Noll 9d3438fb88 build missing HTML files for entries
Setup a simple topnav for missing HTML files for entries.

Added `bin/gen-other-html.sh` to build entry HTML files from
markdown other than README.md to index.html HTML files.

Fixed duplicate link text in `2020/ferguson1/gameplay.md`.

Improved `inc/md2html.cfg` to support building the missing HTML
files for entries.

Added `make gen_other_html` to top level Makefile.
Added `make gen_other_html` to `make quick_www` and `make www`.

Fixed inventory links for year level index.html files.
Changed `bin/output-year-index.sh` VERSION from "1.0.1 2024-02-23"
to "1.1 2024-02-27".

Added missing lines in `manifest.numbers`.  Update the affected
`.entry.json` files.

The manifest (in both `manifest.numbers` and the collection of
manifests from of all entry `.entry.json` files) now match.  Errors
from `make verify_entry_files` will now abort both `make quick_www`
and `make www` rules in the top level `Makefile`.

Changed markdown files in manifest to have an _inventory_order_ of
_2000000000_ so that the `index.html` file will usually appear at
the start of the _Secondary files_ set for the "#inventory" section
of an entry's `index.html` file.

Changed compressed tar files (files that end in _.tar.bz2_) in
manifest to have an _inventory_order_ of _100000_ so that these
files will usually appear at the end of the _Primary files_ set for
the "#inventory" section of an entry's `index.html` file.

Added 'Jump to top` link above the _Primary files_ section.
Changed `bin/output-index-inventory.sh` VERSION from "1.1.1 2024-02-23"
to "1.2 2024-02-27".

Updated HTML files to perform the above via `make www`.
2024-02-27 22:36:20 -08:00

334 lines
16 KiB
HTML
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<!-- START: two lines up starts content from: inc/top.default.html -->
<!-- -->
<!-- !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -->
<!-- !!! DO NOT MODIFY THIS FILE - This file is generated by a tool !!! -->
<!-- !!! DO NOT MODIFY THIS FILE - This file is generated by a tool !!! -->
<!-- !!! DO NOT MODIFY THIS FILE - This file is generated by a tool !!! -->
<!-- !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -->
<!-- -->
<!-- END: this line ends content from: inc/top.default.html -->
<!-- -->
<!-- The original markdown content was formed by the tool: bin/readme2index.sh -->
<!-- The HTML was converted from markdown by the tool: bin/md2html.sh -->
<!-- -->
<!-- START: this line starts content from: inc/head.default.html -->
<head>
<link rel="stylesheet" href="../../ioccc.css">
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=yes">
<title>2020/otterness - Most percussive</title>
<meta name="description" content="2020 IOCCC entry otterness - Most percussive">
<meta name="keywords" content="IOCCC, 2020, IOCCC 2020, IOCCC entry, otterness, Most percussive">
</head>
<!-- END: this line ends content from: inc/head.default.html -->
<!-- START: this line starts content from: inc/body.default.html -->
<body>
<!-- END: this line ends content from: inc/body.default.html -->
<!-- START: this line starts content from: inc/header.default.html -->
<div class="header">
<img src="../../png/ioccc.png" alt="IOCCC image by Matt Zucker" width=300 height=110>
<h1>The International Obfuscated C Code Contest</h1>
<h2>2020/otterness - Most percussive</h2>
</div>
<!-- END: this line ends content from: inc/header.default.html -->
<!-- START: this line starts content from: inc/topnav.mid.html -->
<div class="topnav">
<a class="Left" href="../kurdyukov4/index.html">&larr; kurdyukov4</a>
<a class="Left" href="../index.html">&uarr; 2020 &uarr;</a>
<a class="Left" href="../tsoj/index.html">tsoj &rarr;</a>
<a class="Right" href="#inventory">Inventory</a>
</div>
<!-- END: this line ends content from: inc/topnav.mid.html -->
<!-- START: this line starts content from: inc/begin-row.default.html -->
<div class="row">
<!-- END: this line ends content from: inc/begin-row.default.html -->
<!-- START: this line starts content from: inc/begin-leftcolumn.default.html -->
<div class="leftcolumn">
<!-- END: this line ends content from: inc/begin-leftcolumn.default.html -->
<!-- START: this line starts content from: inc/sidenav.default.html -->
<div class="sidenav">
<a href="#content">Jump to contents</a>
</div>
<hr>
<div class="sidenav">
<a href="../../index.html">IOCCC Home</a>
<a href="../../years.html">Winning Entries</a>
<a href="../../authors.html">People who have won</a>
</div>
<hr>
<div class="sidenav">
<a href="../../news.html">IOCCC News</a>
<a href="../../faq.html#submit">How to enter the IOCCC</a>
<a href="../../faq.html">FAQ</a>
</div>
<hr>
<div class="sidenav">
<a href="../../bugs.html">Bugs &amp; (mis)features</a>
<a href="../../faq.html#fix_an_entry">Fixing IOCCC entries</a>
<a href="../../faq.html#fix_web_site">Fixing the web site</a>
<a href="../../faq.html#fix_author">Fixing author info</a>
<a href="../../thanks-for-help.html">Thanks for the help</a>
</div>
<hr>
<div class="sidenav">
<a href="../../judges.html">The IOCCC Judges</a>
<a href="../../contact.html">Contacting the IOCCC</a>
</div>
<hr>
<div class="sidenav">
<a href="#top">Jump to top</a>
</div>
<!-- END: this line ends content from: inc/sidenav.default.html -->
<!-- START: this line starts content from: inc/end-leftcolumn.default.html -->
</div>
<!-- END: this line ends content from: inc/end-leftcolumn.default.html -->
<!-- START: this line starts content from: inc/begin-rightcolumn.default.html -->
<div class="rightcolumn">
<!-- END: this line ends content from: inc/begin-rightcolumn.default.html -->
<!-- START: this line starts content from: inc/before-content.default.html -->
<a name="content"></a>
<!-- END: this line ends content from: inc/before-content.default.html -->
<!-- START: this line starts content for HTML phase 20 by: bin/output-index-author.sh via bin/md2html.sh -->
<!-- START: this line starts content generated by: bin/output-index-author.sh -->
<h2 id="author"><a name="author"></a>Author:</h2>
<ul>
<li>Name: <a href="../../authors.html#Nathan_Otterness">Nathan
Otterness</a><br> Location: <a href="../../location.html#US">US</a>
<br><br></li>
</ul>
<!-- END: next line ends content generated by: bin/output-index-author.sh -->
<!-- END: this line ends content for HTML phase 20 by: bin/output-index-author.sh via bin/md2html.sh -->
<!-- START: this line starts content for HTML phase 21 by: bin/pandoc-wrapper.sh via bin/md2html.sh -->
<h2 id="to-build">To build:</h2>
<div class="sourceCode" id="cb1"><pre class="sourceCode sh"><code class="sourceCode bash"><span id="cb1-1"><a href="#cb1-1" aria-hidden="true" tabindex="-1"></a><span class="fu">make</span></span></code></pre></div>
<h3 id="bugs-and-misfeatures">Bugs and (Mis)features:</h3>
<p>The current status of this entry is:</p>
<pre><code>STATUS: INABIAF - please **DO NOT** fix</code></pre>
<p>For more detailed information see <a
href="/bugs.md#2020-otterness">2020 otterness in bugs.md</a>.</p>
<h2 id="to-use">To use:</h2>
<div class="sourceCode" id="cb3"><pre class="sourceCode sh"><code class="sourceCode bash"><span id="cb3-1"><a href="#cb3-1" aria-hidden="true" tabindex="-1"></a><span class="ex">./prog</span></span></code></pre></div>
<h2 id="try">Try:</h2>
<div class="sourceCode" id="cb4"><pre class="sourceCode sh"><code class="sourceCode bash"><span id="cb4-1"><a href="#cb4-1" aria-hidden="true" tabindex="-1"></a><span class="ex">./try.sh</span></span></code></pre></div>
<p>Now play <code>output.mid</code> and <code>output2.mid</code> in an
audio player that can play MIDI files.</p>
<h2 id="judges-remarks">Judges’ remarks:</h2>
<p>In an entry that boasts not using literals, one would expect to see
straightforward ways to produce small integers like
<code>!(x^x)&lt;&lt;!(x^x)</code>, etc. but this entry is trickier than
that. Deciphering what it does, apart from reading <code>stdin</code>
and writing to <code>stdout</code>, would take a while.</p>
<p>While doing that, you can be audibly <em>entertained</em> by a sample
of its output.</p>
<h2 id="authors-remarks">Author’s remarks:</h2>
<h3 id="midi-boots-and-cats">MIDI “boots and cats”</h3>
<p>This program seeks to automatically “improve” standard MIDI files
(.mid) by adding an extra track that provides a driving drum beat to
bring some excitement into boring video-game music rips or classical
music sequences that otherwise only see the light of day when modern
musicians import them into FL Studio to copy a few chords.</p>
<h4 id="prerequisites">Prerequisites</h4>
<p>If you’re not using Windows Media Player or already familiar with
MIDI files, you may need to install some additional software to be able
to listen to them. For example, on Ubuntu, I was able to play them in
VLC after installing <code>vlc-plugin-fluidsynth</code> and
<code>fluid-soundfont-gm</code>.</p>
<p>You can obtain MIDIs in many places, but I mostly tested the program
using files I found <a
href="http://www.kunstderfuge.com/beethoven/variae.htm#Symphonies">here</a>.
However, as discussed under the <a href="#limitations">Limitations</a>
section below, not all of them work correctly. I will admit to having
used
<code>http://www.kunstderfuge.com/-/midi.asp?file=beethoven/symphony_6_1_(c)cvikl.mid</code>
for most of my testing (see <a href="cvikl.mid">cvikl.mid</a>).</p>
<h3 id="usage">Usage</h3>
<p>Compile the program using the following command (I tested this using
both <code>clang</code> and <code>gcc</code>):</p>
<div class="sourceCode" id="cb5"><pre class="sourceCode sh"><code class="sourceCode bash"><span id="cb5-1"><a href="#cb5-1" aria-hidden="true" tabindex="-1"></a><span class="fu">cc</span> <span class="at">-pedantic</span> <span class="at">-Wall</span> <span class="at">-Werror</span> <span class="at">-Wextra</span> <span class="at">-O3</span> <span class="at">-o</span> prog prog.c</span></code></pre></div>
<p>The program expects a MIDI on <code>stdin</code>, and writes a
modified MIDI to <code>stdout</code>:</p>
<pre><code>./prog &lt;input.mid &gt;output.mid</code></pre>
<p>If the program encounters an error, no output will generally be
produced, and it will exit with a specific status code. Meanings of the
various status codes are listed below, under the “Program error codes”
heading. On success, the program exits with a code of 0.</p>
<h3 id="limitations">Limitations</h3>
<ol type="1">
<li><p>The program does not support MIDI files over 4 MB (specifically,
it will not take input files larger than <code>2^22 - 1</code> bytes).
This is unlikely to be a big limitation in practice, since even lengthy
MIDIs are rarely over a couple hundred KB.</p></li>
<li><p>Not all MIDIs set (or <em>correctly</em> set) their timing
information, which will lead to the tempo of the drum beat not matching
the track. This will be especially true for “live performance” .mid
files.</p></li>
<li><p>There may be some types of MIDI messages that the program is
unable to correctly parse, but I have rarely seen this in practice. The
largest cause of program failures, in my experience, has been Limitation
2.</p></li>
</ol>
<h4 id="obfuscation-notes">Obfuscation notes</h4>
<p>I had one primary goal when writing this program: include no C
literals whatsoever. The final C file includes no numerical, string, or
character literals. Instead, all literals have been replaced with a
handful of global variables, which are occasionally modified throughout
the file to prevent simple uses of find-and-replace.</p>
<p>So, in a sense, this obfuscation is simply an intentional use of
global variables’ classic problem: absolute spaghetti code. The absence
of any sort of literals has the added benefit of forcing any would-be
reader to trace the contents of many variables starting from
<code>main()</code>, since, without literals, very little of the code
gives any inherent visual cues as to its purpose.</p>
<p>I already took the liberty of running <code>prog.c</code> through
<code>clang-format</code>, since it still fits in the size limit and the
formatting of the code was never intended to be an obfuscation technique
here.</p>
<h4 id="other-remarks">Other remarks</h4>
<p>MIDI files are generally divided up into one or more “tracks” that
play concurrently. While it is easy to find the positions of each of
these tracks in the file, figuring out the amount of time each track is
supposed to play is more difficult, and requires parsing every track in
its entirety. This means that generating a drum beat that covers the
entire piece of music requires parsing every track (the entire file) in
order to determine the longest track.</p>
<p>Once the program has determined the longest track in the file, it
generates a new track, containing the simple 4-note percussion sequence,
to match the length (in beats) of the longest-running track. It appends
the new track onto the end of the file, taking care to update the file
header, as well.</p>
<h3 id="program-error-codes">Program error codes</h3>
<p>If the program encounters an error, it will exit with a nonzero code.
The error codes can be interpreted as follows:</p>
<ul>
<li><code>1</code>: Encountered an invalid MIDI variable-length integer
in the input.</li>
<li><code>2</code>: Attempted to write an invalid MIDI variable-length
integer to output. (This would be an internal error).</li>
<li><code>3</code>: Encountered an unsupported MIDI event in the
input.</li>
<li><code>4</code>: Encountered a bad MIDI track header in the
input.</li>
<li><code>5</code>: The input MIDI file uses SMPTE time division, which
isn’t supported.</li>
<li><code>6</code>: Failed allocating a temporary buffer to hold a
single copy of our “beat” messages.</li>
<li><code>7</code>: Failed allocating a buffer to hold the new track
data.</li>
<li><code>8</code>: Failed allocating a buffer to hold the input
file.</li>
<li><code>9</code>: The input file was too large.</li>
<li><code>10</code>: The input file’s MIDI header was incorrect (but
this isn’t checked very thoroughly).</li>
</ul>
<h2 id="copyright-and-cc-by-sa-4.0-license">Copyright and CC BY-SA 4.0
License:</h2>
<p>This file is Copyright (c) 2023 by Landon Curt Noll. All Rights
Reserved. You are free to share and adapt this file under the terms of
this license:</p>
<pre><code>Creative Commons Attribution-ShareAlike 4.0 International (CC BY-SA 4.0)</code></pre>
<p>For more information, see:
https://creativecommons.org/licenses/by-sa/4.0/</p>
<!-- END: this line ends content for HTML phase 21 by: bin/pandoc-wrapper.sh via bin/md2html.sh -->
<!-- START: this line starts content for HTML phase 22 by: bin/output-index-inventory.sh via bin/md2html.sh -->
<!-- START: this line starts content generated by: bin/output-index-inventory.sh -->
<h1 id="inventory-for-2020otterness"><a name="inventory"></a>Inventory
for 2020/otterness</h1>
<p><a href="#top">Jump to top</a></p>
<h2 id="primary-files">Primary files</h2>
<ul>
<li><a
href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2020/otterness/prog.c">prog.c</a>
- entry source</li>
<li><a
href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2020/otterness/Makefile">Makefile</a>
- entry Makefile</li>
<li><a
href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2020/otterness/prog.orig.c">prog.orig.c</a>
- original source</li>
<li><a
href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2020/otterness/try.sh">try.sh</a>
- how to run</li>
<li><a href="cvikl.mid">cvikl.mid</a> - sample input sound</li>
<li><a href="entertainer.mid">entertainer.mid</a> - sample input
sound</li>
<li><a href="2020_otterness.tar.bz2">2020_otterness.tar.bz2</a> -
download entry source</li>
</ul>
<h2 id="secondary-files">Secondary files</h2>
<ul>
<li><a href="index.html">index.html</a> - entry home page</li>
<li><a
href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2020/otterness/.entry.json">.entry.json</a>
- description of entry in JSON</li>
<li><a
href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2020/otterness/.gitignore">.gitignore</a>
- list of files that should not be committed under git</li>
<li><a href=".path">.path</a> - directory path from top directory</li>
<li><a
href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2020/otterness/README.md">README.md</a>
- markdown source for index.html</li>
</ul>
<!-- END: next line ends content generated by: bin/output-index-inventory.sh -->
<!-- END: this line ends content for HTML phase 22 by: bin/output-index-inventory.sh via bin/md2html.sh -->
<!-- START: this line starts content from: inc/after-content.default.html -->
<!-- END: this line ends content from: inc/after-content.default.html -->
<!-- START: this line starts content from: inc/end-rightcolumn.default.html -->
</div>
<!-- END: this line ends content from: inc/end-rightcolumn.default.html -->
<!-- START: this line starts content from: inc/end-row.default.html -->
</div>
<!-- END: this line ends content from: inc/end-row.default.html -->
<!-- START: this line starts content from: inc/footer.default.html -->
<div class="footer">
<hr>
<h2>Coda</h2>
<p><a href="https://validator.w3.org/nu/?doc=https%3A%2F%2Fioccc-src.github.io%2Ftemp-test-ioccc%2F2020%2Fotterness%2Findex.html">Nu HTML check this web page</a></p>
<p><a href="#top">Jump to top</a> <a href="#content">Jump to Content</a> <a href="#inventory">Jump to Inventory</a></p>
</div>
<!-- END: this line ends content from: inc/footer.default.html -->
<!-- START: this line starts content from: inc/bottom.default.html -->
</body>
</html>
<!-- END: this line ends content from: inc/bottom.default.html -->