Cholc
Cholc is an esoteric programming language made up of sequences of musical chords.
Examples
Hello world
A A A A A A A A A |: F G E Am :| F Fm |: C C C C C C C C A A A B Em :| C Cm X |: Db Eb Eb Eb Eb Eb C C C Fm :| C C X |: C C#m :| Cm Cm X X C C C X Ebm X D Dm A A A A A X |: F G Cm :| Gm X F Fm X F F F X Gm Gm D F# Bm |: Gm D F# Bm :| Gm X |: Gm Dm :| G X A X
output:
Hello, world!
Count up from 1 to 30
F F F F F F F F |: C C C C C C Fm :| Dm Dm Dm Dm Dm Dm Dm Dm Dm |: Ab Bb G Cm :| Am Am Am |: |: G Gm X F Bb X D :| G X |: Bbm Dm Fm :| Bb Bbm X A :|
output:
010203040506070809101112131415161718192021222324252627282930
Specification
Operators
Operators in Cholc are similar to Brainfuck. They move a pointer, and increment/decrement its value.
Operator | Role |
---|---|
{major chord} |
increment the value referred by the pointer |
{minor chord} |
decrement the value referred by the pointer |
|: |
jump right after to the corresponding :| if the value referred by the pointer is 0
|
:| |
jump right after to the corresponding |: if the value referred by the pointer is not 0
|
v |
read 1 byte from an input and write to the pointer |
X |
write the value referred by the pointer to an output |
Only triad major/minor chords can be used as operators. Other chords such as 7th or sus4 cannot be used. A hash #
and an alphabet b
is used as a sharp and flat symbol respectively. Here is an example of chord operations.
C Cm F# Bbm // Any enharmonic equivalents can be used A#m
Moving pointer
Moving pointer in Cholc is defined by chord progressions. The movement of the pointer depends on the interval between the two chords in a row.
Progression | Interval | Example | Pointer movement |
---|---|---|---|
weak progression | 7 semitones (perfect 5th) | C G |
1
|
strong progression | 5 semitones (perfect 4th) | G C |
-1
|
Any pair of chords moves the pointer and its movement is "how many times to add perfect fifth".
Here are the rules of the movement.
- major/minor does not affect to the pointer movement
- if
movement > 5
, subtract12
(treated as negative movement)
Example:
Chords | Pointer movement |
---|---|
C C |
0
|
C G |
+1
|
C D |
+2
|
C B |
+5
|
C Gb |
-6
|
C F |
-1
|
F Bb |
-1
|
F G |
+2
|
C Fm |
-1
|
C Cm |
0
|
Order of pointer movement
The pointer movement occurs between two chord operations.
For example, C G
is evaluated in this order.
At first, all memory is filled with 0 and the pointer refers address 0
.
Address | 0 | 1 |
---|---|---|
pointer | here | |
value | 0 |
0
|
Chord C is evaluated and the value is incremented.
Address | 0 | 1 |
---|---|---|
pointer | here | |
value | 1 |
0
|
Chord progression C G
is evaluated and the pointer is moved to address 1
.
Address | 0 | 1 |
---|---|---|
pointer | here | |
value | 1 |
0
|
Finally chord G
is evaluated and the value is incremented.
Address | 0 | 1 |
---|---|---|
pointer | here | |
value | 1 |
1
|
Turing completeness
Cholc is turing complete. Any Brainfuck source code can be converted to a Cholc source code by the covertion table below.
Brainfuck | Cholc |
---|---|
+ |
C
|
- |
Cm
|
> |
C Cm E Em Ab Abm C Cm
|
< |
C Cm Ab Abm E Em C Cm
|
[ |
|:
|
] |
:|
|
, |
v
|
. |
X
|
External resources
- Implementation: an implementation and online playground written in TypeScript
- Playground: an online playground where the sound of the chord can be played during the evaluation