Update 2012/deckmyn - try.sh, bugs.md, formatting

The try.sh script is as usual.

The bugs.md has some features, not bugs.

The README.md file has been format/typo checked.

The deckmyn.md file has been format/typo checked.

A caveat with this entry is I was not able to verify as much when it
comes to checking things as I do not have a musical background (despite
the fact my family is full of musicians).
This commit is contained in:
Cody Boone Ferguson committed 2023-11-30 10:02:03 -08:00
1 parent c626cd7321
commit 54cfecae4f
6 files changed
+150 -24

No files matched your search

+2
View File
@@ -1,3 +1,5 @@
beethoven.pbm
blank.pbm
deckmyn
example_greensleeves
greensleeves.pbm
+53 -17
View File
@@ -5,19 +5,28 @@ make
```
### Bugs and (Mis)features:
The current status of this entry is:
```
STATUS: INABIAF - please **DO NOT** fix
```
For more detailed information see [2012 deckmyn in bugs.md](/bugs.md#2012-deckmyn).
## To use:
A shell interpreter with proper backtick interpolation is required.
```sh
./deckmyn "`cat deckmyn.c`" "`cat musicfile.txt`" > sheetmusic.pbm
./deckmyn "$(cat deckmyn.c)" "$(cat musicfile.txt)" > sheetmusic.pbm
```
### Try:
```sh
./deckmyn "`cat deckmyn.c`" "`cat example_greensleeves`" > greensleeves.pbm
./try.sh
```
@@ -26,15 +35,21 @@ A shell interpreter with proper backtick interpolation is required.
The C of this entry is definitely sharp. The program cleverly uses its own
source at runtime to define the notes, time signature and accidental bitmaps.
In addition to sheet music, this program is also able, given the right input,
to generate an image of a 10-pin [DIP
In addition to sheet music, this program is also able to, given the right input,
generate an image of a 10-pin [DIP
chip](https://en.wikipedia.org/wiki/Dual_in-line_package) (a sound processor?).
Ironically, the way this entry is called from the command line is an abuse of [C
Shell](https://en.wikipedia.org/wiki/C_shell).
### Historical remarks:
We previously wrote that ironically, the way this entry is called from the
command line is an abuse of [C Shell](https://en.wikipedia.org/wiki/C_shell).
Please use [Bourne-family shells](https://en.wikipedia.org/wiki/Bourne_shell) to
run this entry.
... but in 2023 we changed the backticks to be the bash `$(..)` construct. This
is not done in the author's remarks, however.
## Author's remarks:
@@ -42,18 +57,36 @@ run this entry.
You need the source code and example input (either one of the example files, or
manual input as below) ready and a program capable of showing [.pbm bitmap
format](https://en.wikipedia.org/wiki/Netpbm).
format](https://en.wikipedia.org/wiki/Netpbm) images.
```sh
./deckmyn "`cat deckmyn.c`" "`cat example_greensleeves`" > greensleeves.pbm
```
If you have macOS you can open the image like:
```sh
open greensleeves.pbm
```
... otherwise, you'll have to open it in your viewer of choice how you would
normally open an image.
```sh
./deckmyn "`cat deckmyn.c`" "KF m44c4 c4 g4 g4 : a4 a4 g2 :; " > short_bass.pbm
```
If you have macOS you can open the image like:
```sh
open short_bass.pbm
```
... otherwise, you'll have to open it in your viewer of choice how you would
normally open an image.
### Description
Every major C competition should have an entry capable of producing C major.
@@ -70,7 +103,7 @@ The program expects *two command line arguments*. The first is a (very long)
string that contains the complete music font. Note that it should *not* be given
as a file name! The default music font is encoded in the (whitespace of the)
source code [deckmyn.c](deckmyn.c) itself. Therefore, the first argument should
be `"cat deckmyn.c"`.
be `"`` ` ``cat deckmyn.c`` ` ``"`.
The second command line argument is the music itself. This is, again, a string,
not a file name. All music signs are entered as tokens of exactly 3 characters.
@@ -78,21 +111,23 @@ The code is very sensitive to bad spacing! So for instance, if you use a file to
write the music (e.g. [example\_greensleeves](example_greensleeves)), you should
keep in mind that newline is also a character!
### Internals
To minimise the memory footprint, this program has *no variable declarations at
all*, except for the arguments to `main()`. The only available memory space is
from the command line arguments and count (`argv` and `argc`). Parts of `argv`
are cast as integer when values under 0 or beyond 127 are expected.
are cast as `int` when values under 0 or beyond 127 are expected.
The "music font" is defined by the source code itself. The first few lines are
not part of the font definition, as this memory space will modified by the
not part of the font definition, as this memory space will be modified by the
program. (So as required by the rules, it is only a (memory) copy of the source
code that is modified.)
As there is no memory available, output is directly to stdout, byte by byte,
As there is no memory available, output is directly to `stdout`, byte by byte,
from the top left to the bottom right pixel.
### LIMITATIONS
The memory locations of `argv` are used for various purposes. Therefore, the
@@ -107,17 +142,18 @@ only error checking available. Any input that is not according to the rules in
the [manual](deckmyn.md), may cause errors.
The program has no special hardware limitations or requirements, other than 8bit
char (signed or unsigned) and two's complement negatives.
`char` (`signed` or `unsigned`) and two's complement negatives.
The limitations of using char as counters for e.g. the number of music staves
The limitations of using `char` as counters for e.g. the number of music staves
are minor. 127 staves to a page is rather a lot.
### Obfuscations
The code has no declared variables other than the command line variables. Not
even pointers (we all know how messy code can get with too many pointers!). As
more than one variable needs values beyond 127, parts of the command line memory
are cast as integer using a macro.
are cast to `int` using a macro.
- The formatting of the code is in fact necessary, as this is the definition of
the music font. It is therefore not an obfuscation.
@@ -133,7 +169,7 @@ by replacing some numbers by a character representation. On average, therefore,
it is not an obfuscation.
- Randomly changing the way the elements of `argv` are addressed is a matter of
maintaining a diversified code base. It is therefore not... Oh all right.
- The actual output of the music is done by one print command including a 800+
- The actual output of the music is done by one `printf(3)` call including a 800+
character nested conditional expression.
- `printf()` is also used for its return value.
+9 -7
View File
@@ -1,5 +1,6 @@
# USER MANUAL
## Calling the program
```sh
@@ -31,14 +32,14 @@ Therefore, when preparing music in a file, care should be taken that the last
musical element of a line is only 2 characters!
1. Basic notes:
A single note is input by a letter `[A-Ga-g]` followed by a duration
[1,2,4,8] and possibly a dot [`.`]. The notes cover 2 octaves, from `C`
(lowest) to `b` (highest). The possible durations are 1 (whole note), 2
(half note), 4 (quaver), 8 (semi-quaver). So a dotted quaver `A` followed by
a semi quaver `G` is input as `"A4.G8 "`.
A single note is input by a letter (in the range `[A-Ga-g]`) followed by a
duration (1, 2, 4 or 8) and possibly a dot (`.`). The notes cover 2 octaves,
from `C` (lowest) to `b` (highest). The possible durations are 1 (whole
note), 2 (half note), 4 (quaver), 8 (semi-quaver). So a dotted quaver `A`
followed by a semi quaver `G` is input as `"A4.G8 "`.
2. Rests:
A rest is given by the letter [`r`] followed by a duration [1,2,4,8].
A rest is given by the letter `r` followed by a duration (1, 2, 4 or 8).
3. Bar lines:
There are three possible bar line types: single (`": "`), double (`":: "`)
@@ -54,7 +55,7 @@ musical element of a line is only 2 characters!
5. Space (formatting):
To manually change the spacing of the music, you can add space between
different musical elements. This is given by a `[s]` followed by the amount
different musical elements. This is given by an `s` followed by the amount
of space. `"s3 "` is the space taken by one note. This length is given in 1
character. However, to get a value larger than 9, you can just continue
along the ASCII table. So `"sz "` gives you quite a lot of space on a staff.
@@ -79,6 +80,7 @@ musical element of a line is only 2 characters!
input. If the music starts with `"KF "`, the music will be written in a bass
clef. `"K"` followed by any other letter will just default to a standard G clef.
## Examples
Blank music paper (with G clef):
+40
View File
@@ -0,0 +1,40 @@
#!/usr/bin/env bash
#
# try.sh - demonstrate IOCCC winner 2012/deckmyn
#
# make sure CC is set so that when we do make CC="$CC" it isn't empty. Doing it
# this way allows us to have the user specify a different compiler in an easy
# way.
if [[ -z "$CC" ]]; then
CC="cc"
fi
make CC="$CC" all >/dev/null || exit 1
# clear screen after compilation so that only the entry is shown
clear
read -r -n 1 -p "Press any key to run deckmyn.c through less (space = next page, q = quit): "
echo 1>&2
less deckmyn.c
echo 1>&2
echo "$ ./deckmyn "\$\(cat deckmyn.c\)" "\$\(cat example_greensleeves\)" 2>/dev/null > greensleeves.pbm" 1>&2
./deckmyn "$(cat deckmyn.c)" "$(cat example_greensleeves)" 2>/dev/null > greensleeves.pbm
echo 1>&2
echo "Now open greensleeves.pbm in your image viewer of choice." 1>&2
echo 1>&2
echo "$ ./deckmyn "\$\(cat deckmyn.c\)" "\$\(cat example_beethoven\)" 2>/dev/null > beethoven.pbm" 1>&2
read -r -n 1 -p "Press any key to continue: "
echo 1>&2
./deckmyn "$(cat deckmyn.c)" "$(cat example_beethoven)" 2>/dev/null > beethoven.pbm
echo "Now open beethoven.pbm in your image viewer of choice." 1>&2
echo 1>&2
echo "$ ./deckmyn "\$\(cat deckmyn.c\)" \"sz sa x s1 x s1 x s1 x s1 x s1 \" 2>/dev/null > blank.pbm" 1>&2
read -r -n 1 -p "Press any key to continue: "
echo 1>&2
./deckmyn "$(cat deckmyn.c)" "sz sa x s1 x s1 x s1 x s1 x s1 " 2>/dev/null > blank.pbm
echo "Now open blank.pbm in your image viewer of choice." 1>&2
+41
View File
@@ -2728,6 +2728,47 @@ fire](https://en.wikipedia.org/wiki/Halt_and_Catch_Fire_(computing)) :-)
# 2012
## 2012 deckmyn
### STATUS: INABIAF - please **DO NOT** fix
### Source code: [2012/deckmyn/deckmyn.c](2012/deckmyn/deckmyn.c)
### Information: [2012/deckmyn/README.md](2012/deckmyn/README.md)
The author stated:
```
The memory locations of `argv` are used for various purposes. Therefore, the
program name (default `deckmyn`) must be *at least 4 characters long*, including
possibly the path. This, along with the ending `'\0'`, gives a minimum 5 bytes of
useful memory space. Otherwise, the program may attempt to write outside the
string.
The code is quite sensitive. Errors in the input can lead to strange results.
The code does not read beyond the end of the music input, but that is about the
only error checking available. Any input that is not according to the rules in
the deckmyn.md, may cause errors.
The program has no special hardware limitations or requirements, other than 8bit
`char` (`signed` or `unsigned`) and two's complement negatives.
The limitations of using `char` as counters for e.g. the number of music staves
are minor. 127 staves to a page is rather a lot.
The file layout must be exactly the same as deckmyn.c though, only the locations
of space (`" "`) may differ.
Every element in the music is given by a string of *exactly* 3 characters. Any
violation of this will result in the rest of the music being interpreted in some
randomly wrong way. Notice that in a file, the newline is also a character!
Therefore, when preparing music in a file, care should be taken that the last
musical element of a line is only 2 characters!
```
The manual referred to is [here](2012/deckmyn/deckmyn.md).
## 2012 vik
### STATUS: INABIAF - please **DO NOT** fix
+5
View File
@@ -3327,6 +3327,11 @@ Cody added explicit linking of libm (`-lm`) as not all systems do this
implicitly (linux doesn't seem to but macOS does).
## [2012/deckmyn](2012/deckmyn/deckmyn.c) ([README.md](2012/deckmyn/README.md]))
Cody added the [try.sh](2012/deckmyn/try.sh) script.
## [2012/endoh1](2012/endoh1/endoh1.c) ([README.md](2012/endoh1/README.md))
Cody added explicit linking of libm (`-lm`) as not all systems do this