"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en">
<head>
-<!-- 2025-07-30 ke 08:54 -->
+<!-- 2025-07-30 ke 12:27 -->
<meta http-equiv="Content-Type" content="text/html;charset=utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<title>Fractals</title>
<h2>Table of Contents</h2>
<div id="text-table-of-contents" role="doc-toc">
<ul>
-<li><a href="#org9db4739">1. Fractal circles</a></li>
-<li><a href="#org701e05b">2. Fractal circles animated</a></li>
-<li><a href="#org18874d5">3. Fractal of squares</a></li>
-<li><a href="#orgc9aa92c">4. Fractal of squares animated</a></li>
-<li><a href="#org95a64d0">5. Fractal of trees</a></li>
+<li><a href="#orgdb5ca43">1. Fractal circles</a></li>
+<li><a href="#orgf97f64c">2. Fractal circles animated</a></li>
+<li><a href="#org341855f">3. Fractal of squares</a></li>
+<li><a href="#org7f2b476">4. Fractal of squares animated</a></li>
+<li><a href="#orgbcfd4b5">5. Fractal of trees</a></li>
</ul>
</div>
</div>
</style>
-<div id="outline-container-org9db4739" class="outline-2">
-<h2 id="org9db4739"><span class="section-number-2">1.</span> Fractal circles</h2>
+<div id="outline-container-orgdb5ca43" class="outline-2">
+<h2 id="orgdb5ca43"><span class="section-number-2">1.</span> Fractal circles</h2>
<div class="outline-text-2" id="text-1">
<p>
This QBasic program generates a visually captivating spiral fractal
</p>
-<div id="org0b4ece3" class="figure">
+<div id="orgfa586bb" class="figure">
<p><a href="fractal circles.bas" class="responsive-img"><img src="fractal%20circles.png" alt="fractal%20circles.png" class="responsive-img" /></a>
</p>
</div>
</div>
</div>
-<div id="outline-container-org701e05b" class="outline-2">
-<h2 id="org701e05b"><span class="section-number-2">2.</span> Fractal circles animated</h2>
+<div id="outline-container-orgf97f64c" class="outline-2">
+<h2 id="orgf97f64c"><span class="section-number-2">2.</span> Fractal circles animated</h2>
<div class="outline-text-2" id="text-2">
<p>
This QBasic program creates an animated fractal composed of circles,
</div>
</div>
-<div id="outline-container-org18874d5" class="outline-2">
-<h2 id="org18874d5"><span class="section-number-2">3.</span> Fractal of squares</h2>
+<div id="outline-container-org341855f" class="outline-2">
+<h2 id="org341855f"><span class="section-number-2">3.</span> Fractal of squares</h2>
<div class="outline-text-2" id="text-3">
<p>
This QBasic program generates and displays a fractal pattern composed of squares.
</p>
-<div id="org8c7f23b" class="figure">
+<div id="org61d6183" class="figure">
<p><a href="fractal squares.bas" class="responsive-img"><img src="fractal%20squares,%201.png" alt="fractal%20squares,%201.png" class="responsive-img" /></a>
</p>
</div>
-<div id="org7f10394" class="figure">
+<div id="org9c7662d" class="figure">
<p><a href="fractal squares.bas" class="responsive-img"><img src="fractal%20squares,%202.png" alt="fractal%20squares,%202.png" class="responsive-img" /></a>
</p>
</div>
</div>
</div>
-<div id="outline-container-orgc9aa92c" class="outline-2">
-<h2 id="orgc9aa92c"><span class="section-number-2">4.</span> Fractal of squares animated</h2>
+<div id="outline-container-org7f2b476" class="outline-2">
+<h2 id="org7f2b476"><span class="section-number-2">4.</span> Fractal of squares animated</h2>
<div class="outline-text-2" id="text-4">
<p>
This QBasic program generates an animated fractal pattern composed of
</div>
</div>
-<div id="outline-container-org95a64d0" class="outline-2">
-<h2 id="org95a64d0"><span class="section-number-2">5.</span> Fractal of trees</h2>
+<div id="outline-container-orgbcfd4b5" class="outline-2">
+<h2 id="orgbcfd4b5"><span class="section-number-2">5.</span> Fractal of trees</h2>
<div class="outline-text-2" id="text-5">
<p>
QBasic program that generates a visually appealing fractal tree
</div>
</div>
<div id="postamble" class="status">
-<p class="date">Created: 2025-07-30 ke 08:54</p>
+<p class="date">Created: 2025-07-30 ke 12:27</p>
<p class="validation"><a href="https://validator.w3.org/check?uri=referer">Validate</a></p>
</div>
</body>
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en">
<head>
-<!-- 2025-07-30 ke 08:54 -->
+<!-- 2025-07-30 ke 12:27 -->
<meta http-equiv="Content-Type" content="text/html;charset=utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<title>Spiral series</title>
<h2>Table of Contents</h2>
<div id="text-table-of-contents" role="doc-toc">
<ul>
-<li><a href="#org5adfb8a">1. Spiral with increasing density</a></li>
-<li><a href="#orgda27966">2. Spiral with varying height</a></li>
-<li><a href="#orgc02cc8c">3. Shaded spiral</a></li>
-<li><a href="#org82de458">4. Sphere forming spiral</a></li>
-<li><a href="#org2c1423d">5. Textured spherical spiral</a></li>
-<li><a href="#org48d246f">6. Textured and shaded spherical spiral</a></li>
+<li><a href="#org975cad1">1. Spiral with increasing density</a></li>
+<li><a href="#org3cc3142">2. Spiral with varying height</a></li>
+<li><a href="#org1afb223">3. Shaded spiral</a></li>
+<li><a href="#org86798cd">4. Sphere forming spiral</a></li>
+<li><a href="#org290b12d">5. Textured spherical spiral</a></li>
+<li><a href="#orgcc9ea12">6. Textured and shaded spherical spiral</a></li>
</ul>
</div>
</div>
}
</style>
-<div id="outline-container-org5adfb8a" class="outline-2">
-<h2 id="org5adfb8a"><span class="section-number-2">1.</span> Spiral with increasing density</h2>
+<div id="outline-container-org975cad1" class="outline-2">
+<h2 id="org975cad1"><span class="section-number-2">1.</span> Spiral with increasing density</h2>
<div class="outline-text-2" id="text-1">
-<div id="org029fdf0" class="figure">
+<div id="orgc90ba51" class="figure">
<p><img src="spiral.png" alt="spiral.png" class="responsive-img" />
</p>
</div>
</div>
</div>
-<div id="outline-container-orgda27966" class="outline-2">
-<h2 id="orgda27966"><span class="section-number-2">2.</span> Spiral with varying height</h2>
+<div id="outline-container-org3cc3142" class="outline-2">
+<h2 id="org3cc3142"><span class="section-number-2">2.</span> Spiral with varying height</h2>
<div class="outline-text-2" id="text-2">
-<div id="orgabbae9a" class="figure">
+<div id="orgce0bd16" class="figure">
<p><img src="spiral, 2.png" alt="spiral, 2.png" class="responsive-img" />
</p>
</div>
</div>
</div>
-<div id="outline-container-orgc02cc8c" class="outline-2">
-<h2 id="orgc02cc8c"><span class="section-number-2">3.</span> Shaded spiral</h2>
+<div id="outline-container-org1afb223" class="outline-2">
+<h2 id="org1afb223"><span class="section-number-2">3.</span> Shaded spiral</h2>
<div class="outline-text-2" id="text-3">
-<div id="orgedfa863" class="figure">
+<div id="org45bbde4" class="figure">
<p><img src="spiral, 3.png" alt="spiral, 3.png" class="responsive-img" />
</p>
</div>
</div>
</div>
-<div id="outline-container-org82de458" class="outline-2">
-<h2 id="org82de458"><span class="section-number-2">4.</span> Sphere forming spiral</h2>
+<div id="outline-container-org86798cd" class="outline-2">
+<h2 id="org86798cd"><span class="section-number-2">4.</span> Sphere forming spiral</h2>
<div class="outline-text-2" id="text-4">
<p>
Similar to previous spiral, Line segments are connected between the
</p>
-<div id="org7ed384e" class="figure">
+<div id="org9708799" class="figure">
<p><img src="spiral, 4, 1.png" alt="spiral, 4, 1.png" class="responsive-img" />
</p>
</div>
</p>
-<div id="orgd650278" class="figure">
+<div id="orga4fad57" class="figure">
<p><img src="spiral, 4, 2.png" alt="spiral, 4, 2.png" class="responsive-img" />
</p>
</div>
</div>
</div>
-<div id="outline-container-org2c1423d" class="outline-2">
-<h2 id="org2c1423d"><span class="section-number-2">5.</span> Textured spherical spiral</h2>
+<div id="outline-container-org290b12d" class="outline-2">
+<h2 id="org290b12d"><span class="section-number-2">5.</span> Textured spherical spiral</h2>
<div class="outline-text-2" id="text-5">
-<div id="org081a30f" class="figure">
+<div id="orge958d77" class="figure">
<p><img src="spiral, 5.png" alt="spiral, 5.png" class="responsive-img" />
</p>
</div>
</div>
</div>
-<div id="outline-container-org48d246f" class="outline-2">
-<h2 id="org48d246f"><span class="section-number-2">6.</span> Textured and shaded spherical spiral</h2>
+<div id="outline-container-orgcc9ea12" class="outline-2">
+<h2 id="orgcc9ea12"><span class="section-number-2">6.</span> Textured and shaded spherical spiral</h2>
<div class="outline-text-2" id="text-6">
-<div id="orgdd30f60" class="figure">
+<div id="org50929b9" class="figure">
<p><img src="spiral, 6.png" alt="spiral, 6.png" class="responsive-img" />
</p>
</div>
</div>
</div>
<div id="postamble" class="status">
-<p class="date">Created: 2025-07-30 ke 08:54</p>
+<p class="date">Created: 2025-07-30 ke 12:27</p>
<p class="validation"><a href="https://validator.w3.org/check?uri=referer">Validate</a></p>
</div>
</body>
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en">
<head>
-<!-- 2025-07-30 ke 08:54 -->
+<!-- 2025-07-30 ke 12:27 -->
<meta http-equiv="Content-Type" content="text/html;charset=utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<title>Algorithmic textures</title>
<h2>Table of Contents</h2>
<div id="text-table-of-contents" role="doc-toc">
<ul>
-<li><a href="#org194bd84">1. Circular waves</a></li>
-<li><a href="#org6816183">2. Diamond square clouds</a></li>
-<li><a href="#org80d23b0">3. Old paper</a></li>
-<li><a href="#org8cffacc">4. Wood</a></li>
-<li><a href="#org2f5742a">5. Yellow flame</a></li>
+<li><a href="#orgecb4537">1. Circular waves</a></li>
+<li><a href="#org3ba73ad">2. Diamond square clouds</a></li>
+<li><a href="#org96f0dfa">3. Old paper</a></li>
+<li><a href="#org034a978">4. Wood</a></li>
+<li><a href="#orge0f3962">5. Yellow flame</a></li>
</ul>
</div>
</div>
}
</style>
-<div id="outline-container-org194bd84" class="outline-2">
-<h2 id="org194bd84"><span class="section-number-2">1.</span> Circular waves</h2>
+<div id="outline-container-orgecb4537" class="outline-2">
+<h2 id="orgecb4537"><span class="section-number-2">1.</span> Circular waves</h2>
<div class="outline-text-2" id="text-1">
<p>
This QBasic program creates visually captivating circular wave
</div>
</div>
-<div id="outline-container-org6816183" class="outline-2">
-<h2 id="org6816183"><span class="section-number-2">2.</span> Diamond square clouds</h2>
+<div id="outline-container-org3ba73ad" class="outline-2">
+<h2 id="org3ba73ad"><span class="section-number-2">2.</span> Diamond square clouds</h2>
<div class="outline-text-2" id="text-2">
<p>
This QBasic program demonstrates the Diamond-Square algorithm, a
</div>
</div>
-<div id="outline-container-org80d23b0" class="outline-2">
-<h2 id="org80d23b0"><span class="section-number-2">3.</span> Old paper</h2>
+<div id="outline-container-org96f0dfa" class="outline-2">
+<h2 id="org96f0dfa"><span class="section-number-2">3.</span> Old paper</h2>
<div class="outline-text-2" id="text-3">
<p>
This QBasic program generates a procedural texture that simulates the
</div>
</div>
-<div id="outline-container-org8cffacc" class="outline-2">
-<h2 id="org8cffacc"><span class="section-number-2">4.</span> Wood</h2>
+<div id="outline-container-org034a978" class="outline-2">
+<h2 id="org034a978"><span class="section-number-2">4.</span> Wood</h2>
<div class="outline-text-2" id="text-4">
<p>
This QBasic program creates a visually appealing simulation of a wood
</div>
</div>
-<div id="outline-container-org2f5742a" class="outline-2">
-<h2 id="org2f5742a"><span class="section-number-2">5.</span> Yellow flame</h2>
+<div id="outline-container-orge0f3962" class="outline-2">
+<h2 id="orge0f3962"><span class="section-number-2">5.</span> Yellow flame</h2>
<div class="outline-text-2" id="text-5">
<p>
"Yellow Flame" is a visually captivating program written in QBasic
</div>
</div>
<div id="postamble" class="status">
-<p class="date">Created: 2025-07-30 ke 08:54</p>
+<p class="date">Created: 2025-07-30 ke 12:27</p>
<p class="validation"><a href="https://validator.w3.org/check?uri=referer">Validate</a></p>
</div>
</body>
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en">
<head>
-<!-- 2025-07-30 ke 08:55 -->
+<!-- 2025-07-30 ke 12:28 -->
<meta http-equiv="Content-Type" content="text/html;charset=utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<title>3D Synthezier</title>
<h2>Table of Contents</h2>
<div id="text-table-of-contents" role="doc-toc">
<ul>
-<li><a href="#orgd9b8680">1. Operating principle</a>
+<li><a href="#orgcb48ea0">1. Operating principle</a>
<ul>
-<li><a href="#org0e66f66">1.1. Rectangular city</a></li>
-<li><a href="#orgd699ac6">1.2. Hexagonal city</a></li>
+<li><a href="#org74909cb">1.1. Rectangular city</a></li>
+<li><a href="#org9c20741">1.2. Hexagonal city</a></li>
</ul>
</li>
-<li><a href="#org069cbd6">2. Scene description language</a>
+<li><a href="#org4184df1">2. Scene description language</a>
<ul>
-<li><a href="#org42a8697">2.1. here</a></li>
-<li><a href="#org6a8395b">2.2. p</a></li>
-<li><a href="#orgf8e5df6">2.3. f</a></li>
-<li><a href="#org5b684c9">2.4. warn</a></li>
-<li><a href="#orgd6c7f9d">2.5. end</a></li>
-<li><a href="#org6d38d71">2.6. mtl</a></li>
-<li><a href="#org0839b89">2.7. mtlrnd</a></li>
-<li><a href="#orgaee3ec5">2.8. obj</a></li>
-<li><a href="#org439d79f">2.9. rnd</a></li>
-<li><a href="#orgeff8de3">2.10. #</a></li>
-<li><a href="#org3fddc12">2.11. out</a></li>
-<li><a href="#org3a377b2">2.12. set</a></li>
-<li><a href="#orgd1088af">2.13. variables usage</a></li>
-<li><a href="#org8dabc15">2.14. cmp</a></li>
-<li><a href="#orgcf941b0">2.15. ?</a></li>
-<li><a href="#org5316ce5">2.16. dum</a></li>
+<li><a href="#orgfa47201">2.1. here</a></li>
+<li><a href="#org25f7a07">2.2. p</a></li>
+<li><a href="#orgc7305e7">2.3. f</a></li>
+<li><a href="#orge092d7b">2.4. warn</a></li>
+<li><a href="#org91dc227">2.5. end</a></li>
+<li><a href="#orgb7ffae4">2.6. mtl</a></li>
+<li><a href="#org0bcaa7b">2.7. mtlrnd</a></li>
+<li><a href="#orgc0632e7">2.8. obj</a></li>
+<li><a href="#org4e62096">2.9. rnd</a></li>
+<li><a href="#orgf81c443">2.10. #</a></li>
+<li><a href="#org26c545e">2.11. out</a></li>
+<li><a href="#org4e5c2b0">2.12. set</a></li>
+<li><a href="#org0b63a1f">2.13. variables usage</a></li>
+<li><a href="#orgba5cc69">2.14. cmp</a></li>
+<li><a href="#orgd16a527">2.15. ?</a></li>
+<li><a href="#org0f19c61">2.16. dum</a></li>
</ul>
</li>
-<li><a href="#org1509f08">3. Installation</a>
+<li><a href="#orgda9265a">3. Installation</a>
<ul>
-<li><a href="#org938ea8f">3.1. System requirements</a></li>
-<li><a href="#orgcf089f3">3.2. Directory layout</a></li>
+<li><a href="#org3502c1e">3.1. System requirements</a></li>
+<li><a href="#org65c6c2e">3.2. Directory layout</a></li>
</ul>
</li>
-<li><a href="#org393308b">4. Usage</a></li>
+<li><a href="#org3ed8023">4. Usage</a></li>
</ul>
</div>
</div>
</style>
-<div id="outline-container-orgd9b8680" class="outline-2">
-<h2 id="orgd9b8680"><span class="section-number-2">1.</span> Operating principle</h2>
+<div id="outline-container-orgcb48ea0" class="outline-2">
+<h2 id="orgcb48ea0"><span class="section-number-2">1.</span> Operating principle</h2>
<div class="outline-text-2" id="text-1">
<p>
Parses scene definition language and creates 3D world based on
</p>
</div>
-<div id="outline-container-org0e66f66" class="outline-3">
-<h3 id="org0e66f66"><span class="section-number-3">1.1.</span> Rectangular city</h3>
+<div id="outline-container-org74909cb" class="outline-3">
+<h3 id="org74909cb"><span class="section-number-3">1.1.</span> Rectangular city</h3>
<div class="outline-text-3" id="text-1-1">
-<div id="orgddb612b" class="figure">
+<div id="org628eaae" class="figure">
<p><img src="rectangular city, 1.jpeg" alt="rectangular city, 1.jpeg" class="responsive-img" />
</p>
</div>
-<div id="org491aa98" class="figure">
+<div id="org3fad009" class="figure">
<p><img src="rectangular city, 2.jpeg" alt="rectangular city, 2.jpeg" class="responsive-img" />
</p>
</div>
-<div id="org4934254" class="figure">
+<div id="org007bf4c" class="figure">
<p><img src="rectangular city, 3.jpeg" alt="rectangular city, 3.jpeg" class="responsive-img" />
</p>
</div>
</div>
</div>
-<div id="outline-container-orgd699ac6" class="outline-3">
-<h3 id="orgd699ac6"><span class="section-number-3">1.2.</span> Hexagonal city</h3>
+<div id="outline-container-org9c20741" class="outline-3">
+<h3 id="org9c20741"><span class="section-number-3">1.2.</span> Hexagonal city</h3>
<div class="outline-text-3" id="text-1-2">
-<div id="org8c2b994" class="figure">
+<div id="orgd2a1640" class="figure">
<p><img src="hexagonal city, 1.jpeg" alt="hexagonal city, 1.jpeg" class="responsive-img" />
</p>
</div>
-<div id="org36089f7" class="figure">
+<div id="org9b78137" class="figure">
<p><img src="hexagonal city, 2.jpeg" alt="hexagonal city, 2.jpeg" class="responsive-img" />
</p>
</div>
-<div id="orge9eded1" class="figure">
+<div id="org7763082" class="figure">
<p><img src="hexagonal city, 3.jpeg" alt="hexagonal city, 3.jpeg" class="responsive-img" />
</p>
</div>
</div>
</div>
</div>
-<div id="outline-container-org069cbd6" class="outline-2">
-<h2 id="org069cbd6"><span class="section-number-2">2.</span> Scene description language</h2>
+<div id="outline-container-org4184df1" class="outline-2">
+<h2 id="org4184df1"><span class="section-number-2">2.</span> Scene description language</h2>
<div class="outline-text-2" id="text-2">
<p>
See also examples.
</p>
</div>
-<div id="outline-container-org42a8697" class="outline-3">
-<h3 id="org42a8697"><span class="section-number-3">2.1.</span> here</h3>
+<div id="outline-container-orgfa47201" class="outline-3">
+<h3 id="orgfa47201"><span class="section-number-3">2.1.</span> here</h3>
<div class="outline-text-3" id="text-2-1">
<pre class="example">
here
</p>
</div>
</div>
-<div id="outline-container-org6a8395b" class="outline-3">
-<h3 id="org6a8395b"><span class="section-number-3">2.2.</span> p</h3>
+<div id="outline-container-org25f7a07" class="outline-3">
+<h3 id="org25f7a07"><span class="section-number-3">2.2.</span> p</h3>
<div class="outline-text-3" id="text-2-2">
<pre class="example">
p x y z
</p>
</div>
</div>
-<div id="outline-container-orgf8e5df6" class="outline-3">
-<h3 id="orgf8e5df6"><span class="section-number-3">2.3.</span> f</h3>
+<div id="outline-container-orgc7305e7" class="outline-3">
+<h3 id="orgc7305e7"><span class="section-number-3">2.3.</span> f</h3>
<div class="outline-text-3" id="text-2-3">
<pre class="example">
f p1 p2 p3 p4
</p>
</div>
</div>
-<div id="outline-container-org5b684c9" class="outline-3">
-<h3 id="org5b684c9"><span class="section-number-3">2.4.</span> warn</h3>
+<div id="outline-container-orge092d7b" class="outline-3">
+<h3 id="orge092d7b"><span class="section-number-3">2.4.</span> warn</h3>
<div class="outline-text-3" id="text-2-4">
<pre class="example">
warn <message>
</p>
</div>
</div>
-<div id="outline-container-orgd6c7f9d" class="outline-3">
-<h3 id="orgd6c7f9d"><span class="section-number-3">2.5.</span> end</h3>
+<div id="outline-container-org91dc227" class="outline-3">
+<h3 id="org91dc227"><span class="section-number-3">2.5.</span> end</h3>
<div class="outline-text-3" id="text-2-5">
<pre class="example">
end
</p>
</div>
</div>
-<div id="outline-container-org6d38d71" class="outline-3">
-<h3 id="org6d38d71"><span class="section-number-3">2.6.</span> mtl</h3>
+<div id="outline-container-orgb7ffae4" class="outline-3">
+<h3 id="orgb7ffae4"><span class="section-number-3">2.6.</span> mtl</h3>
<div class="outline-text-3" id="text-2-6">
<pre class="example">
mtl material
</p>
</div>
</div>
-<div id="outline-container-org0839b89" class="outline-3">
-<h3 id="org0839b89"><span class="section-number-3">2.7.</span> mtlrnd</h3>
+<div id="outline-container-org0bcaa7b" class="outline-3">
+<h3 id="org0bcaa7b"><span class="section-number-3">2.7.</span> mtlrnd</h3>
<div class="outline-text-3" id="text-2-7">
<pre class="example">
mtlrnd material ...
</p>
</div>
</div>
-<div id="outline-container-orgaee3ec5" class="outline-3">
-<h3 id="orgaee3ec5"><span class="section-number-3">2.8.</span> obj</h3>
+<div id="outline-container-orgc0632e7" class="outline-3">
+<h3 id="orgc0632e7"><span class="section-number-3">2.8.</span> obj</h3>
<div class="outline-text-3" id="text-2-8">
<pre class="example">
obj object xz45 xy20 x+3 y*2
</p>
-<div id="orga6f9f50" class="figure">
+<div id="orgca1d883" class="figure">
<p><img src="rotation.png" alt="rotation.png" />
</p>
</div>
</div>
</div>
-<div id="outline-container-org439d79f" class="outline-3">
-<h3 id="org439d79f"><span class="section-number-3">2.9.</span> rnd</h3>
+<div id="outline-container-org4e62096" class="outline-3">
+<h3 id="org4e62096"><span class="section-number-3">2.9.</span> rnd</h3>
<div class="outline-text-3" id="text-2-9">
<pre class="example">
rnd p^1^2^3 p^7^2^1
</p>
</div>
</div>
-<div id="outline-container-orgeff8de3" class="outline-3">
-<h3 id="orgeff8de3"><span class="section-number-3">2.10.</span> #</h3>
+<div id="outline-container-orgf81c443" class="outline-3">
+<h3 id="orgf81c443"><span class="section-number-3">2.10.</span> #</h3>
<div class="outline-text-3" id="text-2-10">
<pre class="example">
# whatever text
</p>
</div>
</div>
-<div id="outline-container-org3fddc12" class="outline-3">
-<h3 id="org3fddc12"><span class="section-number-3">2.11.</span> out</h3>
+<div id="outline-container-org26c545e" class="outline-3">
+<h3 id="org26c545e"><span class="section-number-3">2.11.</span> out</h3>
<div class="outline-text-3" id="text-2-11">
<pre class="example">
out file
</p>
</div>
</div>
-<div id="outline-container-org3a377b2" class="outline-3">
-<h3 id="org3a377b2"><span class="section-number-3">2.12.</span> set</h3>
+<div id="outline-container-org4e5c2b0" class="outline-3">
+<h3 id="org4e5c2b0"><span class="section-number-3">2.12.</span> set</h3>
<div class="outline-text-3" id="text-2-12">
<pre class="example">
set variable contents
</p>
</div>
</div>
-<div id="outline-container-orgd1088af" class="outline-3">
-<h3 id="orgd1088af"><span class="section-number-3">2.13.</span> variables usage</h3>
+<div id="outline-container-org0b63a1f" class="outline-3">
+<h3 id="org0b63a1f"><span class="section-number-3">2.13.</span> variables usage</h3>
<div class="outline-text-3" id="text-2-13">
<pre class="example">
anycommand %1 anything
</p>
</div>
</div>
-<div id="outline-container-org8dabc15" class="outline-3">
-<h3 id="org8dabc15"><span class="section-number-3">2.14.</span> cmp</h3>
+<div id="outline-container-orgba5cc69" class="outline-3">
+<h3 id="orgba5cc69"><span class="section-number-3">2.14.</span> cmp</h3>
<div class="outline-text-3" id="text-2-14">
<pre class="example">
cmp flag string1 string2
</p>
</div>
</div>
-<div id="outline-container-orgcf941b0" class="outline-3">
-<h3 id="orgcf941b0"><span class="section-number-3">2.15.</span> ?</h3>
+<div id="outline-container-orgd16a527" class="outline-3">
+<h3 id="orgd16a527"><span class="section-number-3">2.15.</span> ?</h3>
<div class="outline-text-3" id="text-2-15">
<pre class="example">
?flag anycommand
</p>
</div>
</div>
-<div id="outline-container-org5316ce5" class="outline-3">
-<h3 id="org5316ce5"><span class="section-number-3">2.16.</span> dum</h3>
+<div id="outline-container-org0f19c61" class="outline-3">
+<h3 id="org0f19c61"><span class="section-number-3">2.16.</span> dum</h3>
<div class="outline-text-3" id="text-2-16">
<pre class="example">
dum
</div>
</div>
-<div id="outline-container-org1509f08" class="outline-2">
-<h2 id="org1509f08"><span class="section-number-2">3.</span> Installation</h2>
+<div id="outline-container-orgda9265a" class="outline-2">
+<h2 id="orgda9265a"><span class="section-number-2">3.</span> Installation</h2>
<div class="outline-text-2" id="text-3">
<p>
Edit <b>bin/3dparse.bas</b> file and update include path in there.
</p>
</div>
-<div id="outline-container-org938ea8f" class="outline-3">
-<h3 id="org938ea8f"><span class="section-number-3">3.1.</span> System requirements</h3>
+<div id="outline-container-org3502c1e" class="outline-3">
+<h3 id="org3502c1e"><span class="section-number-3">3.1.</span> System requirements</h3>
<div class="outline-text-3" id="text-3-1">
<table border="2" cellspacing="0" cellpadding="6" rules="groups" frame="hsides">
</div>
</div>
-<div id="outline-container-orgcf089f3" class="outline-3">
-<h3 id="orgcf089f3"><span class="section-number-3">3.2.</span> Directory layout</h3>
+<div id="outline-container-org65c6c2e" class="outline-3">
+<h3 id="org65c6c2e"><span class="section-number-3">3.2.</span> Directory layout</h3>
<div class="outline-text-3" id="text-3-2">
<dl class="org-dl">
<dt>bin</dt><dd><dl class="org-dl">
</div>
</div>
-<div id="outline-container-org393308b" class="outline-2">
-<h2 id="org393308b"><span class="section-number-2">4.</span> Usage</h2>
+<div id="outline-container-org3ed8023" class="outline-2">
+<h2 id="org3ed8023"><span class="section-number-2">4.</span> Usage</h2>
<div class="outline-text-2" id="text-4">
<p>
Make sure you have QB binaries in your PATH. Execute
</div>
</div>
<div id="postamble" class="status">
-<p class="date">Created: 2025-07-30 ke 08:55</p>
+<p class="date">Created: 2025-07-30 ke 12:28</p>
<p class="validation"><a href="https://validator.w3.org/check?uri=referer">Validate</a></p>
</div>
</body>
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en">
<head>
-<!-- 2025-07-30 ke 08:55 -->
+<!-- 2025-07-30 ke 12:29 -->
<meta http-equiv="Content-Type" content="text/html;charset=utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<title>Miscellaneous 3D graphics demos</title>
<h2>Table of Contents</h2>
<div id="text-table-of-contents" role="doc-toc">
<ul>
-<li><a href="#orgc78d249">1. Rotating exclamation mark</a></li>
-<li><a href="#orgb2f9057">2. 3D bouncing ball</a></li>
-<li><a href="#org194c108">3. 3D text in a room</a></li>
-<li><a href="#org2544c8a">4. 3D bouncing cubes on grid floor</a></li>
-<li><a href="#orgdf2dd1e">5. Matrix math for rotation in 3D space</a></li>
-<li><a href="#org28227eb">6. Maze explorer</a></li>
-<li><a href="#orge1c373c">7. Tank animation</a></li>
-<li><a href="#org853da96">8. Tiled room</a></li>
+<li><a href="#org00a0fea">1. Rotating exclamation mark</a></li>
+<li><a href="#orgb65348b">2. 3D bouncing ball</a></li>
+<li><a href="#org4b63f7c">3. 3D text in a room</a></li>
+<li><a href="#org623a062">4. 3D bouncing cubes on grid floor</a></li>
+<li><a href="#orgc1fa852">5. Matrix math for rotation in 3D space</a></li>
+<li><a href="#org0a76ec7">6. Maze explorer</a></li>
+<li><a href="#org4dd3bb2">7. Tank animation</a></li>
+<li><a href="#orga21329b">8. Tiled room</a></li>
</ul>
</div>
</div>
}
</style>
-<div id="outline-container-orgc78d249" class="outline-2">
-<h2 id="orgc78d249"><span class="section-number-2">1.</span> Rotating exclamation mark</h2>
+<div id="outline-container-org00a0fea" class="outline-2">
+<h2 id="org00a0fea"><span class="section-number-2">1.</span> Rotating exclamation mark</h2>
<div class="outline-text-2" id="text-1">
<p>
Wireframe 3D model of a rotating exclamation mark.
</div>
</div>
-<div id="outline-container-orgb2f9057" class="outline-2">
-<h2 id="orgb2f9057"><span class="section-number-2">2.</span> 3D bouncing ball</h2>
+<div id="outline-container-orgb65348b" class="outline-2">
+<h2 id="orgb65348b"><span class="section-number-2">2.</span> 3D bouncing ball</h2>
<div class="outline-text-2" id="text-2">
<p>
This QBasic program creates a visually engaging 3D animation of a
</div>
</div>
-<div id="outline-container-org194c108" class="outline-2">
-<h2 id="org194c108"><span class="section-number-2">3.</span> 3D text in a room</h2>
+<div id="outline-container-org4b63f7c" class="outline-2">
+<h2 id="org4b63f7c"><span class="section-number-2">3.</span> 3D text in a room</h2>
<div class="outline-text-2" id="text-3">
<p>
Wireframe 3D text hanging in a wireframe 3D room. User can look and
</div>
</div>
-<div id="outline-container-org2544c8a" class="outline-2">
-<h2 id="org2544c8a"><span class="section-number-2">4.</span> 3D bouncing cubes on grid floor</h2>
+<div id="outline-container-org623a062" class="outline-2">
+<h2 id="org623a062"><span class="section-number-2">4.</span> 3D bouncing cubes on grid floor</h2>
<div class="outline-text-2" id="text-4">
<p>
3D wireframe cubes bouncing on a grid floor, creating an immersive and
</div>
</div>
-<div id="outline-container-orgdf2dd1e" class="outline-2">
-<h2 id="orgdf2dd1e"><span class="section-number-2">5.</span> Matrix math for rotation in 3D space</h2>
+<div id="outline-container-orgc1fa852" class="outline-2">
+<h2 id="orgc1fa852"><span class="section-number-2">5.</span> Matrix math for rotation in 3D space</h2>
<div class="outline-text-2" id="text-5">
<p>
Instead of combining simple 2D rotors, pixels in this 3D space are
</div>
</div>
-<div id="outline-container-org28227eb" class="outline-2">
-<h2 id="org28227eb"><span class="section-number-2">6.</span> Maze explorer</h2>
+<div id="outline-container-org0a76ec7" class="outline-2">
+<h2 id="org0a76ec7"><span class="section-number-2">6.</span> Maze explorer</h2>
<div class="outline-text-2" id="text-6">
<p>
The Evolving 3D Maze Explorer is a QBasic program that generates and
</p>
-<div id="orgd31decb" class="figure">
+<div id="orgce49d77" class="figure">
<p><a href="Maze%20explorer.bas" class="responsive-img"><img src="Maze%20explorer.png" alt="Maze%20explorer.png" class="responsive-img" /></a>
</p>
</div>
</div>
</div>
-<div id="outline-container-orge1c373c" class="outline-2">
-<h2 id="orge1c373c"><span class="section-number-2">7.</span> Tank animation</h2>
+<div id="outline-container-org4dd3bb2" class="outline-2">
+<h2 id="org4dd3bb2"><span class="section-number-2">7.</span> Tank animation</h2>
<div class="outline-text-2" id="text-7">
<p>
Animated tank driving through the bridge back and forward. User can
</div>
</div>
-<div id="outline-container-org853da96" class="outline-2">
-<h2 id="org853da96"><span class="section-number-2">8.</span> Tiled room</h2>
+<div id="outline-container-orga21329b" class="outline-2">
+<h2 id="orga21329b"><span class="section-number-2">8.</span> Tiled room</h2>
<div class="outline-text-2" id="text-8">
<p>
Room with some tiles on the wall and on the floor. User can freely fly
</div>
</div>
<div id="postamble" class="status">
-<p class="date">Created: 2025-07-30 ke 08:55</p>
+<p class="date">Created: 2025-07-30 ke 12:29</p>
<p class="validation"><a href="https://validator.w3.org/check?uri=referer">Validate</a></p>
</div>
</body>
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en">
<head>
-<!-- 2025-07-30 ke 08:56 -->
+<!-- 2025-07-30 ke 12:29 -->
<meta http-equiv="Content-Type" content="text/html;charset=utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<title>Space themed 3D graphics</title>
<h2>Table of Contents</h2>
<div id="text-table-of-contents" role="doc-toc">
<ul>
-<li><a href="#orgc0d8309">1. Galaxy explorer</a></li>
-<li><a href="#org4cc6b4a">2. Rocket simulator</a></li>
-<li><a href="#org53ccbc2">3. Stars</a></li>
-<li><a href="#orge2db8d0">4. Universe explorer</a></li>
+<li><a href="#org9ee68ab">1. Galaxy explorer</a></li>
+<li><a href="#org3084c19">2. Rocket simulator</a></li>
+<li><a href="#org8dbb7ff">3. Stars</a></li>
+<li><a href="#org38fc047">4. Universe explorer</a></li>
</ul>
</div>
</div>
}
</style>
-<div id="outline-container-orgc0d8309" class="outline-2">
-<h2 id="orgc0d8309"><span class="section-number-2">1.</span> Galaxy explorer</h2>
+<div id="outline-container-org9ee68ab" class="outline-2">
+<h2 id="org9ee68ab"><span class="section-number-2">1.</span> Galaxy explorer</h2>
<div class="outline-text-2" id="text-1">
<p>
This QBasic program renders a navigable 3D point cloud galaxy,
</p>
-<div id="org12a0c2b" class="figure">
+<div id="orge37e684" class="figure">
<p><a href="Galaxy%20explorer.bas" class="responsive-img"><img src="Galaxy%20explorer.png" alt="Galaxy%20explorer.png" class="responsive-img" /></a>
</p>
</div>
</div>
</div>
-<div id="outline-container-org4cc6b4a" class="outline-2">
-<h2 id="org4cc6b4a"><span class="section-number-2">2.</span> Rocket simulator</h2>
+<div id="outline-container-org3084c19" class="outline-2">
+<h2 id="org3084c19"><span class="section-number-2">2.</span> Rocket simulator</h2>
<div class="outline-text-2" id="text-2">
<p>
QBasic program that simulates the takeoff and flight of a rocket from
</div>
</div>
-<div id="outline-container-org53ccbc2" class="outline-2">
-<h2 id="org53ccbc2"><span class="section-number-2">3.</span> Stars</h2>
+<div id="outline-container-org8dbb7ff" class="outline-2">
+<h2 id="org8dbb7ff"><span class="section-number-2">3.</span> Stars</h2>
<div class="outline-text-2" id="text-3">
<p>
The 3D Starfield Simulation is a QBasic program that creates a
</div>
</div>
-<div id="outline-container-orge2db8d0" class="outline-2">
-<h2 id="orge2db8d0"><span class="section-number-2">4.</span> Universe explorer</h2>
+<div id="outline-container-org38fc047" class="outline-2">
+<h2 id="org38fc047"><span class="section-number-2">4.</span> Universe explorer</h2>
<div class="outline-text-2" id="text-4">
<p>
This QBasic program that simulates a navigable 3D universe. Users can
</dl>
-<div id="orgc4b3925" class="figure">
+<div id="org23b084c" class="figure">
<p><a href="Universe%20explorer/Universe%20explorer.bas" class="responsive-img"><img src="Universe%20explorer/1.png" alt="1.png" class="responsive-img" /></a>
</p>
</div>
-<div id="org872ba15" class="figure">
+<div id="org10479cc" class="figure">
<p><a href="Universe%20explorer/Universe%20explorer.bas" class="responsive-img"><img src="Universe%20explorer/2.png" alt="2.png" class="responsive-img" /></a>
</p>
</div>
-<div id="org472a2f8" class="figure">
+<div id="orge437bae" class="figure">
<p><a href="Universe%20explorer/Universe%20explorer.bas" class="responsive-img"><img src="Universe%20explorer/3.png" alt="3.png" class="responsive-img" /></a>
</p>
</div>
</div>
</div>
<div id="postamble" class="status">
-<p class="date">Created: 2025-07-30 ke 08:56</p>
+<p class="date">Created: 2025-07-30 ke 12:29</p>
<p class="validation"><a href="https://validator.w3.org/check?uri=referer">Validate</a></p>
</div>
</body>
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en">
<head>
-<!-- 2025-07-30 ke 08:56 -->
+<!-- 2025-07-30 ke 12:29 -->
<meta http-equiv="Content-Type" content="text/html;charset=utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<title>Plotting</title>
<h2>Table of Contents</h2>
<div id="text-table-of-contents" role="doc-toc">
<ul>
-<li><a href="#org606157c">1. 2D graph</a></li>
-<li><a href="#org8371fa8">2. 3D graph</a></li>
-<li><a href="#org6fcf670">3. Deriviative calculator</a></li>
-<li><a href="#orgd112640">4. Sine and cosine table</a></li>
+<li><a href="#org45148cb">1. 2D graph</a></li>
+<li><a href="#orgd092199">2. 3D graph</a></li>
+<li><a href="#orgd47dfc9">3. Deriviative calculator</a></li>
+<li><a href="#org7bce8b5">4. Sine and cosine table</a></li>
</ul>
</div>
</div>
}
</style>
-<div id="outline-container-org606157c" class="outline-2">
-<h2 id="org606157c"><span class="section-number-2">1.</span> 2D graph</h2>
+<div id="outline-container-org45148cb" class="outline-2">
+<h2 id="org45148cb"><span class="section-number-2">1.</span> 2D graph</h2>
<div class="outline-text-2" id="text-1">
<p>
The 2D Graph Plotter is a simple yet effective program written in
</p>
-<div id="org9b4bdcf" class="figure">
+<div id="orgea3056b" class="figure">
<p><a href="2D%20graph%20plot.bas" class="responsive-img"><img src="2D%20graph%20plot.png" alt="2D%20graph%20plot.png" class="responsive-img" /></a>
</p>
</div>
</div>
</div>
-<div id="outline-container-org8371fa8" class="outline-2">
-<h2 id="org8371fa8"><span class="section-number-2">2.</span> 3D graph</h2>
+<div id="outline-container-orgd092199" class="outline-2">
+<h2 id="orgd092199"><span class="section-number-2">2.</span> 3D graph</h2>
<div class="outline-text-2" id="text-2">
<p>
The 3D Heightmap Explorer is a QBasic program designed to visualize
</p>
-<div id="org21a4083" class="figure">
+<div id="org077c47f" class="figure">
<p><a href="3D%20graph.bas" class="responsive-img"><img src="3D%20graph.png" alt="3D%20graph.png" class="responsive-img" /></a>
</p>
</div>
</div>
</div>
-<div id="outline-container-org6fcf670" class="outline-2">
-<h2 id="org6fcf670"><span class="section-number-2">3.</span> Deriviative calculator</h2>
+<div id="outline-container-orgd47dfc9" class="outline-2">
+<h2 id="orgd47dfc9"><span class="section-number-2">3.</span> Deriviative calculator</h2>
<div class="outline-text-2" id="text-3">
<p>
This QBasic program is designed to compute and plot an arbitrary
</p>
-<div id="org2f0f312" class="figure">
+<div id="orga32bb22" class="figure">
<p><a href="Deriviative%20calculator.bas" class="responsive-img"><img src="Deriviative%20calculator.png" alt="Deriviative%20calculator.png" class="responsive-img" /></a>
</p>
</div>
</div>
</div>
-<div id="outline-container-orgd112640" class="outline-2">
-<h2 id="orgd112640"><span class="section-number-2">4.</span> Sine and cosine table</h2>
+<div id="outline-container-org7bce8b5" class="outline-2">
+<h2 id="org7bce8b5"><span class="section-number-2">4.</span> Sine and cosine table</h2>
<div class="outline-text-2" id="text-4">
<p>
The SIN & COS Table Generator is a QBasic program designed to visually
</p>
-<div id="org7b2669b" class="figure">
+<div id="org7bcbdf8" class="figure">
<p><a href="Sine%20and%20cosine%20table.bas" class="responsive-img"><img src="Sine%20and%20cosine%20table.png" alt="Sine%20and%20cosine%20table.png" class="responsive-img" /></a>
</p>
</div>
</div>
</div>
<div id="postamble" class="status">
-<p class="date">Created: 2025-07-30 ke 08:56</p>
+<p class="date">Created: 2025-07-30 ke 12:29</p>
<p class="validation"><a href="https://validator.w3.org/check?uri=referer">Validate</a></p>
</div>
</body>
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en">
<head>
-<!-- 2025-07-30 ke 08:56 -->
+<!-- 2025-07-30 ke 12:29 -->
<meta http-equiv="Content-Type" content="text/html;charset=utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<title>Simulation</title>
<h2>Table of Contents</h2>
<div id="text-table-of-contents" role="doc-toc">
<ul>
-<li><a href="#org68d895a">1. Explosion simulator</a></li>
-<li><a href="#orgf6ba3ac">2. Gravity in 2D</a></li>
-<li><a href="#orgc96821f">3. Gravity in 3D</a></li>
-<li><a href="#org0b3ffba">4. Interference</a></li>
-<li><a href="#orga57850a">5. Interferogram</a></li>
-<li><a href="#org602eb83">6. Surface tension</a></li>
-<li><a href="#org468ff0b">7. Wave 1</a></li>
-<li><a href="#orgc8f6c62">8. Wave 2</a></li>
+<li><a href="#orgdb57575">1. Explosion simulator</a></li>
+<li><a href="#orgfc07a76">2. Gravity in 2D</a></li>
+<li><a href="#org586f4fe">3. Gravity in 3D</a></li>
+<li><a href="#orgceed08f">4. Interference</a></li>
+<li><a href="#orga886cdf">5. Interferogram</a></li>
+<li><a href="#orge4dea1b">6. Surface tension</a></li>
+<li><a href="#orgeb267f3">7. Wave 1</a></li>
+<li><a href="#orgb315c6d">8. Wave 2</a></li>
</ul>
</div>
</div>
}
</style>
-<div id="outline-container-org68d895a" class="outline-2">
-<h2 id="org68d895a"><span class="section-number-2">1.</span> Explosion simulator</h2>
+<div id="outline-container-orgdb57575" class="outline-2">
+<h2 id="orgdb57575"><span class="section-number-2">1.</span> Explosion simulator</h2>
<div class="outline-text-2" id="text-1">
<p>
This QBasic program simulates the propagation of shock waves in a gas
</p>
-<div id="org6df3fa0" class="figure">
+<div id="org1835bd3" class="figure">
<p><a href="Explosion%20simulator.bas" class="responsive-img"><img src="Explosion%20simulator.png" alt="Explosion%20simulator.png" class="responsive-img" /></a>
</p>
</div>
</div>
</div>
-<div id="outline-container-orgf6ba3ac" class="outline-2">
-<h2 id="orgf6ba3ac"><span class="section-number-2">2.</span> Gravity in 2D</h2>
+<div id="outline-container-orgfc07a76" class="outline-2">
+<h2 id="orgfc07a76"><span class="section-number-2">2.</span> Gravity in 2D</h2>
<div class="outline-text-2" id="text-2">
<p>
The Gravitation Simulation program is a simple yet insightful QBasic
</p>
-<div id="org5d1eb55" class="figure">
+<div id="org16c07f9" class="figure">
<p><a href="Gravity%20in%202D.bas" class="responsive-img"><img src="Gravity%20in%202D.png" alt="Gravity%20in%202D.png" class="responsive-img" /></a>
</p>
</div>
</div>
</div>
-<div id="outline-container-orgc96821f" class="outline-2">
-<h2 id="orgc96821f"><span class="section-number-2">3.</span> Gravity in 3D</h2>
+<div id="outline-container-org586f4fe" class="outline-2">
+<h2 id="org586f4fe"><span class="section-number-2">3.</span> Gravity in 3D</h2>
<div class="outline-text-2" id="text-3">
<p>
This QBasic program simulates the gravitational interactions between
</div>
</div>
-<div id="outline-container-org0b3ffba" class="outline-2">
-<h2 id="org0b3ffba"><span class="section-number-2">4.</span> Interference</h2>
+<div id="outline-container-orgceed08f" class="outline-2">
+<h2 id="orgceed08f"><span class="section-number-2">4.</span> Interference</h2>
<div class="outline-text-2" id="text-4">
<p>
This QBasic program simulates the interference pattern created by two
</div>
</div>
-<div id="outline-container-orga57850a" class="outline-2">
-<h2 id="orga57850a"><span class="section-number-2">5.</span> Interferogram</h2>
+<div id="outline-container-orga886cdf" class="outline-2">
+<h2 id="orga886cdf"><span class="section-number-2">5.</span> Interferogram</h2>
<div class="outline-text-2" id="text-5">
<p>
This QBasic program simulates the interference pattern created by
</p>
-<div id="org2acd9c4" class="figure">
+<div id="org71fca94" class="figure">
<p><a href="Interferogram.bas" class="responsive-img"><img src="Interferogram.png" alt="Interferogram.png" class="responsive-img" /></a>
</p>
</div>
</div>
</div>
-<div id="outline-container-org602eb83" class="outline-2">
-<h2 id="org602eb83"><span class="section-number-2">6.</span> Surface tension</h2>
+<div id="outline-container-orge4dea1b" class="outline-2">
+<h2 id="orge4dea1b"><span class="section-number-2">6.</span> Surface tension</h2>
<div class="outline-text-2" id="text-6">
<p>
This QBasic program simulates the behavior of water spills and the
</p>
-<div id="org0329a16" class="figure">
+<div id="org2d7e97d" class="figure">
<p><a href="Surface%20tension.bas" class="responsive-img"><img src="Surface%20tension.png" alt="Surface%20tension.png" class="responsive-img" /></a>
</p>
</div>
</div>
</div>
-<div id="outline-container-org468ff0b" class="outline-2">
-<h2 id="org468ff0b"><span class="section-number-2">7.</span> Wave 1</h2>
+<div id="outline-container-orgeb267f3" class="outline-2">
+<h2 id="orgeb267f3"><span class="section-number-2">7.</span> Wave 1</h2>
<div class="outline-text-2" id="text-7">
<p>
This QBasic program simulates the propagation of waves across a
</p>
-<div id="orge277df4" class="figure">
+<div id="orgb928ba7" class="figure">
<p><a href="Wave%201.bas" class="responsive-img"><img src="Wave%201.png" alt="Wave%201.png" class="responsive-img" /></a>
</p>
</div>
</div>
</div>
-<div id="outline-container-orgc8f6c62" class="outline-2">
-<h2 id="orgc8f6c62"><span class="section-number-2">8.</span> Wave 2</h2>
+<div id="outline-container-orgb315c6d" class="outline-2">
+<h2 id="orgb315c6d"><span class="section-number-2">8.</span> Wave 2</h2>
<div class="outline-text-2" id="text-8">
<p>
This QBasic program simulates and visualizes the behavior of water
</p>
-<div id="org773b542" class="figure">
+<div id="org2ae6082" class="figure">
<p><a href="Wave%202.bas" class="responsive-img"><img src="Wave%202.png" alt="Wave%202.png" class="responsive-img" /></a>
</p>
</div>
</div>
</div>
<div id="postamble" class="status">
-<p class="date">Created: 2025-07-30 ke 08:56</p>
+<p class="date">Created: 2025-07-30 ke 12:29</p>
<p class="validation"><a href="https://validator.w3.org/check?uri=referer">Validate</a></p>
</div>
</body>
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en">
<head>
-<!-- 2025-07-30 ke 08:57 -->
+<!-- 2025-07-30 ke 12:30 -->
<meta http-equiv="Content-Type" content="text/html;charset=utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<title>Truth table calculator</title>
<h2>Table of Contents</h2>
<div id="text-table-of-contents" role="doc-toc">
<ul>
-<li><a href="#org6ff8d10">1. Implemented logical operations</a>
+<li><a href="#org76ad210">1. Implemented logical operations</a>
<ul>
-<li><a href="#org34525d9">1.1. Equivalent ( ⇔ , 1 )</a></li>
-<li><a href="#orgf5b7cc9">1.2. Implies ( ⇒ , 2 )</a></li>
-<li><a href="#org54f0ebb">1.3. OR ( ∨ , 3 )</a></li>
-<li><a href="#org7ae6d33">1.4. AND ( ∧ , 4 )</a></li>
-<li><a href="#orgcd6785f">1.5. NOT ( ¬ , 5 )</a></li>
+<li><a href="#org32078da">1.1. Equivalent ( ⇔ , 1 )</a></li>
+<li><a href="#org21eb9de">1.2. Implies ( ⇒ , 2 )</a></li>
+<li><a href="#org2639967">1.3. OR ( ∨ , 3 )</a></li>
+<li><a href="#org8dd63d1">1.4. AND ( ∧ , 4 )</a></li>
+<li><a href="#org4018a60">1.5. NOT ( ¬ , 5 )</a></li>
</ul>
</li>
-<li><a href="#org2c0e81d">2. Examples</a>
+<li><a href="#org248499d">2. Examples</a>
<ul>
-<li><a href="#org335f235">2.1. Example: (A ∧ B) ∨ ¬C</a></li>
-<li><a href="#orgfa48512">2.2. Example: A ⇒ (B ∨ ¬C)</a></li>
-<li><a href="#org6f17529">2.3. Example: (A ⇔ B) ∧ C</a></li>
+<li><a href="#org8ffdf82">2.1. Example: (A ∧ B) ∨ ¬C</a></li>
+<li><a href="#orge603e80">2.2. Example: A ⇒ (B ∨ ¬C)</a></li>
+<li><a href="#orgf2d4f3c">2.3. Example: (A ⇔ B) ∧ C</a></li>
</ul>
</li>
</ul>
designing and understanding digital circuits, Boolean algebra, and logical expressions.
</p>
-<div id="outline-container-org6ff8d10" class="outline-2">
-<h2 id="org6ff8d10"><span class="section-number-2">1.</span> Implemented logical operations</h2>
+<div id="outline-container-org76ad210" class="outline-2">
+<h2 id="org76ad210"><span class="section-number-2">1.</span> Implemented logical operations</h2>
<div class="outline-text-2" id="text-1">
</div>
-<div id="outline-container-org34525d9" class="outline-3">
-<h3 id="org34525d9"><span class="section-number-3">1.1.</span> Equivalent ( ⇔ , 1 )</h3>
+<div id="outline-container-org32078da" class="outline-3">
+<h3 id="org32078da"><span class="section-number-3">1.1.</span> Equivalent ( ⇔ , 1 )</h3>
<div class="outline-text-3" id="text-1-1">
<p>
The equivalent operation, also known as logical biconditional, is true if and only if
</div>
</div>
-<div id="outline-container-orgf5b7cc9" class="outline-3">
-<h3 id="orgf5b7cc9"><span class="section-number-3">1.2.</span> Implies ( ⇒ , 2 )</h3>
+<div id="outline-container-org21eb9de" class="outline-3">
+<h3 id="org21eb9de"><span class="section-number-3">1.2.</span> Implies ( ⇒ , 2 )</h3>
<div class="outline-text-3" id="text-1-2">
<p>
An implication asserts that if the first proposition is true, the
</div>
</div>
-<div id="outline-container-org54f0ebb" class="outline-3">
-<h3 id="org54f0ebb"><span class="section-number-3">1.3.</span> OR ( ∨ , 3 )</h3>
+<div id="outline-container-org2639967" class="outline-3">
+<h3 id="org2639967"><span class="section-number-3">1.3.</span> OR ( ∨ , 3 )</h3>
<div class="outline-text-3" id="text-1-3">
<p>
The OR operation, also known as logical disjunction, is true if at
</div>
</div>
-<div id="outline-container-org7ae6d33" class="outline-3">
-<h3 id="org7ae6d33"><span class="section-number-3">1.4.</span> AND ( ∧ , 4 )</h3>
+<div id="outline-container-org8dd63d1" class="outline-3">
+<h3 id="org8dd63d1"><span class="section-number-3">1.4.</span> AND ( ∧ , 4 )</h3>
<div class="outline-text-3" id="text-1-4">
<p>
The AND operation, also known as logical conjunction, is true if and
</div>
</div>
-<div id="outline-container-orgcd6785f" class="outline-3">
-<h3 id="orgcd6785f"><span class="section-number-3">1.5.</span> NOT ( ¬ , 5 )</h3>
+<div id="outline-container-org4018a60" class="outline-3">
+<h3 id="org4018a60"><span class="section-number-3">1.5.</span> NOT ( ¬ , 5 )</h3>
<div class="outline-text-3" id="text-1-5">
<p>
The NOT operation, also known as logical negation, inverts the value
</div>
</div>
</div>
-<div id="outline-container-org2c0e81d" class="outline-2">
-<h2 id="org2c0e81d"><span class="section-number-2">2.</span> Examples</h2>
+<div id="outline-container-org248499d" class="outline-2">
+<h2 id="org248499d"><span class="section-number-2">2.</span> Examples</h2>
<div class="outline-text-2" id="text-2">
</div>
-<div id="outline-container-org335f235" class="outline-3">
-<h3 id="org335f235"><span class="section-number-3">2.1.</span> Example: (A ∧ B) ∨ ¬C</h3>
+<div id="outline-container-org8ffdf82" class="outline-3">
+<h3 id="org8ffdf82"><span class="section-number-3">2.1.</span> Example: (A ∧ B) ∨ ¬C</h3>
<div class="outline-text-3" id="text-2-1">
<table border="2" cellspacing="0" cellpadding="6" rules="groups" frame="hsides">
</div>
</div>
-<div id="outline-container-orgfa48512" class="outline-3">
-<h3 id="orgfa48512"><span class="section-number-3">2.2.</span> Example: A ⇒ (B ∨ ¬C)</h3>
+<div id="outline-container-orge603e80" class="outline-3">
+<h3 id="orge603e80"><span class="section-number-3">2.2.</span> Example: A ⇒ (B ∨ ¬C)</h3>
<div class="outline-text-3" id="text-2-2">
<table border="2" cellspacing="0" cellpadding="6" rules="groups" frame="hsides">
</div>
</div>
-<div id="outline-container-org6f17529" class="outline-3">
-<h3 id="org6f17529"><span class="section-number-3">2.3.</span> Example: (A ⇔ B) ∧ C</h3>
+<div id="outline-container-orgf2d4f3c" class="outline-3">
+<h3 id="orgf2d4f3c"><span class="section-number-3">2.3.</span> Example: (A ⇔ B) ∧ C</h3>
<div class="outline-text-3" id="text-2-3">
<p>
Truth Table:
</div>
</div>
<div id="postamble" class="status">
-<p class="date">Created: 2025-07-30 ke 08:57</p>
+<p class="date">Created: 2025-07-30 ke 12:30</p>
<p class="validation"><a href="https://validator.w3.org/check?uri=referer">Validate</a></p>
</div>
</body>
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en">
<head>
-<!-- 2025-07-30 ke 08:57 -->
+<!-- 2025-07-30 ke 12:31 -->
<meta http-equiv="Content-Type" content="text/html;charset=utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<title>Mouse driver for QBasic programs</title>
<h2>Table of Contents</h2>
<div id="text-table-of-contents" role="doc-toc">
<ul>
-<li><a href="#orgf16be01">1. Overview</a></li>
-<li><a href="#org6d01472">2. High-level idea</a></li>
-<li><a href="#orgc61712f">3. Terminate and Stay Resident module</a></li>
-<li><a href="#org6191dd0">4. QBasic demonstration program</a></li>
+<li><a href="#org494c62e">1. Overview</a></li>
+<li><a href="#org15ce1af">2. High-level idea</a></li>
+<li><a href="#org6c46f87">3. Terminate and Stay Resident module</a></li>
+<li><a href="#org6fbada4">4. QBasic demonstration program</a></li>
</ul>
</div>
</div>
-<div id="outline-container-orgf16be01" class="outline-2">
-<h2 id="orgf16be01"><span class="section-number-2">1.</span> Overview</h2>
+<div id="outline-container-org494c62e" class="outline-2">
+<h2 id="org494c62e"><span class="section-number-2">1.</span> Overview</h2>
<div class="outline-text-2" id="text-1">
<p>
QBasic, a popular programming language in the DOS era, lacks native
</div>
</div>
-<div id="outline-container-org6d01472" class="outline-2">
-<h2 id="org6d01472"><span class="section-number-2">2.</span> High-level idea</h2>
+<div id="outline-container-org15ce1af" class="outline-2">
+<h2 id="org15ce1af"><span class="section-number-2">2.</span> High-level idea</h2>
<div class="outline-text-2" id="text-2">
<p>
Workaround to access mouse involves a Terminate and Stay Resident
</div>
</div>
-<div id="outline-container-orgc61712f" class="outline-2">
-<h2 id="orgc61712f"><span class="section-number-2">3.</span> Terminate and Stay Resident module</h2>
+<div id="outline-container-org6c46f87" class="outline-2">
+<h2 id="org6c46f87"><span class="section-number-2">3.</span> Terminate and Stay Resident module</h2>
<div class="outline-text-2" id="text-3">
<p>
A DOS TSR program that hooks into the system's interrupt mechanism to
</div>
</div>
-<div id="outline-container-org6191dd0" class="outline-2">
-<h2 id="org6191dd0"><span class="section-number-2">4.</span> QBasic demonstration program</h2>
+<div id="outline-container-org6fbada4" class="outline-2">
+<h2 id="org6fbada4"><span class="section-number-2">4.</span> QBasic demonstration program</h2>
<div class="outline-text-2" id="text-4">
<p>
A QBasic program that reads mouse data from the memory location
-<div id="org290bca1" class="figure">
+<div id="org0375a41" class="figure">
<p><a href="mousedrv.bas" class="responsive-img"><img src="screenshot.png" alt="screenshot.png" class="responsive-img" /></a>
</p>
</div>
</div>
</div>
<div id="postamble" class="status">
-<p class="date">Created: 2025-07-30 ke 08:57</p>
+<p class="date">Created: 2025-07-30 ke 12:31</p>
<p class="validation"><a href="https://validator.w3.org/check?uri=referer">Validate</a></p>
</div>
</body>
+++ /dev/null
-This is sample encoded message!\r
+++ /dev/null
-This is sample encoded message!\r
+++ /dev/null
-' Noise reduction\r
-' made by Svjatoslav Agejenko\r
-' in 2003.12\r
-' H-Page: svjatoslav.eu\r
-' E-Mail: svjatoslav@svjatoslav.eu\r
- \r
-\r
-\r
-DECLARE SUB start ()\r
-DEFINT A-Y\r
-DIM SHARED avb(1 TO 100)\r
-DIM SHARED byte AS STRING * 1\r
-DIM SHARED po, pod\r
-DIM SHARED file1$, file2$\r
-\r
-start\r
-\r
-INPUT "average factor:", po\r
-INPUT "divide factor:", pod\r
-\r
-OPEN file2$ FOR BINARY AS #1\r
-OPEN file1$ FOR BINARY AS #2\r
-\r
-SCREEN 12\r
-px = 0\r
-1\r
-GET #1, , byte\r
-c = ASC(byte)\r
-IF c > 127 THEN c = c - 255\r
-\r
-FOR a = 1 TO po - 1\r
-avb(a) = avb(a + 1)\r
-NEXT a\r
-avb(po) = c\r
-\r
-b = 0\r
-FOR a = 1 TO po\r
-b = b + avb(a)\r
-NEXT a\r
-\r
-b = b / pod\r
-'LINE (px + 1, 0)-(px + 1, 260), 14\r
-LINE (px, 0)-(px, 260), 0\r
-PSET (px, c + 130), 12\r
-PSET (px, b + 130), 14\r
-px = px + 1\r
-IF px > 639 THEN px = 1\r
-IF b < 0 THEN b = b + 255\r
-IF b > 255 THEN b = 255\r
-byte = CHR$(b)\r
-PUT #2, , byte\r
-'c$ = INPUT$(1)\r
-IF EOF(1) = 0 THEN GOTO 1\r
-\r
-CLOSE #2\r
-CLOSE #1\r
-\r
-SUB start\r
-\r
-IF COMMAND$ = "" THEN END\r
-b$ = COMMAND$\r
-file2$ = b$\r
-file1$ = ""\r
-FOR a = 1 TO LEN(b$)\r
-c$ = RIGHT$(LEFT$(b$, a), 1)\r
-IF c$ = "." OR c$ = " " THEN GOTO 2\r
-file1$ = file1$ + c$\r
-NEXT a\r
-2\r
-file1$ = file1$ + ".awe"\r
-\r
-END SUB\r
-\r
+++ /dev/null
-* data in sound\r
-\r
-Utility to encode/decode digital information into wave sound file.\r
-You can later record it on the tape or send it acustically or\r
-for example over telephone line. Decoding utility\r
-is petty noise tolerant.\r
-\r
-\r
-[[file:screenshot.png]]\r
+++ /dev/null
-' Utility that encodes arbitrary text message into 8 bit sound file.
-' This audio can be now transferred over telephone line or recorded to magnetic tape.
-' This program is free software: released under Creative Commons Zero (CC0) license
-' by Svjatoslav Agejenko.
-' Email: svjatoslav@svjatoslav.eu
-' Homepage: http://www.svjatoslav.eu
-'
-' Changelog:
-' 2001, Initial version
-' 2024.09, Improved program readability
-
-DECLARE SUB StartProgram ()
-DECLARE SUB AddIWave ()
-DECLARE SUB AddOWave ()
-DECLARE SUB ByteToSound (soundByte AS SINGLE)
-
-DIM SHARED iwaveArray(1 TO 20)
-DIM SHARED owaveArray(1 TO 41)
-DIM SHARED iwaveData$
-DIM SHARED owaveData$
-DIM SHARED inputFile$
-DIM SHARED outputFile$
-DIM SHARED byte AS STRING * 1
-
-StartProgram
-
-inputFile$ = "input.txt"
-outputFile$ = "sound.xi"
-
-' Open the input and output files for binary access
-OPEN inputFile$ FOR BINARY AS #2
-OPEN outputFile$ FOR BINARY AS #1
-
-' Add data start header/marker to the audio file
-FOR a = 1 TO 50
- AddIWave
-NEXT a
-AddOWave
-
-' Read each byte from the input file and convert it to sound
-2
-GET #2, , byte
-ByteToSound ASC(byte)
-IF EOF(2) = 0 THEN GOTO 2
-
-' Close the files after processing
-CLOSE #2
-CLOSE #1
-
-PRINT "Encoding of message into sound completed"
-
-SUB ByteToSound (soundByte AS SINGLE)
-' Convert a byte to 8-bit wave sound data
- soundByte = soundByte + 1
-
- ' Check if the byte value is greater than 128.
- ' If yes, set most significant bit to 1, otherwise 0
- IF soundByte > 128 THEN
- soundByte = soundByte - 128
- AddIWave
- ELSE
- AddOWave
- END IF
-
- ' Check if the byte value is greater than 64 to set next bit
- IF soundByte > 64 THEN
- soundByte = soundByte - 64
- AddIWave
- ELSE
- AddOWave
- END IF
-
- IF soundByte > 32 THEN
- soundByte = soundByte - 32
- AddIWave
- ELSE
- AddOWave
- END IF
-
- IF soundByte > 16 THEN
- soundByte = soundByte - 16
- AddIWave
- ELSE
- AddOWave
- END IF
-
- IF soundByte > 8 THEN
- soundByte = soundByte - 8
- AddIWave
- ELSE
- AddOWave
- END IF
-
- IF soundByte > 4 THEN
- soundByte = soundByte - 4
- AddIWave
- ELSE
- AddOWave
- END IF
-
- IF soundByte > 2 THEN
- soundByte = soundByte - 2
- AddIWave
- ELSE
- AddOWave
- END IF
-
- ' Check if the byte value is greater than 1
- IF soundByte > 1 THEN
- AddIWave
- ELSE
- AddOWave
- END IF
-END SUB
-
-SUB AddIWave
-' Write iwaveData to the output file
- PUT #1, , iwaveData$
-END SUB
-
-SUB AddOWave
-' Write owaveData to the output file
- PUT #1, , owaveData$
-END SUB
-
-SUB StartProgram
-' Initialize wave data arrays
-
- pi = 3.141592653999996#
-
- ' Generate sine wave values to represent 1
- b = 0
- FOR a = pi / 2 TO 2.5 * pi STEP (2 * pi / 20)
- b = b + 1
- iwaveArray(b) = SIN(a) * 100
- IF iwaveArray(b) < 0 THEN
- iwaveArray(b) = iwaveArray(b) + 255
- END IF
- NEXT a
-
- ' Generate sine wave values to represent 0
- b = 0
- FOR a = pi / 2 TO 2.5 * pi STEP (2 * pi / 40)
- b = b + 1
- owaveArray(b) = SIN(a) * 100
- IF owaveArray(b) < 0 THEN
- owaveArray(b) = owaveArray(b) + 255
- END IF
- NEXT a
-
-' Convert wave arrays to string data
-
- ' Convert iwaveArray to string because strings are more computationally efficient to write into output file.
- FOR a = 1 TO 20
- iwaveData$ = iwaveData$ + CHR$(iwaveArray(a))
- NEXT a
-
- ' Convert owaveArray to string
- FOR a = 1 TO 40
- owaveData$ = owaveData$ + CHR$(owaveArray(a))
- NEXT a
-
-END SUB
+++ /dev/null
-' Utility that decodes text message from 8 bit audio recording.
-' This program is free software: released under Creative Commons Zero (CC0) license
-' by Svjatoslav Agejenko.
-' Email: svjatoslav@svjatoslav.eu
-' Homepage: http://www.svjatoslav.eu
-'
-' Changelog:
-' 2001, Initial version
-' 2024 - 2025, Improved program readability
-'
-' Data is encoded in the audio by using frequency modulation.
-' When decoding data, program locates peaks between waveforms.
-' Then it calculates distance between peaks.
-' Long between peak distance is interpreted as 0 bit, short distance is 1 bit.
-' Bits 0 and 1 are then sequentially added into bytes and complete
-' message is decoded and shown on the screen. In addition, message is written out to
-' the file.
-'
-' Frequency modulation was chosen over amplitude modulation because
-' my tests with cassette tape recorder showed that distortions affect mostly
-' signal amplitude, but do not affect signal frequency that much.
-'
-' Data carrying audio is preceded with special header tone. Program detects header tone
-' and uses it to calculate baseline signal frequency that it will use later to decode bits.
-' Also header allows to mark precise data starting point.
-
-DEFINT A-Y
-DECLARE SUB bysf (a$, d)
-DECLARE SUB messa (a$)
-DECLARE SUB pfo (f, t, it)
-DECLARE SUB anal ()
-DECLARE SUB start ()
-DECLARE SUB iadd ()
-DECLARE SUB oadd ()
-DECLARE SUB byt (a)
-
-DIM SHARED file1$
-DIM SHARED file2$
-
-' Contains the actual audio waveform samples
-DIM SHARED audioBuffer(-100 TO 10000)
-DIM SHARED bus AS STRING * 1000
-DIM SHARED bufi
-DIM SHARED bg
-DIM SHARED sm
-DIM SHARED beg
-DIM SHARED wai
-DIM SHARED old2
-
-' Statistical Analysis Array (contains measured peak distances)
-DIM SHARED statisticalArray(1 TO 10)
-DIM SHARED statl
-DIM SHARED aver
-DIM SHARED byte AS STRING * 1
-DIM SHARED avv
-
-DIM SHARED li
-DIM SHARED oc
-DIM SHARED px
-
-start
-messa "Searching for beginning..."
-
-OPEN "output.txt" FOR BINARY AS #1
-OPEN "sound.xi" FOR BINARY AS #2
-SEEK #2, 360
-
-2
-GET #2, , bus
-FOR a = 1 TO 1000
- b$ = RIGHT$(LEFT$(bus, a), 1)
- bufi = bufi + 1
- c = ASC(b$)
- IF c > 127 THEN c = c - 255
- audioBuffer(bufi) = c
-NEXT a
-IF (EOF(2) = 0) AND (bufi < 8000) THEN GOTO 2
-anal
-IF EOF(2) = 0 THEN GOTO 2
-
-CLOSE #2
-CLOSE #1
-
-SYSTEM
-
-SUB anal
- ' Draw a vertical line to represent the buffer data
- LINE (1, 170)-(200, 430), 0, BF
-
- FOR a = 1 TO bufi - (avv - 1)
- ' Draw horizontal lines at key points
- LINE (100, 170)-(100, 430), 13
- LINE (old2 - a + 100, 170)-(old2 - a + 100, 430), 11
- LINE (0, 300)-(200, 300), 13
-
- ' Plot the buffer data points
- FOR b = 0 TO 200
- PSET (b, audioBuffer(b + a - 101) + 300), 0
- PSET (b, audioBuffer(b + a - 100) + 300), 14
- NEXT b
-
- LINE (old2 - a + 100, 170)-(old2 - a + 100, 430), 0
-
- ' Calculate the average value of the buffer segment
- c = 0
- FOR b = a TO a + (avv - 1)
- c = c + audioBuffer(b)
- NEXT b
- c = c / (avv / 2)
-
- ' Determine if we are in a high or low state
- IF c > oc THEN
- IF li = -1 THEN
- li = 1
- pfo a + ((avv - 1) / 2 - 1), 1, oc
- GOTO 3
- END IF
- END IF
-
- IF c < oc THEN
- IF li = 1 THEN
- li = -1
- pfo a + ((avv - 1) / 2 - 1), 2, oc
- GOTO 3
- END IF
- END IF
-
- 3
- ' Update the current average value
- oc = c
- NEXT a
-
- ' Shift the buffer data to the left
- FOR a = bufi - (avv - 2) TO bufi
- audioBuffer(a - (bufi - (avv - 2)) + 1) = audioBuffer(a)
- NEXT a
-
- ' Update the starting index of the buffer
- old2 = old2 - (bufi - (avv - 2)) + 1
- bufi = avv - 1
-
-END SUB
-
-SUB bysf (a$, d)
- ' Draw a horizontal line to represent the byte data
- LINE (201, 170)-(639, 430), 1, B
-
- IF d = 10 THEN px = 0: a$ = "": GOTO 5
-
- px = px + 1
- IF px > 53 THEN
- px = 1
- 5
- DIM tempr(1 TO 32000)
- GET (201, 186)-(639, 430), tempr(1)
- PUT (201, 170), tempr(1), PSET
- LINE (201, 414)-(639, 430), 0, BF
- END IF
-
- ' Print the byte data to the screen
- LOCATE 26, 26 + px
- PRINT a$
-
- ' Convert the byte value to a character and write it to the output file
- byte = CHR$(d)
- PUT #1, , byte
-
-END SUB
-
-SUB byt (a)
-
- ' Draw a horizontal line to represent the bit data
- LINE (410, 0)-(639, 169), 1, B
-
- statl = statl + 1
- IF statl > 8 THEN
- statl = 1
- b = 0
- IF statisticalArray(1) = 1 THEN b = b + 128
- IF statisticalArray(2) = 1 THEN b = b + 64
- IF statisticalArray(3) = 1 THEN b = b + 32
- IF statisticalArray(4) = 1 THEN b = b + 16
- IF statisticalArray(5) = 1 THEN b = b + 8
- IF statisticalArray(6) = 1 THEN b = b + 4
- IF statisticalArray(7) = 1 THEN b = b + 2
- IF statisticalArray(8) = 1 THEN b = b + 1
-
- ' Print the byte value to the screen
- LOCATE 10, 69
- PRINT b
-
- ' Print the hexadecimal representation of the byte value
- LOCATE 10, 75
- PRINT HEX$(b)
-
- ' Print the character representation of the byte value
- LOCATE 10, 79
- c$ = CHR$(b)
-
- ' Replace control characters with a space
- IF b = 7 OR b = 8 OR b = 10 OR b = 12 OR b = 13 THEN c$ = " "
-
- PRINT c$
-
- bysf c$, b
-
- DIM tempr(1 TO 10000)
- GET (410, 16)-(639, 169), tempr(1)
- PUT (410, 0), tempr(1), PSET
- LINE (410, 153)-(639, 169), 0, BF
- END IF
-
- ' Print the bit value to the screen
- LOCATE 10, 50 + (statl * 2)
-
- statisticalArray(statl) = a
-
- PRINT a
-
-END SUB
-
-SUB messa (a$)
- ' Draw a horizontal line to represent the message data
- LINE (0, 0)-(409, 169), 1, B
-
- DIM tempr(1 TO 20000)
-
- GET (0, 16)-(409, 169), tempr(1)
-
- PUT (0, 0), tempr(1), PSET
-
- LINE (0, 153)-(409, 169), 0, BF
-
- ' Print the message to the screen
- LOCATE 10, 1
-
- PRINT a$
-
-END SUB
-
-SUB pfo (f, t, it)
- IF t = 2 THEN
- bg = it
-
- IF wai > 0 THEN wai = wai - 1
-
- ' Check if we have found data start header
- IF (bg - sm > 6) AND (beg = 0) THEN
- beg = 1
- wai = 10
- messa "Beginning point found!"
- END IF
-
- ' Perform statistical analysis if needed
- IF (wai = 0) AND (beg = 1) THEN
- IF statl = 0 THEN messa "Beginning statistical analyze"
-
- statl = statl + 1
-
- IF statl > 10 THEN
- FOR a = 1 TO 10
- aver = aver + statisticalArray(a)
- NEXT a
-
- aver = aver * 1.5 / 10
-
- beg = 2
-
- statl = 1
-
- messa "Statistical analyze completed!"
- END IF
-
- ' Store the current frame index
- statisticalArray(statl) = f - old2
- END IF
-
- ' Decode the bits if we are in the decoding state
- IF beg = 2 THEN
- IF f - old2 >= aver THEN
- beg = 3
-
- statl = 0
-
- FOR a = 1 TO 8
- statisticalArray(a) = 0
- NEXT a
-
- GOTO 4
- END IF
- END IF
-
- ' Decode the bits based on the current state
- IF beg = 3 THEN
- IF f - old2 >= aver THEN
- byt 0
- ELSE
- byt 1
- END IF
- END IF
-
- 4
-
- old2 = f
- ELSE
- sm = it
- END IF
-END SUB
-
-SUB start
-
- ' Set the screen mode to graphics
- SCREEN 12
-
- ' Initialize buffer index and other variables
- bufi = 0
-
- beg = 0
-
- statl = 0
-
- aver = 0
-
- px = 0
-
- avv = 7
-
- li = 1
-
- oc = -9999
-
-END SUB
\ No newline at end of file
--- /dev/null
+This is sample encoded message!\r
--- /dev/null
+This is sample encoded message!\r
--- /dev/null
+' Utility that reduces high frequency noise/hiss in audio file.\r
+' In some casus it can help when recovering digital data from sound file.\r
+'\r
+' This program is free software: released under Creative Commons Zero (CC0) license\r
+' by Svjatoslav Agejenko.\r
+' Email: svjatoslav@svjatoslav.eu\r
+' Homepage: http://www.svjatoslav.eu\r
+'\r
+' Changelog:\r
+' 2003.12, Initial version\r
+\r
+\r
+DECLARE SUB start ()\r
+DEFINT A-Y\r
+DIM SHARED avb(1 TO 100)\r
+DIM SHARED byte AS STRING * 1\r
+DIM SHARED po, pod\r
+DIM SHARED file1$, file2$\r
+\r
+start\r
+\r
+INPUT "average factor:", po\r
+INPUT "divide factor:", pod\r
+\r
+OPEN file2$ FOR BINARY AS #1\r
+OPEN file1$ FOR BINARY AS #2\r
+\r
+SCREEN 12\r
+px = 0\r
+1\r
+GET #1, , byte\r
+c = ASC(byte)\r
+IF c > 127 THEN c = c - 255\r
+\r
+FOR a = 1 TO po - 1\r
+avb(a) = avb(a + 1)\r
+NEXT a\r
+avb(po) = c\r
+\r
+b = 0\r
+FOR a = 1 TO po\r
+b = b + avb(a)\r
+NEXT a\r
+\r
+b = b / pod\r
+'LINE (px + 1, 0)-(px + 1, 260), 14\r
+LINE (px, 0)-(px, 260), 0\r
+PSET (px, c + 130), 12\r
+PSET (px, b + 130), 14\r
+px = px + 1\r
+IF px > 639 THEN px = 1\r
+IF b < 0 THEN b = b + 255\r
+IF b > 255 THEN b = 255\r
+byte = CHR$(b)\r
+PUT #2, , byte\r
+'c$ = INPUT$(1)\r
+IF EOF(1) = 0 THEN GOTO 1\r
+\r
+CLOSE #2\r
+CLOSE #1\r
+\r
+SUB start\r
+\r
+IF COMMAND$ = "" THEN END\r
+b$ = COMMAND$\r
+file2$ = b$\r
+file1$ = ""\r
+FOR a = 1 TO LEN(b$)\r
+c$ = RIGHT$(LEFT$(b$, a), 1)\r
+IF c$ = "." OR c$ = " " THEN GOTO 2\r
+file1$ = file1$ + c$\r
+NEXT a\r
+2\r
+file1$ = file1$ + ".awe"\r
+\r
+END SUB\r
+\r
--- /dev/null
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
+"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en">
+<head>
+<!-- 2025-07-31 to 03:01 -->
+<meta http-equiv="Content-Type" content="text/html;charset=utf-8" />
+<meta name="viewport" content="width=device-width, initial-scale=1" />
+<title>Data over analog audio</title>
+<meta name="generator" content="Org Mode" />
+<style>
+ #content { max-width: 60em; margin: auto; }
+ .title { text-align: center;
+ margin-bottom: .2em; }
+ .subtitle { text-align: center;
+ font-size: medium;
+ font-weight: bold;
+ margin-top:0; }
+ .todo { font-family: monospace; color: red; }
+ .done { font-family: monospace; color: green; }
+ .priority { font-family: monospace; color: orange; }
+ .tag { background-color: #eee; font-family: monospace;
+ padding: 2px; font-size: 80%; font-weight: normal; }
+ .timestamp { color: #bebebe; }
+ .timestamp-kwd { color: #5f9ea0; }
+ .org-right { margin-left: auto; margin-right: 0px; text-align: right; }
+ .org-left { margin-left: 0px; margin-right: auto; text-align: left; }
+ .org-center { margin-left: auto; margin-right: auto; text-align: center; }
+ .underline { text-decoration: underline; }
+ #postamble p, #preamble p { font-size: 90%; margin: .2em; }
+ p.verse { margin-left: 3%; }
+ pre {
+ border: 1px solid #e6e6e6;
+ border-radius: 3px;
+ background-color: #f2f2f2;
+ padding: 8pt;
+ font-family: monospace;
+ overflow: auto;
+ margin: 1.2em;
+ }
+ pre.src {
+ position: relative;
+ overflow: auto;
+ }
+ pre.src:before {
+ display: none;
+ position: absolute;
+ top: -8px;
+ right: 12px;
+ padding: 3px;
+ color: #555;
+ background-color: #f2f2f299;
+ }
+ pre.src:hover:before { display: inline; margin-top: 14px;}
+ /* Languages per Org manual */
+ pre.src-asymptote:before { content: 'Asymptote'; }
+ pre.src-awk:before { content: 'Awk'; }
+ pre.src-authinfo::before { content: 'Authinfo'; }
+ pre.src-C:before { content: 'C'; }
+ /* pre.src-C++ doesn't work in CSS */
+ pre.src-clojure:before { content: 'Clojure'; }
+ pre.src-css:before { content: 'CSS'; }
+ pre.src-D:before { content: 'D'; }
+ pre.src-ditaa:before { content: 'ditaa'; }
+ pre.src-dot:before { content: 'Graphviz'; }
+ pre.src-calc:before { content: 'Emacs Calc'; }
+ pre.src-emacs-lisp:before { content: 'Emacs Lisp'; }
+ pre.src-fortran:before { content: 'Fortran'; }
+ pre.src-gnuplot:before { content: 'gnuplot'; }
+ pre.src-haskell:before { content: 'Haskell'; }
+ pre.src-hledger:before { content: 'hledger'; }
+ pre.src-java:before { content: 'Java'; }
+ pre.src-js:before { content: 'Javascript'; }
+ pre.src-latex:before { content: 'LaTeX'; }
+ pre.src-ledger:before { content: 'Ledger'; }
+ pre.src-lisp:before { content: 'Lisp'; }
+ pre.src-lilypond:before { content: 'Lilypond'; }
+ pre.src-lua:before { content: 'Lua'; }
+ pre.src-matlab:before { content: 'MATLAB'; }
+ pre.src-mscgen:before { content: 'Mscgen'; }
+ pre.src-ocaml:before { content: 'Objective Caml'; }
+ pre.src-octave:before { content: 'Octave'; }
+ pre.src-org:before { content: 'Org mode'; }
+ pre.src-oz:before { content: 'OZ'; }
+ pre.src-plantuml:before { content: 'Plantuml'; }
+ pre.src-processing:before { content: 'Processing.js'; }
+ pre.src-python:before { content: 'Python'; }
+ pre.src-R:before { content: 'R'; }
+ pre.src-ruby:before { content: 'Ruby'; }
+ pre.src-sass:before { content: 'Sass'; }
+ pre.src-scheme:before { content: 'Scheme'; }
+ pre.src-screen:before { content: 'Gnu Screen'; }
+ pre.src-sed:before { content: 'Sed'; }
+ pre.src-sh:before { content: 'shell'; }
+ pre.src-sql:before { content: 'SQL'; }
+ pre.src-sqlite:before { content: 'SQLite'; }
+ /* additional languages in org.el's org-babel-load-languages alist */
+ pre.src-forth:before { content: 'Forth'; }
+ pre.src-io:before { content: 'IO'; }
+ pre.src-J:before { content: 'J'; }
+ pre.src-makefile:before { content: 'Makefile'; }
+ pre.src-maxima:before { content: 'Maxima'; }
+ pre.src-perl:before { content: 'Perl'; }
+ pre.src-picolisp:before { content: 'Pico Lisp'; }
+ pre.src-scala:before { content: 'Scala'; }
+ pre.src-shell:before { content: 'Shell Script'; }
+ pre.src-ebnf2ps:before { content: 'ebfn2ps'; }
+ /* additional language identifiers per "defun org-babel-execute"
+ in ob-*.el */
+ pre.src-cpp:before { content: 'C++'; }
+ pre.src-abc:before { content: 'ABC'; }
+ pre.src-coq:before { content: 'Coq'; }
+ pre.src-groovy:before { content: 'Groovy'; }
+ /* additional language identifiers from org-babel-shell-names in
+ ob-shell.el: ob-shell is the only babel language using a lambda to put
+ the execution function name together. */
+ pre.src-bash:before { content: 'bash'; }
+ pre.src-csh:before { content: 'csh'; }
+ pre.src-ash:before { content: 'ash'; }
+ pre.src-dash:before { content: 'dash'; }
+ pre.src-ksh:before { content: 'ksh'; }
+ pre.src-mksh:before { content: 'mksh'; }
+ pre.src-posh:before { content: 'posh'; }
+ /* Additional Emacs modes also supported by the LaTeX listings package */
+ pre.src-ada:before { content: 'Ada'; }
+ pre.src-asm:before { content: 'Assembler'; }
+ pre.src-caml:before { content: 'Caml'; }
+ pre.src-delphi:before { content: 'Delphi'; }
+ pre.src-html:before { content: 'HTML'; }
+ pre.src-idl:before { content: 'IDL'; }
+ pre.src-mercury:before { content: 'Mercury'; }
+ pre.src-metapost:before { content: 'MetaPost'; }
+ pre.src-modula-2:before { content: 'Modula-2'; }
+ pre.src-pascal:before { content: 'Pascal'; }
+ pre.src-ps:before { content: 'PostScript'; }
+ pre.src-prolog:before { content: 'Prolog'; }
+ pre.src-simula:before { content: 'Simula'; }
+ pre.src-tcl:before { content: 'tcl'; }
+ pre.src-tex:before { content: 'TeX'; }
+ pre.src-plain-tex:before { content: 'Plain TeX'; }
+ pre.src-verilog:before { content: 'Verilog'; }
+ pre.src-vhdl:before { content: 'VHDL'; }
+ pre.src-xml:before { content: 'XML'; }
+ pre.src-nxml:before { content: 'XML'; }
+ /* add a generic configuration mode; LaTeX export needs an additional
+ (add-to-list 'org-latex-listings-langs '(conf " ")) in .emacs */
+ pre.src-conf:before { content: 'Configuration File'; }
+
+ table { border-collapse:collapse; }
+ caption.t-above { caption-side: top; }
+ caption.t-bottom { caption-side: bottom; }
+ td, th { vertical-align:top; }
+ th.org-right { text-align: center; }
+ th.org-left { text-align: center; }
+ th.org-center { text-align: center; }
+ td.org-right { text-align: right; }
+ td.org-left { text-align: left; }
+ td.org-center { text-align: center; }
+ dt { font-weight: bold; }
+ .footpara { display: inline; }
+ .footdef { margin-bottom: 1em; }
+ .figure { padding: 1em; }
+ .figure p { text-align: center; }
+ .equation-container {
+ display: table;
+ text-align: center;
+ width: 100%;
+ }
+ .equation {
+ vertical-align: middle;
+ }
+ .equation-label {
+ display: table-cell;
+ text-align: right;
+ vertical-align: middle;
+ }
+ .inlinetask {
+ padding: 10px;
+ border: 2px solid gray;
+ margin: 10px;
+ background: #ffffcc;
+ }
+ #org-div-home-and-up
+ { text-align: right; font-size: 70%; white-space: nowrap; }
+ textarea { overflow-x: auto; }
+ .linenr { font-size: smaller }
+ .code-highlighted { background-color: #ffff00; }
+ .org-info-js_info-navigation { border-style: none; }
+ #org-info-js_console-label
+ { font-size: 10px; font-weight: bold; white-space: nowrap; }
+ .org-info-js_search-highlight
+ { background-color: #ffff00; color: #000000; font-weight: bold; }
+ .org-svg { }
+</style>
+<style type="text/css">
+ body {
+ max-width: 35cm !important;
+ }
+ #content {
+ max-width: 80em !important;
+ width: 90%;
+ }
+ </style>
+<link rel="stylesheet" type="text/css" href="https://thomasf.github.io/solarized-css/solarized-dark.min.css" />
+</head>
+<body>
+<div id="content" class="content">
+<h1 class="title">Data over analog audio</h1>
+<div id="table-of-contents" role="doc-toc">
+<h2>Table of Contents</h2>
+<div id="text-table-of-contents" role="doc-toc">
+<ul>
+<li><a href="#org84c4b8c">1. msg2xi: Text to Sound Encoder</a></li>
+<li><a href="#org0fbcf65">2. xi2msg: Sound to Text Decoder</a></li>
+<li><a href="#org6b92b85">3. aver</a></li>
+</ul>
+</div>
+</div>
+
+<div id="outline-container-org84c4b8c" class="outline-2">
+<h2 id="org84c4b8c"><span class="section-number-2">1.</span> msg2xi: Text to Sound Encoder</h2>
+<div class="outline-text-2" id="text-1">
+<p>
+<b>msg2xi</b> is a utility designed to encode arbitrary text messages into an
+8-bit sound file. This program allows users to convert digital data
+into analog audio signals, making it possible to transmit text
+messages over traditional analog mediums such as telephone lines or
+magnetic tapes.
+</p>
+
+<p>
+<b>How It Works:</b> The program reads text from an input file, processing
+it byte by byte. Each byte is broken down into its constituent bits.
+For each bit, a sine wave is generated. Different waveforms represent
+'1's and '0's (implementing frequency modulation). The generated
+waveforms are combined into a single audio file, encoding the original
+text message. A special pure sinewave header tone is added to the
+beginning of the audio file to mark the start of the encoded message,
+facilitating synchronization during decoding.
+</p>
+
+<p>
+Download source code: <a href="msg2xi.bas">Source code</a>
+</p>
+</div>
+</div>
+
+<div id="outline-container-org0fbcf65" class="outline-2">
+<h2 id="org0fbcf65"><span class="section-number-2">2.</span> xi2msg: Sound to Text Decoder</h2>
+<div class="outline-text-2" id="text-2">
+<p>
+The <b>xi2msg</b> utility is designed to decode digital information from an
+audio file, specifically an 8-bit sound file. This program is part of
+a suite of utilities that enable the transmission of digital data over
+analog audio mediums, such as telephone lines or magnetic tapes.
+</p>
+
+<p>
+The <b>xi2msg</b> utility works by analyzing the audio file to locate peaks
+between waveforms. It calculates the distance between these peaks to
+determine whether each segment represents a '0' or a '1' bit. This
+process involves several key steps:
+</p>
+
+<dl class="org-dl">
+<dt>Header Detection</dt><dd>The program starts by searching for a special
+header tone in the audio file. This header tone marks the beginning
+of the encoded message and helps synchronize the decoding process.</dd>
+
+<dt>Peak Analysis</dt><dd>The utility measures the distance between peaks in
+the audio waveform. Long distances between peaks are interpreted as
+'0' bits, while short distances are interpreted as '1' bits.</dd>
+
+<dt>Bit Assembly</dt><dd>The detected bits are sequentially assembled into
+bytes. Each byte is then converted into its corresponding character.</dd>
+
+<dt>Output</dt><dd>The decoded message is displayed on the screen and written
+to an output file, making it accessible for further use or analysis.</dd>
+</dl>
+
+<p>
+The program relies on frequency modulation for decoding data, which
+was chosen for its resilience to amplitude distortions that can occur
+during analog transmission. This makes the utility particularly
+effective for decoding messages recorded on cassette tapes or
+transmitted over telephone lines.
+</p>
+
+
+<div id="orgaea1c2e" class="figure">
+<p><img src="screenshot.png" alt="screenshot.png" />
+</p>
+</div>
+
+
+<p>
+Download source code: <a href="xi2msg.bas">Source code</a>
+</p>
+</div>
+</div>
+
+<div id="outline-container-org6b92b85" class="outline-2">
+<h2 id="org6b92b85"><span class="section-number-2">3.</span> aver</h2>
+<div class="outline-text-2" id="text-3">
+<p>
+The <b>aver.bas</b> utility is designed to reduce noise in digitized audio
+files by smoothing out noise peaks, which is particularly beneficial
+for audio files transmitted over analog mediums like telephone lines
+or magnetic tapes, where noise interference is common.
+</p>
+
+<p>
+The program starts by asking the user for two critical factors: the
+averaging factor and the divide factor. These parameters determine the
+intensity of the noise reduction applied.
+</p>
+
+<p>
+For each byte read from the input file, the program stores the last N
+values (where N is the averaging factor). These values are averaged,
+and the result is scaled by the divide factor. This averaging
+technique helps to smooth out noise spikes in the audio data.
+</p>
+
+<p>
+The program provides a graphical representation of the original and
+smoothed audio. This allows for visual comparison of the original and
+processed signals on the screen. The smoothed audio data is written to
+an output file, which should have reduced noise compared to the input
+file.
+</p>
+
+<p>
+The program uses command-line input to determine the filenames for
+input and output, defaulting to appending .awe to the input filename
+for the output file.
+</p>
+
+<p>
+Download source code: <a href="aver.bas">Source code</a>
+</p>
+</div>
+</div>
+</div>
+<div id="postamble" class="status">
+<p class="date">Created: 2025-07-31 to 03:01</p>
+<p class="validation"><a href="https://validator.w3.org/check?uri=referer">Validate</a></p>
+</div>
+</body>
+</html>
--- /dev/null
+#+TITLE: Data over analog audio\r
+#+LANGUAGE: en\r
+#+LATEX_HEADER: \usepackage[margin=1.0in]{geometry}\r
+#+LATEX_HEADER: \usepackage{parskip}\r
+#+LATEX_HEADER: \usepackage[none]{hyphenat}\r
+\r
+#+OPTIONS: H:20 num:20\r
+#+OPTIONS: author:nil\r
+\r
+* msg2xi: Text to Sound Encoder\r
+\r
+*msg2xi* is a utility designed to encode arbitrary text messages into an\r
+8-bit sound file. This program allows users to convert digital data\r
+into analog audio signals, making it possible to transmit text\r
+messages over traditional analog mediums such as telephone lines or\r
+magnetic tapes.\r
+\r
+*How It Works:* The program reads text from an input file, processing\r
+it byte by byte. Each byte is broken down into its constituent bits.\r
+For each bit, a sine wave is generated. Different waveforms represent\r
+'1's and '0's (implementing frequency modulation). The generated\r
+waveforms are combined into a single audio file, encoding the original\r
+text message. A special pure sinewave header tone is added to the\r
+beginning of the audio file to mark the start of the encoded message,\r
+facilitating synchronization during decoding.\r
+\r
+Download source code: [[file:msg2xi.bas][Source code]]\r
+\r
+* xi2msg: Sound to Text Decoder\r
+\r
+The *xi2msg* utility is designed to decode digital information from an\r
+audio file, specifically an 8-bit sound file. This program is part of\r
+a suite of utilities that enable the transmission of digital data over\r
+analog audio mediums, such as telephone lines or magnetic tapes.\r
+\r
+The *xi2msg* utility works by analyzing the audio file to locate peaks\r
+between waveforms. It calculates the distance between these peaks to\r
+determine whether each segment represents a '0' or a '1' bit. This\r
+process involves several key steps:\r
+\r
+- Header Detection :: The program starts by searching for a special\r
+ header tone in the audio file. This header tone marks the beginning\r
+ of the encoded message and helps synchronize the decoding process.\r
+\r
+- Peak Analysis :: The utility measures the distance between peaks in\r
+ the audio waveform. Long distances between peaks are interpreted as\r
+ '0' bits, while short distances are interpreted as '1' bits.\r
+\r
+- Bit Assembly :: The detected bits are sequentially assembled into\r
+ bytes. Each byte is then converted into its corresponding character.\r
+\r
+- Output :: The decoded message is displayed on the screen and written\r
+ to an output file, making it accessible for further use or analysis.\r
+\r
+The program relies on frequency modulation for decoding data, which\r
+was chosen for its resilience to amplitude distortions that can occur\r
+during analog transmission. This makes the utility particularly\r
+effective for decoding messages recorded on cassette tapes or\r
+transmitted over telephone lines.\r
+\r
+[[file:screenshot.png]]\r
+\r
+\r
+Download source code: [[file:xi2msg.bas][Source code]]\r
+\r
+* aver\r
+\r
+The *aver.bas* utility is designed to reduce noise in digitized audio\r
+files by smoothing out noise peaks, which is particularly beneficial\r
+for audio files transmitted over analog mediums like telephone lines\r
+or magnetic tapes, where noise interference is common.\r
+\r
+The program starts by asking the user for two critical factors: the\r
+averaging factor and the divide factor. These parameters determine the\r
+intensity of the noise reduction applied.\r
+\r
+For each byte read from the input file, the program stores the last N\r
+values (where N is the averaging factor). These values are averaged,\r
+and the result is scaled by the divide factor. This averaging\r
+technique helps to smooth out noise spikes in the audio data.\r
+\r
+The program provides a graphical representation of the original and\r
+smoothed audio. This allows for visual comparison of the original and\r
+processed signals on the screen. The smoothed audio data is written to\r
+an output file, which should have reduced noise compared to the input\r
+file.\r
+\r
+The program uses command-line input to determine the filenames for\r
+input and output, defaulting to appending .awe to the input filename\r
+for the output file.\r
+\r
+Download source code: [[file:aver.bas][Source code]]\r
--- /dev/null
+' Utility that encodes arbitrary text message into 8 bit sound file.
+' This audio can be now transferred over telephone line or recorded to magnetic tape.
+'
+' This program is free software: released under Creative Commons Zero (CC0) license
+' by Svjatoslav Agejenko.
+' Email: svjatoslav@svjatoslav.eu
+' Homepage: http://www.svjatoslav.eu
+'
+' Changelog:
+' 2001, Initial version
+' 2024.09, Improved program readability
+
+DECLARE SUB StartProgram ()
+DECLARE SUB AddIWave ()
+DECLARE SUB AddOWave ()
+DECLARE SUB ByteToSound (soundByte AS SINGLE)
+
+DIM SHARED iwaveArray(1 TO 20)
+DIM SHARED owaveArray(1 TO 41)
+DIM SHARED iwaveData$
+DIM SHARED owaveData$
+DIM SHARED inputFile$
+DIM SHARED outputFile$
+DIM SHARED byte AS STRING * 1
+
+StartProgram
+
+inputFile$ = "input.txt"
+outputFile$ = "sound.xi"
+
+' Open the input and output files for binary access
+OPEN inputFile$ FOR BINARY AS #2
+OPEN outputFile$ FOR BINARY AS #1
+
+' Add data start header/marker to the audio file
+FOR a = 1 TO 50
+ AddIWave
+NEXT a
+AddOWave
+
+' Read each byte from the input file and convert it to sound
+2
+GET #2, , byte
+ByteToSound ASC(byte)
+IF EOF(2) = 0 THEN GOTO 2
+
+' Close the files after processing
+CLOSE #2
+CLOSE #1
+
+PRINT "Encoding of message into sound completed"
+
+SUB ByteToSound (soundByte AS SINGLE)
+' Convert a byte to 8-bit wave sound data
+ soundByte = soundByte + 1
+
+ ' Check if the byte value is greater than 128.
+ ' If yes, set most significant bit to 1, otherwise 0
+ IF soundByte > 128 THEN
+ soundByte = soundByte - 128
+ AddIWave
+ ELSE
+ AddOWave
+ END IF
+
+ ' Check if the byte value is greater than 64 to set next bit
+ IF soundByte > 64 THEN
+ soundByte = soundByte - 64
+ AddIWave
+ ELSE
+ AddOWave
+ END IF
+
+ IF soundByte > 32 THEN
+ soundByte = soundByte - 32
+ AddIWave
+ ELSE
+ AddOWave
+ END IF
+
+ IF soundByte > 16 THEN
+ soundByte = soundByte - 16
+ AddIWave
+ ELSE
+ AddOWave
+ END IF
+
+ IF soundByte > 8 THEN
+ soundByte = soundByte - 8
+ AddIWave
+ ELSE
+ AddOWave
+ END IF
+
+ IF soundByte > 4 THEN
+ soundByte = soundByte - 4
+ AddIWave
+ ELSE
+ AddOWave
+ END IF
+
+ IF soundByte > 2 THEN
+ soundByte = soundByte - 2
+ AddIWave
+ ELSE
+ AddOWave
+ END IF
+
+ ' Check if the byte value is greater than 1
+ IF soundByte > 1 THEN
+ AddIWave
+ ELSE
+ AddOWave
+ END IF
+END SUB
+
+SUB AddIWave
+' Write iwaveData to the output file
+ PUT #1, , iwaveData$
+END SUB
+
+SUB AddOWave
+' Write owaveData to the output file
+ PUT #1, , owaveData$
+END SUB
+
+SUB StartProgram
+' Initialize wave data arrays
+
+ pi = 3.141592653999996#
+
+ ' Generate sine wave values to represent 1
+ b = 0
+ FOR a = pi / 2 TO 2.5 * pi STEP (2 * pi / 20)
+ b = b + 1
+ iwaveArray(b) = SIN(a) * 100
+ IF iwaveArray(b) < 0 THEN
+ iwaveArray(b) = iwaveArray(b) + 255
+ END IF
+ NEXT a
+
+ ' Generate sine wave values to represent 0
+ b = 0
+ FOR a = pi / 2 TO 2.5 * pi STEP (2 * pi / 40)
+ b = b + 1
+ owaveArray(b) = SIN(a) * 100
+ IF owaveArray(b) < 0 THEN
+ owaveArray(b) = owaveArray(b) + 255
+ END IF
+ NEXT a
+
+' Convert wave arrays to string data
+
+ ' Convert iwaveArray to string because strings are more computationally efficient to write into output file.
+ FOR a = 1 TO 20
+ iwaveData$ = iwaveData$ + CHR$(iwaveArray(a))
+ NEXT a
+
+ ' Convert owaveArray to string
+ FOR a = 1 TO 40
+ owaveData$ = owaveData$ + CHR$(owaveArray(a))
+ NEXT a
+
+END SUB
--- /dev/null
+' Utility that decodes text message from 8 bit audio recording.
+'
+' This program is free software: released under Creative Commons Zero (CC0) license
+' by Svjatoslav Agejenko.
+' Email: svjatoslav@svjatoslav.eu
+' Homepage: http://www.svjatoslav.eu
+'
+' Changelog:
+' 2001, Initial version
+' 2024 - 2025, Improved program readability
+'
+' Data is encoded in the audio by using frequency modulation.
+' When decoding data, program locates peaks between waveforms.
+' Then it calculates distance between peaks.
+' Long between peak distance is interpreted as 0 bit, short distance is 1 bit.
+' Bits 0 and 1 are then sequentially added into bytes and complete
+' message is decoded and shown on the screen. In addition, message is written out to
+' the file.
+'
+' Frequency modulation was chosen over amplitude modulation because
+' my tests with cassette tape recorder showed that distortions affect mostly
+' signal amplitude, but do not affect signal frequency that much.
+'
+' Data carrying audio is preceded with special header tone. Program detects header tone
+' and uses it to calculate baseline signal frequency that it will use later to decode bits.
+' Also header allows to mark precise data starting point.
+
+DEFINT A-Y
+DECLARE SUB bysf (a$, d)
+DECLARE SUB messa (a$)
+DECLARE SUB pfo (f, t, it)
+DECLARE SUB anal ()
+DECLARE SUB start ()
+DECLARE SUB iadd ()
+DECLARE SUB oadd ()
+DECLARE SUB byt (a)
+
+DIM SHARED file1$
+DIM SHARED file2$
+
+' Contains the actual audio waveform samples
+DIM SHARED audioBuffer(-100 TO 10000)
+DIM SHARED bus AS STRING * 1000
+DIM SHARED bufi
+DIM SHARED bg
+DIM SHARED sm
+DIM SHARED beg
+DIM SHARED wai
+DIM SHARED old2
+
+' Statistical Analysis Array (contains measured peak distances)
+DIM SHARED statisticalArray(1 TO 10)
+DIM SHARED statl
+DIM SHARED aver
+DIM SHARED byte AS STRING * 1
+DIM SHARED avv
+
+DIM SHARED li
+DIM SHARED oc
+DIM SHARED px
+
+start
+messa "Searching for beginning..."
+
+OPEN "output.txt" FOR BINARY AS #1
+OPEN "sound.xi" FOR BINARY AS #2
+SEEK #2, 360
+
+2
+GET #2, , bus
+FOR a = 1 TO 1000
+ b$ = RIGHT$(LEFT$(bus, a), 1)
+ bufi = bufi + 1
+ c = ASC(b$)
+ IF c > 127 THEN c = c - 255
+ audioBuffer(bufi) = c
+NEXT a
+IF (EOF(2) = 0) AND (bufi < 8000) THEN GOTO 2
+anal
+IF EOF(2) = 0 THEN GOTO 2
+
+CLOSE #2
+CLOSE #1
+
+SYSTEM
+
+SUB anal
+ ' Draw a vertical line to represent the buffer data
+ LINE (1, 170)-(200, 430), 0, BF
+
+ FOR a = 1 TO bufi - (avv - 1)
+ ' Draw horizontal lines at key points
+ LINE (100, 170)-(100, 430), 13
+ LINE (old2 - a + 100, 170)-(old2 - a + 100, 430), 11
+ LINE (0, 300)-(200, 300), 13
+
+ ' Plot the buffer data points
+ FOR b = 0 TO 200
+ PSET (b, audioBuffer(b + a - 101) + 300), 0
+ PSET (b, audioBuffer(b + a - 100) + 300), 14
+ NEXT b
+
+ LINE (old2 - a + 100, 170)-(old2 - a + 100, 430), 0
+
+ ' Calculate the average value of the buffer segment
+ c = 0
+ FOR b = a TO a + (avv - 1)
+ c = c + audioBuffer(b)
+ NEXT b
+ c = c / (avv / 2)
+
+ ' Determine if we are in a high or low state
+ IF c > oc THEN
+ IF li = -1 THEN
+ li = 1
+ pfo a + ((avv - 1) / 2 - 1), 1, oc
+ GOTO 3
+ END IF
+ END IF
+
+ IF c < oc THEN
+ IF li = 1 THEN
+ li = -1
+ pfo a + ((avv - 1) / 2 - 1), 2, oc
+ GOTO 3
+ END IF
+ END IF
+
+ 3
+ ' Update the current average value
+ oc = c
+ NEXT a
+
+ ' Shift the buffer data to the left
+ FOR a = bufi - (avv - 2) TO bufi
+ audioBuffer(a - (bufi - (avv - 2)) + 1) = audioBuffer(a)
+ NEXT a
+
+ ' Update the starting index of the buffer
+ old2 = old2 - (bufi - (avv - 2)) + 1
+ bufi = avv - 1
+
+END SUB
+
+SUB bysf (a$, d)
+ ' Draw a horizontal line to represent the byte data
+ LINE (201, 170)-(639, 430), 1, B
+
+ IF d = 10 THEN px = 0: a$ = "": GOTO 5
+
+ px = px + 1
+ IF px > 53 THEN
+ px = 1
+ 5
+ DIM tempr(1 TO 32000)
+ GET (201, 186)-(639, 430), tempr(1)
+ PUT (201, 170), tempr(1), PSET
+ LINE (201, 414)-(639, 430), 0, BF
+ END IF
+
+ ' Print the byte data to the screen
+ LOCATE 26, 26 + px
+ PRINT a$
+
+ ' Convert the byte value to a character and write it to the output file
+ byte = CHR$(d)
+ PUT #1, , byte
+
+END SUB
+
+SUB byt (a)
+
+ ' Draw a horizontal line to represent the bit data
+ LINE (410, 0)-(639, 169), 1, B
+
+ statl = statl + 1
+ IF statl > 8 THEN
+ statl = 1
+ b = 0
+ IF statisticalArray(1) = 1 THEN b = b + 128
+ IF statisticalArray(2) = 1 THEN b = b + 64
+ IF statisticalArray(3) = 1 THEN b = b + 32
+ IF statisticalArray(4) = 1 THEN b = b + 16
+ IF statisticalArray(5) = 1 THEN b = b + 8
+ IF statisticalArray(6) = 1 THEN b = b + 4
+ IF statisticalArray(7) = 1 THEN b = b + 2
+ IF statisticalArray(8) = 1 THEN b = b + 1
+
+ ' Print the byte value to the screen
+ LOCATE 10, 69
+ PRINT b
+
+ ' Print the hexadecimal representation of the byte value
+ LOCATE 10, 75
+ PRINT HEX$(b)
+
+ ' Print the character representation of the byte value
+ LOCATE 10, 79
+ c$ = CHR$(b)
+
+ ' Replace control characters with a space
+ IF b = 7 OR b = 8 OR b = 10 OR b = 12 OR b = 13 THEN c$ = " "
+
+ PRINT c$
+
+ bysf c$, b
+
+ DIM tempr(1 TO 10000)
+ GET (410, 16)-(639, 169), tempr(1)
+ PUT (410, 0), tempr(1), PSET
+ LINE (410, 153)-(639, 169), 0, BF
+ END IF
+
+ ' Print the bit value to the screen
+ LOCATE 10, 50 + (statl * 2)
+
+ statisticalArray(statl) = a
+
+ PRINT a
+
+END SUB
+
+SUB messa (a$)
+ ' Draw a horizontal line to represent the message data
+ LINE (0, 0)-(409, 169), 1, B
+
+ DIM tempr(1 TO 20000)
+
+ GET (0, 16)-(409, 169), tempr(1)
+
+ PUT (0, 0), tempr(1), PSET
+
+ LINE (0, 153)-(409, 169), 0, BF
+
+ ' Print the message to the screen
+ LOCATE 10, 1
+
+ PRINT a$
+
+END SUB
+
+SUB pfo (f, t, it)
+ IF t = 2 THEN
+ bg = it
+
+ IF wai > 0 THEN wai = wai - 1
+
+ ' Check if we have found data start header
+ IF (bg - sm > 6) AND (beg = 0) THEN
+ beg = 1
+ wai = 10
+ messa "Beginning point found!"
+ END IF
+
+ ' Perform statistical analysis if needed
+ IF (wai = 0) AND (beg = 1) THEN
+ IF statl = 0 THEN messa "Beginning statistical analyze"
+
+ statl = statl + 1
+
+ IF statl > 10 THEN
+ FOR a = 1 TO 10
+ aver = aver + statisticalArray(a)
+ NEXT a
+
+ aver = aver * 1.5 / 10
+
+ beg = 2
+
+ statl = 1
+
+ messa "Statistical analyze completed!"
+ END IF
+
+ ' Store the current frame index
+ statisticalArray(statl) = f - old2
+ END IF
+
+ ' Decode the bits if we are in the decoding state
+ IF beg = 2 THEN
+ IF f - old2 >= aver THEN
+ beg = 3
+
+ statl = 0
+
+ FOR a = 1 TO 8
+ statisticalArray(a) = 0
+ NEXT a
+
+ GOTO 4
+ END IF
+ END IF
+
+ ' Decode the bits based on the current state
+ IF beg = 3 THEN
+ IF f - old2 >= aver THEN
+ byt 0
+ ELSE
+ byt 1
+ END IF
+ END IF
+
+ 4
+
+ old2 = f
+ ELSE
+ sm = it
+ END IF
+END SUB
+
+SUB start
+
+ ' Set the screen mode to graphics
+ SCREEN 12
+
+ ' Initialize buffer index and other variables
+ bufi = 0
+
+ beg = 0
+
+ statl = 0
+
+ aver = 0
+
+ px = 0
+
+ avv = 7
+
+ li = 1
+
+ oc = -9999
+
+END SUB
\ No newline at end of file
export_org_to_html "Miscellaneous/Mouse driver"
+export_org_to_html "Networking/Digital data over analog audio"
# Upload project homepage to the server.
rsync -avz --delete -e 'ssh -p 10006' ./ \
#+SETUPFILE: ~/.emacs.d/org-styles/html/darksun.theme
-#+TITLE: BASIC applications collection
+#+TITLE: BASIC applications collection
#+LANGUAGE: en
#+LATEX_HEADER: \usepackage[margin=1.0in]{geometry}
#+LATEX_HEADER: \usepackage{parskip}
</div>
#+end_export
-[[file:Math/Game%20of%20life%20in%203D.bas][Source code]]
+Download source code: [[file:Math/Game%20of%20life%20in%203D.bas][Source code]]
** Game of life studio
Download source code: [[file:Miscellaneous/Password%20lock/passw.bas][passw.bas]]
-
* Networking
-
** LPT port pin control
This QBasic program is designed to control the voltage on individual
Download source code: [[file:Networking/LPT%20pin%20control.bas][LPT pin control.bas]]
+** Data over analog audio CODEC
+
+Utilities to encode digital data to sound file and back.
+
+#+attr_html: :class responsive-img
+#+attr_latex: :width 1000px
+[[file:Networking/Digital%20data%20over%20analog%20audio/index.html][file:Networking/Digital%20data%20over%20analog%20audio/screenshot.png]]
+
+[[file:Networking/Digital%20data%20over%20analog%20audio/index.html][Read more]]
+
+
** Morse
This QBasic program allows users to input text and hear it played back