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:
1 parent
c626cd7321
commit
54cfecae4f
6 files changed
+150
-24
No files matched your search
@@ -1,3 +1,5 @@
|
|||||||
|
beethoven.pbm
|
||||||
|
blank.pbm
|
||||||
deckmyn
|
deckmyn
|
||||||
example_greensleeves
|
example_greensleeves
|
||||||
greensleeves.pbm
|
greensleeves.pbm
|
||||||
|
|||||||
+53
-17
@@ -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:
|
## To use:
|
||||||
|
|
||||||
A shell interpreter with proper backtick interpolation is required.
|
|
||||||
|
|
||||||
```sh
|
```sh
|
||||||
./deckmyn "`cat deckmyn.c`" "`cat musicfile.txt`" > sheetmusic.pbm
|
./deckmyn "$(cat deckmyn.c)" "$(cat musicfile.txt)" > sheetmusic.pbm
|
||||||
```
|
```
|
||||||
|
|
||||||
|
|
||||||
### Try:
|
### Try:
|
||||||
|
|
||||||
```sh
|
```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
|
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.
|
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,
|
In addition to sheet music, this program is also able to, given the right input,
|
||||||
to generate an image of a 10-pin [DIP
|
generate an image of a 10-pin [DIP
|
||||||
chip](https://en.wikipedia.org/wiki/Dual_in-line_package) (a sound processor?).
|
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
|
Please use [Bourne-family shells](https://en.wikipedia.org/wiki/Bourne_shell) to
|
||||||
run this entry.
|
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:
|
## 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
|
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
|
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
|
```sh
|
||||||
./deckmyn "`cat deckmyn.c`" "`cat example_greensleeves`" > greensleeves.pbm
|
./deckmyn "`cat deckmyn.c`" "`cat example_greensleeves`" > greensleeves.pbm
|
||||||
|
```
|
||||||
|
|
||||||
|
If you have macOS you can open the image like:
|
||||||
|
|
||||||
|
```sh
|
||||||
open greensleeves.pbm
|
open greensleeves.pbm
|
||||||
```
|
```
|
||||||
|
|
||||||
|
... otherwise, you'll have to open it in your viewer of choice how you would
|
||||||
|
normally open an image.
|
||||||
|
|
||||||
|
|
||||||
```sh
|
```sh
|
||||||
./deckmyn "`cat deckmyn.c`" "KF m44c4 c4 g4 g4 : a4 a4 g2 :; " > short_bass.pbm
|
./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
|
open short_bass.pbm
|
||||||
```
|
```
|
||||||
|
|
||||||
|
... otherwise, you'll have to open it in your viewer of choice how you would
|
||||||
|
normally open an image.
|
||||||
|
|
||||||
|
|
||||||
### Description
|
### Description
|
||||||
|
|
||||||
Every major C competition should have an entry capable of producing C major.
|
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
|
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)
|
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
|
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,
|
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.
|
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
|
write the music (e.g. [example\_greensleeves](example_greensleeves)), you should
|
||||||
keep in mind that newline is also a character!
|
keep in mind that newline is also a character!
|
||||||
|
|
||||||
|
|
||||||
### Internals
|
### Internals
|
||||||
|
|
||||||
To minimise the memory footprint, this program has *no variable declarations at
|
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
|
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`
|
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
|
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
|
program. (So as required by the rules, it is only a (memory) copy of the source
|
||||||
code that is modified.)
|
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.
|
from the top left to the bottom right pixel.
|
||||||
|
|
||||||
|
|
||||||
### LIMITATIONS
|
### LIMITATIONS
|
||||||
|
|
||||||
The memory locations of `argv` are used for various purposes. Therefore, the
|
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 [manual](deckmyn.md), may cause errors.
|
||||||
|
|
||||||
The program has no special hardware limitations or requirements, other than 8bit
|
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.
|
are minor. 127 staves to a page is rather a lot.
|
||||||
|
|
||||||
|
|
||||||
### Obfuscations
|
### Obfuscations
|
||||||
|
|
||||||
The code has no declared variables other than the command line variables. Not
|
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
|
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
|
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 formatting of the code is in fact necessary, as this is the definition of
|
||||||
the music font. It is therefore not an obfuscation.
|
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.
|
it is not an obfuscation.
|
||||||
- Randomly changing the way the elements of `argv` are addressed is a matter of
|
- 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.
|
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.
|
character nested conditional expression.
|
||||||
- `printf()` is also used for its return value.
|
- `printf()` is also used for its return value.
|
||||||
|
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
# USER MANUAL
|
# USER MANUAL
|
||||||
|
|
||||||
|
|
||||||
## Calling the program
|
## Calling the program
|
||||||
|
|
||||||
```sh
|
```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!
|
musical element of a line is only 2 characters!
|
||||||
|
|
||||||
1. Basic notes:
|
1. Basic notes:
|
||||||
A single note is input by a letter `[A-Ga-g]` followed by a duration
|
A single note is input by a letter (in the range `[A-Ga-g]`) followed by a
|
||||||
[1,2,4,8] and possibly a dot [`.`]. The notes cover 2 octaves, from `C`
|
duration (1, 2, 4 or 8) and possibly a dot (`.`). The notes cover 2 octaves,
|
||||||
(lowest) to `b` (highest). The possible durations are 1 (whole note), 2
|
from `C` (lowest) to `b` (highest). The possible durations are 1 (whole
|
||||||
(half note), 4 (quaver), 8 (semi-quaver). So a dotted quaver `A` followed by
|
note), 2 (half note), 4 (quaver), 8 (semi-quaver). So a dotted quaver `A`
|
||||||
a semi quaver `G` is input as `"A4.G8 "`.
|
followed by a semi quaver `G` is input as `"A4.G8 "`.
|
||||||
|
|
||||||
2. Rests:
|
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:
|
3. Bar lines:
|
||||||
There are three possible bar line types: single (`": "`), double (`":: "`)
|
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):
|
5. Space (formatting):
|
||||||
To manually change the spacing of the music, you can add space between
|
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
|
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
|
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.
|
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
|
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.
|
clef. `"K"` followed by any other letter will just default to a standard G clef.
|
||||||
|
|
||||||
|
|
||||||
## Examples
|
## Examples
|
||||||
|
|
||||||
Blank music paper (with G clef):
|
Blank music paper (with G clef):
|
||||||
|
|||||||
Executable
+40
@@ -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
|
||||||
|
|
||||||
@@ -2728,6 +2728,47 @@ fire](https://en.wikipedia.org/wiki/Halt_and_Catch_Fire_(computing)) :-)
|
|||||||
# 2012
|
# 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
|
## 2012 vik
|
||||||
|
|
||||||
### STATUS: INABIAF - please **DO NOT** fix
|
### STATUS: INABIAF - please **DO NOT** fix
|
||||||
|
|||||||
@@ -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).
|
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))
|
## [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
|
Cody added explicit linking of libm (`-lm`) as not all systems do this
|
||||||
|
|||||||
Reference in new issue
Block a user