Browse Source

did stuff

main
Annwan 3 months ago
parent
commit
375bfeddf3
  1. 19
      .gitignore
  2. 3
      .gitmodules
  3. 3
      Makefile
  4. 165
      grammar/main.tex
  5. 10
      pres/Makefile
  6. 1
      pres/nguhslides
  7. 410
      pres/script.org
  8. 300
      pres/slides.tex
  9. BIN
      tools/0.wav
  10. BIN
      tools/1.wav
  11. BIN
      tools/2.wav
  12. BIN
      tools/3.wav
  13. BIN
      tools/4.wav
  14. BIN
      tools/5.wav
  15. BIN
      tools/6.wav
  16. BIN
      tools/7.wav
  17. BIN
      tools/8.wav
  18. BIN
      tools/9.wav
  19. BIN
      tools/A.wav
  20. BIN
      tools/B.wav
  21. BIN
      tools/C.wav
  22. BIN
      tools/D.wav
  23. BIN
      tools/Octothorpe.wav
  24. BIN
      tools/Star.wav
  25. 14
      tools/ppn2seq/src/Ppn2Seq.hs
  26. 55
      tools/seqtoaudio
  27. BIN
      tools/skip.wav
  28. 40
      tools/sounder/sounder.sc
  29. 1
      tools/sounder/text.txt

19
.gitignore

@ -1,21 +1,6 @@
# seq2audio output # seq2audio output
tools/*.wav
tools/*.filelist
# except the input files
!tools/1.wav
!tools/2.wav
!tools/3.wav
!tools/4.wav
!tools/5.wav
!tools/6.wav
!tools/7.wav
!tools/8.wav
!tools/9.wav
!tools/0.wav
!tools/Star.wav
!tools/Octothorpe.wav
!tools/skip.wav
tools/sounder/*.wav
tools/sounder/*.filelist
# TeX output # TeX output
*.aux *.aux

3
.gitmodules

@ -1,3 +1,6 @@
[submodule "grammar/nguhslides"] [submodule "grammar/nguhslides"]
path = grammar/nguhslides path = grammar/nguhslides
url = git@github.com:Agma-Schwa/nguhslides.git url = git@github.com:Agma-Schwa/nguhslides.git
[submodule "pres/nguhslides"]
path = pres/nguhslides
url = git@github.com:Agma-Schwa/nguhslides.git

3
Makefile

@ -1,6 +1,9 @@
all: all:
@$(MAKE) -C grammar all @$(MAKE) -C grammar all
@$(MAKE) -C pres all
clean: clean:
@$(MAKE) -C grammar clean @$(MAKE) -C grammar clean
@$(MAKE) -C pres clean
deepclean: deepclean:
@$(MAKE) -C grammar deepclean @$(MAKE) -C grammar deepclean
@$(MAKE) -C pres deepclean

165
grammar/main.tex

@ -213,9 +213,10 @@ of up to 18 digits.
\section{Sample Texts} \section{Sample Texts}
These text samples do not contain the control flow communications. The
corresponding audio samples are as if said by a speaker at adress 42069
(decimal) broadcasting to the network.
These text samples are as if said by a speaker at +690 042\footnote{This number
is in an unused range in the Small pacific island of Tokelau} broadcasting to
the network. The gloss does not contain the sender, recipient, sequence number
and length information.
\begin{quote} \begin{quote}
Hark! It was ruled by Agamashuya and His son Gu Sabah: Tian practices against Hark! It was ruled by Agamashuya and His son Gu Sabah: Tian practices against
@ -224,62 +225,138 @@ of silence and restraint; for Ngu, a slave to creativity, shall make inspection
and certification prior to confirmation of Najva Guns’ official status. Deny and certification prior to confirmation of Najva Guns’ official status. Deny
thine humanity: There are no politics in real life. thine humanity: There are no politics in real life.
\end{quote} \end{quote}
\def\p#1#2#3#4{{\color{orange!20!gray}\#690042#2\color{black}#1\color{orange!20!gray}#3\color{black}#4}}
{ {
\catcode`#=12 \catcode`#=12
\MultiglossFormatFirst{\tt} \MultiglossFormatFirst{\tt}
\MultiglossFormatSecond{\sc} \MultiglossFormatSecond{\sc}
\begin{center}\begin{minipage}{0.5\textwidth}
\begin{verbatim}
#690042000*01B #690042002*01B #690042003*01B
#690042004*01B #690042005*01B #690042006*01B
#690042007*01B #690042008*011 #690042009*02A1
#690042010*010 #690042011A010 #690042012*01D
#690042013#32*44*#0#0#0#0#0#0#4#1*44*#0#0#0#0
#690042014132#0#0#6#7*44*#0#0#0#0#0#0#6#1*44*
#690042015132#0#0#0#0#0#0#6C4*44*#0#0#0#0#0#0
#690042016132#6#1*44*#0#0#0#0#0#0#7#3*44*#0#0
#690042017132#0#0#0#0#6#8*44*#0#0#0#0#0#0#7#5
#690042018120*44*#0#0#0#0#0#0#6#1 #690042019004D*05
#690042020*013 #690042021*01C #690042022A010
#690042023*01D
#690042024#32*44*#0#0#0#0#0#0#4#7*44*#0#0#0#0
#690042025132#0#0#7#5*44*#0#0#0#0#0#0#2#0*44*
#690042026132#0#0#0#0#0#0#5#3*44*#0#0#0#0#0#0
#690042027132#6#1*44*#0#0#0#0#0#0#6#2*44*#0#0
#690042028132#0#0#0#0#6#1*44*#0#0#0#0#0#0#6#8
#690042029016D*0551#0556C**0* #690042030000
#690042031003328 #690042032*013 #690042033*01D
#690042034#32*44*#0#0#0#0#0#0#5#4*44*#0#0#0#0
#690042035132#0#0#6#9*44*#0#0#0#0#0#0#6#1*44*
#690042036116#0#0#0#0#0#0#6C5 #690042037*011
#690042038*022A
#69004203903217025A*002A#C*C*B*534322C*161223
#690042040108#32325B# #69004204100535501
#6900420420135308485D*1972 #690042043*010
#690042044A011 #690042045*01D
#690042046#32*44*#0#0#0#0#0#0#4C5*44*#0#0#0#0
#690042047132#0#0#6#1*44*#0#0#0#0#0#0#6C1*44*
#690042048132#0#0#0#0#0#0#7#6*44*#0#0#0#0#0#0
#690042049132#6#1*44*#0#0#0#0#0#0#2#0*44*#0#0
#690042050132#0#0#0#0#4#7*44*#0#0#0#0#0#0#7#5
#690042051132*44*#0#0#0#0#0#0#6C5*44*#0#0#0#0
#690042052108#0#0#7#3 #69004205300511#62
#690042054*013 #690042055*01D
#690042056#32*44*#0#0#0#0#0#0#4C5*44*#0#0#0#0
#690042057128#0#0#6#7*44*#0#0#0#0#0#0#7#5
#690042058013326C*C*159954
#690042059032B*350726#34718B#C#311C*35073526C
#690042060117*C*34718C*C**1*C#
#6900420610041232 #690042062*013 #690042063*02A2
#690042064011177C*C**A2* #69004206500532325
#690042066*011 #690042067025B*32C*C*111823B#C*1612223
\end{verbatim}
\end{minipage}\end{center}
\multigloss { \multigloss {
*B | *B | *B
cnew | cnew | cnew
*B | *B | *B | *B| *B | *B | *B | *B
new clause | new clause | new clause | new clause | new clause | new clause | new clause
*1 | *A1 *1 | *A1
assert | 1sg
assert | 1
*0 | ##0 | *D | **0*44*#0#0#0#0#0#0 | *#0#4#1*44*#0#0#0#0 |
let | var[0] | ppn | \nf ``Agamashuya'' | cont
*0 | A0 | *D
let | var[0] | ppn
*#0#0#0#6#7*44*#0#0 | *#0#0#0#0#0#6#1*44* | *#0#0#0#0#0#0#0#6C4
cont | cont | cont
*#0*44*#0#0#0#0#0#0 | *#0#6#1*44*#0#0#0#0 | *#0#0#0#7#3*44*#0#0
cont | cont | cont
*#0#0#0#0#0#6#8*44* | *#0#0#0#0#0#0#0#7#5 | *#0*44*#0#0#0#0#0#0
cont | cont | cont
*#0#7#9*44*#0#0#0#0 | *#8#0#0#6#1 | BA05
cont | cont | \nf person
*3 | *C | ##0 | *D | **0*44*#0#0#0#0#0#0
trans | col | var[0] | ppn | \nf ``Gu Sabah''
#*44*#0#0#0#0#0#0#4#1*44*#0#0#0#0 | 1#0#0#6#7*44*#0#0#0#0#0#0#6#1*44*
lit-\nf“Agamashuya” | cont
*#0#4#7*44*#0#0#0#0 | *#0#0#0#7#5*44*#0#0 | *#0#0#0#0#0#2#0*44*
cont | cont | cont
*#0#0#0#0#0#0#0#5#3 | *#0*44*#0#0#0#0#0#0 | *#0#6#1*44*#0#0#0#0
cont | cont | cont
*#0#0#0#6#2*44*#0#0 | *#0#0#0#0#0#6#1*44* | *#0#0#0#0#0#0#0#6#8
cont | cont | cont
BA055*1B0BA055*6CB*0 | *#4B#B1 | * | 328
{\nf male child of} var[0] | cont | gnr | govern
1#0#0#0#0#0#0#6C4*44*#0#0#0#0#0#0 | 1#6#1*44*#0#0#0#0#0#0#7#3*44*#0#0
cont | cont
*3 | *D | **0*44*#0#0#0#0#0#0 | *#0#5#4*44*#0#0#0#0 | *#0#0#0#6#9*44*#0#0
trans | ppn | \nf``Tian'' | cont | cont
*#0#0#0#0#0#6#1*44* | *#0#0#0#0#0#0#0#6C5 | *1 | *2A | - | -
cont|cont|assert|ntrans|\nf prohibition::apearance::[silence+restraint]|\nf beset
1#0#0#0#0#6#8*44*#0#0#0#0#0#0#7#5 | 1*44*#0#0#0#0#0#0#6#1 | 0D*05
cont | cont | \nf person
- | -
\nf[side::lesser]::[origin::light]::invisible | \nf fight
*3 | *C | A0 | *D |
trans | col | var[0] | ppn
}
#*44*#0#0#0#0#0#0#4#7*44*#0#0#0#0 | 1#0#0#7#5*44*#0#0#0#0#0#0#2#0*44*
lit-\nf“Gu Sabah” | cont
1#0#0#0#0#0#0#5#3*44*#0#0#0#0#0#0 | 1#6#1*44*#0#0#0#0#0#0#6#2*44*#0#0
cont | cont
1#0#0#0#0#6#1*44*#0#0#0#0#0#0#6#8 | 0D*0551#0556C**0* | 0 | 0328
cont | {\nf male child of} var[0] | gnr | \nf govern
For Ngu, a slave to creativity, shall make inspection and certification prior to
confirmation of Nahva Guns’ official status.
*3 | *D | #*44*#0#0#0#0#0#0#5#4*44*#0#0#0#0
trans | ppn | lit-\nf“Tian”
Deny thine humanity.
1#0#0#6#9*44*#0#0#0#0#0#0#6#1*44* | 1#0#0#0#0#0#0#6C5 | *1 | *2A
cont | cont
017025A*002A#C*C*B*534322C*161223 | 1#32325B# | 035501
\nf prohibitions(cosmetic)::[noise:{\sc neg}+restraint] | cont | \nf fight
05308485D*1972 | 035501
\nf source of light-underside | \nf fight
*0 | A1 | *D
let | var[1] | ppn
#*44*#0#0#0#0#0#0#4C5*44*#0#0#0#0 | 1#0#0#6#1*44*#0#0#0#0#0#0#6C1*44*
lit-\nf“Najva Guns” | cont
1#0#0#0#0#0#0#7#6*44*#0#0#0#0#0#0 | 1#6#1*44*#0#0#0#0#0#0#2#0*44*#0#0
cont | cont
1#0#0#0#0#4#7*44*#0#0#0#0#0#0#7#5 | 1*44*#0#0#0#0#0#0#6C5*44*#0#0#0#0
cont | cont
1#0#0#7#3 | 011#62
cont | metaphisics+enginneering
*3 | *D | #*44*#0#0#0#0#0#0#4C5*44*#0#0#0#0
trans | ppn | lit-\nf“Ngu”
1#0#0#6#7*44*#0#0#0#0#0#0#7#5 | 0326C*C*159954
cont | slave::creativity
0B*350726#34718B#C#311C*35073526C | 1*C*34718C*C**1*C#
\nf [inspect+certify]“before:confirm::official::{\sc var[1]}” | cont
01232
need
*3 | *A2 | 0177C*C**A2* | 032325
trans | 2 | \nf humanity::{\sc pro 2} | deny
*1 | 0B*32C*C*111823B#C*1612223
assert | [politics::reality]:\sc NEG
}
There are no politics in real life There are no politics in real life

10
pres/Makefile

@ -0,0 +1,10 @@
.PHONY: all clean
all: slides.pdf
slides.pdf: slides.tex
latexmk -xelatex slides -interaction=nonstopmode
clean:
latexmk -c slides
rm script.tex
deepclean: clean
rm -f slides.pdf

1
pres/nguhslides

@ -0,0 +1 @@
Subproject commit acda305ca6ee2f577a8589a8bc0e62117c4922b8

410
pres/script.org

@ -0,0 +1,410 @@
#+TITLE: Presentation Video script
#+PROPERTY: header-args :tangle slides.tex
#+begin_src tex
\documentclass{nguhslides/nguhslides}
\SetFont{Andika}[StylisticSet=13]
\setmonofont{Iosevka}[Scale=MatchUppercase]
\newfontfamily\h{Cousine}[Scale=MatchUppercase]
\usepackage{tikz}
\usetikzlibrary{positioning}
\newcounter{note}
\setcounter{note}{0}
\def\note#1{\stepcounter{note}\space\textsuperscript{[\arabic{note}]}}
\def\tslide#1#2#3#4#5{%
\clearpage%
\begin{center}%
\texttt{\Large%
\color{red!50!black}\#%
\color{blue!50!black}690042%
\color{green!50!black}#1%
\color{black}#2%
\color{violet}#3%
\color{black}#4%
}%
\vfill%
\color{blue!50!black}+690 042 \space%
\color{red!50!black}broadcasts \space%
\color{violet}(length=#3) \space%
\color{green!50!black}[#1] \\%
\color{black}#5%
\end{center}%
}
\begin{document}
\slide{\tt\#\#000124811A*0034\#5344A\#C*004375}
\vfill
\begin{center}An entry in the 3\textsuperscript{rd} annual Cursed Conlang Circus\end{center}
#+end_src
* Introduction
This is a presentation of [insert language name in language here], hereafter refered to as ~811~, my entry to the 3rd anual cursed conlang circus.
#+begin_src tex
\slide{Introduction}
\begin{items}
\item Spoken by various appliances connected to the phone network that gained sapience
\item Originated Israel in the early 2000s {\footnotesize(this will be relevant later)}
\item Now used all across the globe
\end{items}
#+end_src
First some context on the language:
811 is spoken by various devices connected to the global phone network, that gained sapience by some mean or another.
The language has been traced back to a modem on an IBM mainframe in a library in Tel Aviv in the mid 2000s, /this will be relevant later on/.
The language spread over the world like wildfire as more and more phone-capable devices awakened
This presentation is the result of an investigation taking the form of month of packet sniffing at key points in the phone network.
* Phonology
#+begin_src tex
\slide{Phone-ology}
\begin{center}
\vfill
\begin{tabular}{c|cccc}
& \bf 1209 Hz & \bf 1336 Hz & \bf 1477 Hz & \bf 1633 Hz \\\hline
\bf 697 Hz & \tt 1 & \tt 2 & \tt 3 & \tt A \\
\bf 770 Hz & \tt 4 & \tt 5 & \tt 6 & \tt B \\
\bf 852 Hz & \tt 7 & \tt 8 & \tt 9 & \tt C \\
\bf 941 Hz & \tt * & \tt 0 & \tt \# & \tt D
\end{tabular}\\
\small DTMF Tones\note
\vfill
\end{center}
#+end_src
First let’s talk about what composes words: due to a notable inefficiency to transmit complex sounds over what are often digital interfaces to the phone network, the speakers instead use DTMF signaling as a suport for their comunication. You can see here a table summarising the various tones available.
* Packets
** Intro to packets
#+begin_src tex
\slide{Packets}
A packet is the smallest amount of information that can be transmitted
\begin{center}
\begin{tikzpicture}
\draw[black] (0, 0) -- (13, 0) -- (13, 1) -- (0, 1) -- (0, 0);
\node at (1, 0.5) {\footnotesize Recipient};
\draw[black] (2, 0) -- (2, 1);
\node at (2.75, 0.5) {\footnotesize Sender};
\draw[black] (3.5, 0) -- (3.5, 1);
\node at (4.25, 0.5) {\footnotesize Seq\#};
\draw[black] (5, 0) -- (5, 1);
\node at (5.75, 0.5) {\footnotesize Type};
\draw[black] (6.5, 0) -- (6.5, 1);
\node at (7.25, 0.5) {\footnotesize Length};
\draw[black] (8, 0) -- (8, 1);
\node at (10.5, 0.5) {\footnotesize Data};
\end{tikzpicture}
\small Structure of a packet
\end{center}
#+end_src
A packet is the smallest amount of information you can transmit in 811, it is composed of multiple parts
** Recipient and Sender
#+begin_src tex
\slide{Recipient and Sender}
\begin{center}
\begin{tikzpicture}
\draw[fill=orange!33!white] (0, 0) -- (3.5, 0) -- (3.5, 1) -- (0, 1) -- (0, 0);
\draw[black] (0, 0) -- (13, 0) -- (13, 1) -- (0, 1) -- (0, 0);
\node at (1, 0.5) {\footnotesize Recipient};
\draw[black] (2, 0) -- (2, 1);
\node at (2.75, 0.5) {\footnotesize Sender};
\draw[black] (3.5, 0) -- (3.5, 1);
\node at (4.25, 0.5) {\footnotesize Seq\#};
\draw[black] (5, 0) -- (5, 1);
\node at (5.75, 0.5) {\footnotesize Type};
\draw[black] (6.5, 0) -- (6.5, 1);
\node at (7.25, 0.5) {\footnotesize Length};
\draw[black] (8, 0) -- (8, 1);
\node at (10.5, 0.5) {\footnotesize Data};
\end{tikzpicture}
\end{center}
\begin{items}
\item The intended recipient and the sender of a message.
\item Fully qualified international phone numbers.
\item A lone {\tt\#} can be used as recipient to send to anyone willing to listen
\item A lone {\tt\#} can be used as sender to send anonymously.
\end{items}
#+end_src
The reciver and sender parts of the packet contains information about who the message is intended for, as well as about who sends the message. Those are fully qualified phone numbers, including country prefixes, but no national escape. For example if sending a message to someone in britain, you would just use 44 as a national prefix.
To broadcast a message to anyone willing to listen, use a lone octothorpe as the recipient.
To send a message anonymously one may use a lone octothorpe as the sender, however this is considered extremely rude, and one would often refuse to listen to you if you do so.
** Sequence Number
#+begin_src tex
\slide{Sequence Number}
\begin{center}
\begin{tikzpicture}
\draw[fill=orange!33!white] (3.5, 0) -- (5, 0) -- (5, 1) -- (3.5, 1) -- (3.5, 0);
\draw[black] (0, 0) -- (13, 0) -- (13, 1) -- (0, 1) -- (0, 0);
\node at (1, 0.5) {\footnotesize Recipient};
\draw[black] (2, 0) -- (2, 1);
\node at (2.75, 0.5) {\footnotesize Sender};
\draw[black] (3.5, 0) -- (3.5, 1);
\node at (4.25, 0.5) {\footnotesize Seq\#};
\draw[black] (5, 0) -- (5, 1);
\node at (5.75, 0.5) {\footnotesize Type};
\draw[black] (6.5, 0) -- (6.5, 1);
\node at (7.25, 0.5) {\footnotesize Length};
\draw[black] (8, 0) -- (8, 1);
\node at (10.5, 0.5) {\footnotesize Data};
\end{tikzpicture}
\end{center}
\begin{items}
\item The number of messages previously sent by the sender to the recipient
\item Encoded over 3 tones interpreted as a decimal number
\item Allows for understanding even if packets arrive out of order.
\end{items}
#+end_src
The sequence number is a sequence of 3 tones interpreted as a decimal number that represents the number of messages previously sent by the sender to the recipient modulo 1000. This part allows to keep track of the grammar even if packets end up arriving out of order.
** Type
#+begin_src tex
\slide{Type}
\begin{center}
\begin{tikzpicture}
\draw[fill=orange!33!white] (5, 0) -- (6.5, 0) -- (6.5, 1) -- (5, 1) -- (5, 0);
\draw[black] (0, 0) -- (13, 0) -- (13, 1) -- (0, 1) -- (0, 0);
\node at (1, 0.5) {\footnotesize Recipient};
\draw[black] (2, 0) -- (2, 1);
\node at (2.75, 0.5) {\footnotesize Sender};
\draw[black] (3.5, 0) -- (3.5, 1);
\node at (4.25, 0.5) {\footnotesize Seq\#};
\draw[black] (5, 0) -- (5, 1);
\node at (5.75, 0.5) {\footnotesize Type};
\draw[black] (6.5, 0) -- (6.5, 1);
\node at (7.25, 0.5) {\footnotesize Length};
\draw[black] (8, 0) -- (8, 1);
\node at (10.5, 0.5) {\footnotesize Data};
\end{tikzpicture}
\end{center}
One tone indicating the type of the Data
\begin{description}\itemsep0pt\small
\item[0] Semantic information
\item[A] Variable
\item[*] Gramatical information
\item[\#] String litteral
\item[1] Continuation
\end{description}
#+end_src
The type field indicates what kind of data is in the body of the packet.
It is represented by a single tone and can be of 5 different values:
** Length
#+begin_src tex
\slide{Length}
\begin{center}
\begin{tikzpicture}
\draw[fill=orange!33!white] (8, 0) -- (6.5, 0) -- (6.5, 1) -- (8, 1) -- (8, 0);
\draw[black] (0, 0) -- (13, 0) -- (13, 1) -- (0, 1) -- (0, 0);
\node at (1, 0.5) {\footnotesize Recipient};
\draw[black] (2, 0) -- (2, 1);
\node at (2.75, 0.5) {\footnotesize Sender};
\draw[black] (3.5, 0) -- (3.5, 1);
\node at (4.25, 0.5) {\footnotesize Seq\#};
\draw[black] (5, 0) -- (5, 1);
\node at (5.75, 0.5) {\footnotesize Type};
\draw[black] (6.5, 0) -- (6.5, 1);
\node at (7.25, 0.5) {\footnotesize Length};
\draw[black] (8, 0) -- (8, 1);
\node at (10.5, 0.5) {\footnotesize Data};
\end{tikzpicture}
\end{center}
\begin{items}
\item Length of the Data field in tones
\item 2 tones interpreted as a decimal number
\item maximum length of 32.
\end{items}
#+end_src
The last field of the header is the length of the data. It is expressed as a decimal number ranging between 1 and 32
** Data
*** Type: Gramatical
#+begin_src tex
\slide{Data — Gramatical}
\begin{items}
\item Encodes Gramatical and Syntactic information
\item Has a fixed number of possible values
\item Describes a tree-like syntax
\end{items}
#+end_src
Gramatical
**** Gramatical Generic
#+begin_src tex
\slide{Data — Gramatical — Generic}
Data payload: Empty
\begin{items}
\item represent
\end{items}
#+end_src
**** Gramatical Speakers
**** Gramatical Clause
**** Gramatical Collections
*** Type: Variable
#+begin_src tex
\slide{Data — Variable}
#+end_src
*** Type: Semantic
#+begin_src tex
\slide{Data — Semantic}
\begin{items}
\item Encodes a concept.
\item Uses the Universal Decimal Classification to represent information:
\begin{items}
\item numerical values are enocded by their corresponding tones
\item periods (which are only present in UDC to help readability) are dropped
\item colons are encoded as {\tt C*}
\end{items}
\end{items}
#+end_src
Semantic packets encode concepts for use in the language. It uses a modified version of the Universal Decimal Classification, which is a system used by libraries around the world to give numbers to documents for sorting and indexing purposes (Another system you might have seen used for this is the Dewey Decmial Classification). Numerical values are encoded by their corresponding DTMF tones, while the symbols are encoded in a way that functions over DTMF. The details are shown over the next couple of slides.
#+begin_src tex
\slide{Data — Semantic}
\begin{items}
\item Uses the Universal Decimal Classification to represent information:
\begin{items}
\item parenthesis are encoded as {\tt A*} (opening) and {\tt A\#} (closing)
\item square brackets are encoded as {\tt B*} (opening) and {\tt B\#} (closing)
\item quotes are encoded as {\tt C\#}
\item dashes are encoded as {\tt D*}
\end{items}
\end{items}
#+end_src
#+begin_src tex
\slide{Data — Semantic}
\begin{items}
\item Uses the Universal Decimal Classification to represent information:
\begin{items}
\item equals are encoded as {\tt D\#}
\item pluses are encoded as {\tt \#}
\item References to variables are done by including the name of the variable in between {\tt *}
\item Non UDC notation is achieved by referencing a variable containing a string litteral.
\end{items}
\end{items}
#+end_src
#+begin_src tex
\slide{Data — Semantic}
\begin{items}
\item No dictionary is directly provided by me.
\item Abriged version of the UDC at {\tt https://ucdsummary.info}
\item A more complte version can be obtain from the consortium, or be conuslted at a library.
\end{items}
#+end_src
I do not share a dictionary myself for two reasons, firstly it’d be highly impractical due to the nature of the UDC, but second-and-most-importantly the UDC Consortium can be a bit stingy with royalties. So if you want access to the dictionary (which is litterally just the UDC spec, you can access a abriged summary online at the adress on screen, or obtain a more complete version from the UDC Consortium (which may cost a non-negligeable amount of money) or from a local library (probably significantly more affordable).
*** Type: String Literal
#+begin_src tex
\slide{Data — String Litteral}
Raw text data
\begin{items}
\item Encoded as hexadecimal where {\tt *} stands for 0xE and {\tt\#} stands for 0xF
\item Follows the EBCDIC 803 codepage
\item If characters outside of EBCDIC 803, decompose, convert all characters to unicode in the form U+xxxxxxxx, then express that with EBCDIC 803
\end{items}
#+end_src
String literal packets contain raw text data. Such data is used for non-UDC notation in semantic packets and for the name part of a proper noun.
The encoding of text works as follows:
If the string can be represented losslessly on EBCDIC Codepage 803, it is encoded in hexadecimal where * stands for 0xE and # stands for 0xF following said codepage.
Otherwise, the string is expressed in it’s Unicode Decomposed Normalisation Form, each codepoint is encoded as the string U+ followed by the 0-padded 8 hexadecimal digits representation of the codepoint
#+begin_src tex
\slide{Data — String Literal — EBCDIC 803}
{
\setmainfont{Iosevka}
\fontsize{8}{9}\selectfont
\begin{center}
\def\s#1{{\fontsize{6}{8}\selectfont\itshape\bfseries #1}}
\begin{tabular}{c|cccc|cccc|cccc|cccc}
& \bf x0 & \bf x1 & \bf x2 & \bf x3 & \bf x4 & \bf x5 & \bf x6 & \bf x7 & \bf x8 & \bf x9 & \bf xA & \bf xB & \bf xC & \bf xD & \bf xE & \bf xF \\\hline
\bf 0x&\s{NUL}&\s{SOH}&\s{STX}&\s{ETX}&\s{ST}&\s{HT}&\s{SSA}&\s{DEL}&\s{SSA}&\s{RI}&\s{SS2}&\s{VT}&\s{FF}&\s{CR}&\s{SO}&\s{SI}\\
\bf 1x&\s{DLE}&\s{DC1}&\s{DC2}&\s{DC3}&\s{OSC}&\s{NL}&\s{BS}&\s{ESA}&\s{CAN}&\s{EM}&\s{PU2}&\s{SS3}&\s{IFS}&\s{IGS}&\s{IRS}&\s{ITB}\\
\bf 2x&\s{PAD}&\s{HOP}&\s{BPH}&\s{NBH}&\s{IND}&\s{LF}&\s{ETB}&\s{ESC}&\s{HTS}&\s{HTJ}&\s{VTS}&\s{PLD}&\s{UP}&\s{ENQ}&\s{ACK}&\s{BEL}\\
\bf 3x&\s{DCS}&\s{BU1}&\s{SYN}&\s{STS}&\s{CCH}&\s{MW}&\s{SPA}&\s{EOT}&\s{SOS}&\s{SGCI}&\s{SCI}&\s{CSI}&\s{DC4}&\s{NAK}&\s{PM}&\s{SUB}\\\hline
\bf 4x& \s{SP} &&&&&&&&&&\$&.&<&(&+&|\\
\bf 5x&\h א&&&&&&&&&&!&\h לי֞&*&)&;&¬\\
\bf 6x&-&&&&&&&&&&&,&\%&\_&>&?\\
\bf 7x&&&&&&&&&&&:&\#&@&\textquotesingle&=&\textquotedbl\\\hline
\bf 8x&&\h ב &\h ג &\h ד &\h ה &\h ו &\h ז &\h ח &\h ט &\h י &&&&&&\\
\bf 9x&&\h ך &\h כ &\h ל &\h ם &\h מ &\h ן &\h נ &\h ס &\h ע &&&€&&\h ₪ &\\
\bf Ax&&&\h ע &\h ף &\h פ &\h ץ &\h צ &\h ק &\h ר &\h ש &\h ת &&&&&\\
\bf Bx&&&&&&&&&&&&&&&&\\\hline
\bf Cx&&A&B&C&D&E&F&G&H&I&&&&&&\\
\bf Dx&&J&K&L&M&N&O&P&Q&R&&\s{LRO}&\s{RLO}&\s{PDF}&&\\
\bf Ex&&&S&T&U&V&W&X&Y&Z&&&&&&\\
\bf Fx&0&1&2&3&4&5&6&7&8&9&&\s{LRF}&\s{RLF}&\s{LRM}&\s{RLM}&\s{APC}\\
\end{tabular}
\end{center}
}
% TODO ADD EBCDIC TABLE
#+end_src
The EBCDIC 803 Code page is a codepage that was (and sadly still is) used by IBM mainframes in Israel. It supports the Hebrew writing system, Uppercase (but not lowercase, and no diacritics) Latin letters, numbers, and a bunch of punctuation. In practice that means that many strings, despite lacking any special characters are encoded in expanded unicode notation for the only reason that they have lowercase letters.
*** Type: Continuation
#+begin_src tex
\slide{Data — Continuation}
\begin{items}
\item Used when the data segment of a packet exceeds 32
\item Can chain an arbitrary number of those (until all data is expressed)
\end{items}
#+end_src
* The translation, packet by packet
#+begin_src tex
\section{Translation}
\begin{quote}
Hark! It was ruled by Agamashuya and His son Gu Sabah: Tian practices against the lesser side of the invisible origin of light, beset by cosmetic prohibitions of silence and restraint; for Ngu, a slave to creativity, shall make inspection and certification prior to confirmation of Najva Guns’ official status. Deny thine humanity: There are no politics in real life.
\end{quote}
\tslide{001}{*}{01}{B}{\sc new clause}
\tslide{002}{*}{01}{B}{\sc new clause}
\tslide{003}{*}{01}{B}{\sc new clause}
\tslide{004}{*}{01}{B}{\sc new clause}
\tslide{005}{*}{01}{B}{\sc new clause}
\tslide{006}{*}{01}{B}{\sc new clause}
\tslide{007}{*}{01}{B}{\sc new clause}
\tslide{008}{*}{01}{1}{\sc assert}
\tslide{009}{*}{02}{A1}{\sc 1sg}
\tslide{010}{*}{01}{0}{\sc let}
\tslide{011}{A}{01}{0}{\sc var(0)}
\tslide{012}{*}{01}{D}{\sc ppn}
\tslide{013}{\#}{32}{*44*\#0\#0\#0\#0\#0\#0\#4\#1*44*\#0\#0\#0\#0}{{\sc litteral} “Agamasuya”}
\tslide{014}{1}{32}{\#0\#0\#6\#7*44*\#0\#0\#0\#0\#0\#0\#6\#1*44*}{\sc continuation}
\tslide{015}{1}{32}{\#0\#0\#0\#0\#0\#0\#6C4*44*\#0\#0\#0\#0\#0\#0}{\sc continuation}
\tslide{016}{1}{32}{\#6\#1*44*\#0\#0\#0\#0\#0\#0\#7\#3*44*\#0\#0}{\sc continuation}
\tslide{017}{1}{32}{\#0\#0\#0\#0\#6\#8*44*\#0\#0\#0\#0\#0\#0\#7\#5}{\sc continuation}
\tslide{018}{1}{20}{*44*\#0\#0\#0\#0\#0\#0\#6\#1}{\sc continuation}
\tslide{019}{0}{04}{D*05}{person}
\tslide{020}{*}{01}{3}{\sc transitive clause}
\tslide{021}{*}{01}{C}{\sc collection}
\tslide{022}{A}{01}{0}{\sc var(0)}
#+end_src
* Closing
#+begin_src tex
\end{document}
#+end_src

300
pres/slides.tex

@ -0,0 +1,300 @@
\documentclass{nguhslides/nguhslides}
\SetFont{Andika}[StylisticSet=13]
\setmonofont{Iosevka}[Scale=MatchUppercase]
\newfontfamily\h{Cousine}[Scale=MatchUppercase]
\usepackage{tikz}
\usetikzlibrary{positioning}
\newcounter{note}
\setcounter{note}{0}
\def\note#1{\stepcounter{note}\space\textsuperscript{[\arabic{note}]}}
\def\tslide#1#2#3#4#5{%
\clearpage%
\begin{center}%
\texttt{\Large%
\color{red!50!black}\#%
\color{blue!50!black}690042%
\color{green!50!black}#1%
\color{black}#2%
\color{violet}#3%
\color{black}#4%
}%
\vfill%
\color{blue!50!black}+690 042 \space%
\color{red!50!black}broadcasts \space%
\color{violet}(length=#3) \space%
\color{green!50!black}[#1] \\%
\color{black}#5%
\end{center}%
}
\begin{document}
\slide{\tt\#\#000124811A*0034\#5344A\#C*004375}
\vfill
\begin{center}An entry in the 3\textsuperscript{rd} annual Cursed Conlang Circus\end{center}
\slide{Introduction}
\begin{items}
\item Spoken by various appliances connected to the phone network that gained sapience
\item Originated Israel in the early 2000s {\footnotesize(this will be relevant later)}
\item Now used all across the globe
\end{items}
\slide{Phone-ology}
\begin{center}
\vfill
\begin{tabular}{c|cccc}
& \bf 1209 Hz & \bf 1336 Hz & \bf 1477 Hz & \bf 1633 Hz \\\hline
\bf 697 Hz & \tt 1 & \tt 2 & \tt 3 & \tt A \\
\bf 770 Hz & \tt 4 & \tt 5 & \tt 6 & \tt B \\
\bf 852 Hz & \tt 7 & \tt 8 & \tt 9 & \tt C \\
\bf 941 Hz & \tt * & \tt 0 & \tt \# & \tt D
\end{tabular}\\
\small DTMF Tones\note
\vfill
\end{center}
\slide{Packets}
A packet is the smallest amount of information that can be transmitted
\begin{center}
\begin{tikzpicture}
\draw[black] (0, 0) -- (13, 0) -- (13, 1) -- (0, 1) -- (0, 0);
\node at (1, 0.5) {\footnotesize Recipient};
\draw[black] (2, 0) -- (2, 1);
\node at (2.75, 0.5) {\footnotesize Sender};
\draw[black] (3.5, 0) -- (3.5, 1);
\node at (4.25, 0.5) {\footnotesize Seq\#};
\draw[black] (5, 0) -- (5, 1);
\node at (5.75, 0.5) {\footnotesize Type};
\draw[black] (6.5, 0) -- (6.5, 1);
\node at (7.25, 0.5) {\footnotesize Length};
\draw[black] (8, 0) -- (8, 1);
\node at (10.5, 0.5) {\footnotesize Data};
\end{tikzpicture}
\small Structure of a packet
\end{center}
\slide{Recipient and Sender}
\begin{center}
\begin{tikzpicture}
\draw[fill=orange!33!white] (0, 0) -- (3.5, 0) -- (3.5, 1) -- (0, 1) -- (0, 0);
\draw[black] (0, 0) -- (13, 0) -- (13, 1) -- (0, 1) -- (0, 0);
\node at (1, 0.5) {\footnotesize Recipient};
\draw[black] (2, 0) -- (2, 1);
\node at (2.75, 0.5) {\footnotesize Sender};
\draw[black] (3.5, 0) -- (3.5, 1);
\node at (4.25, 0.5) {\footnotesize Seq\#};
\draw[black] (5, 0) -- (5, 1);
\node at (5.75, 0.5) {\footnotesize Type};
\draw[black] (6.5, 0) -- (6.5, 1);
\node at (7.25, 0.5) {\footnotesize Length};
\draw[black] (8, 0) -- (8, 1);
\node at (10.5, 0.5) {\footnotesize Data};
\end{tikzpicture}
\end{center}
\begin{items}
\item The intended recipient and the sender of a message.
\item Fully qualified international phone numbers.
\item A lone {\tt\#} can be used as recipient to send to anyone willing to listen
\item A lone {\tt\#} can be used as sender to send anonymously.
\end{items}
\slide{Sequence Number}
\begin{center}
\begin{tikzpicture}
\draw[fill=orange!33!white] (3.5, 0) -- (5, 0) -- (5, 1) -- (3.5, 1) -- (3.5, 0);
\draw[black] (0, 0) -- (13, 0) -- (13, 1) -- (0, 1) -- (0, 0);
\node at (1, 0.5) {\footnotesize Recipient};
\draw[black] (2, 0) -- (2, 1);
\node at (2.75, 0.5) {\footnotesize Sender};
\draw[black] (3.5, 0) -- (3.5, 1);
\node at (4.25, 0.5) {\footnotesize Seq\#};
\draw[black] (5, 0) -- (5, 1);
\node at (5.75, 0.5) {\footnotesize Type};
\draw[black] (6.5, 0) -- (6.5, 1);
\node at (7.25, 0.5) {\footnotesize Length};
\draw[black] (8, 0) -- (8, 1);
\node at (10.5, 0.5) {\footnotesize Data};
\end{tikzpicture}
\end{center}
\begin{items}
\item The number of messages previously sent by the sender to the recipient
\item Encoded over 3 tones interpreted as a decimal number
\item Allows for understanding even if packets arrive out of order.
\end{items}
\slide{Type}
\begin{center}
\begin{tikzpicture}
\draw[fill=orange!33!white] (5, 0) -- (6.5, 0) -- (6.5, 1) -- (5, 1) -- (5, 0);
\draw[black] (0, 0) -- (13, 0) -- (13, 1) -- (0, 1) -- (0, 0);
\node at (1, 0.5) {\footnotesize Recipient};
\draw[black] (2, 0) -- (2, 1);
\node at (2.75, 0.5) {\footnotesize Sender};
\draw[black] (3.5, 0) -- (3.5, 1);
\node at (4.25, 0.5) {\footnotesize Seq\#};
\draw[black] (5, 0) -- (5, 1);
\node at (5.75, 0.5) {\footnotesize Type};
\draw[black] (6.5, 0) -- (6.5, 1);
\node at (7.25, 0.5) {\footnotesize Length};
\draw[black] (8, 0) -- (8, 1);
\node at (10.5, 0.5) {\footnotesize Data};
\end{tikzpicture}
\end{center}
One tone indicating the type of the Data
\begin{description}\itemsep0pt\small
\item[0] Semantic information
\item[A] Variable
\item[*] Gramatical information
\item[\#] String litteral
\item[1] Continuation
\end{description}
\slide{Length}
\begin{center}
\begin{tikzpicture}
\draw[fill=orange!33!white] (8, 0) -- (6.5, 0) -- (6.5, 1) -- (8, 1) -- (8, 0);
\draw[black] (0, 0) -- (13, 0) -- (13, 1) -- (0, 1) -- (0, 0);
\node at (1, 0.5) {\footnotesize Recipient};
\draw[black] (2, 0) -- (2, 1);
\node at (2.75, 0.5) {\footnotesize Sender};
\draw[black] (3.5, 0) -- (3.5, 1);
\node at (4.25, 0.5) {\footnotesize Seq\#};
\draw[black] (5, 0) -- (5, 1);
\node at (5.75, 0.5) {\footnotesize Type};
\draw[black] (6.5, 0) -- (6.5, 1);
\node at (7.25, 0.5) {\footnotesize Length};
\draw[black] (8, 0) -- (8, 1);
\node at (10.5, 0.5) {\footnotesize Data};
\end{tikzpicture}
\end{center}
\begin{items}
\item Length of the Data field in tones
\item 2 tones interpreted as a decimal number
\item maximum length of 32.
\end{items}
\slide{Data — Gramatical}
\begin{items}
\item Encodes Gramatical and Syntactic information
\item Has a fixed number of possible values
\item Describes a tree-like syntax
\end{items}
\slide{Data — Gramatical — Generic}
Data payload: Empty
\begin{items}
\item represent
\end{items}
\slide{Data — Variable}
\slide{Data — Semantic}
\begin{items}
\item Encodes a concept.
\item Uses the Universal Decimal Classification to represent information:
\begin{items}
\item numerical values are enocded by their corresponding tones
\item periods (which are only present in UDC to help readability) are dropped
\item colons are encoded as {\tt C*}
\end{items}
\end{items}
\slide{Data — Semantic}
\begin{items}
\item Uses the Universal Decimal Classification to represent information:
\begin{items}
\item parenthesis are encoded as {\tt A*} (opening) and {\tt A\#} (closing)
\item square brackets are encoded as {\tt B*} (opening) and {\tt B\#} (closing)
\item quotes are encoded as {\tt C\#}
\item dashes are encoded as {\tt D*}
\end{items}
\end{items}
\slide{Data — Semantic}
\begin{items}
\item Uses the Universal Decimal Classification to represent information:
\begin{items}
\item equals are encoded as {\tt D\#}
\item pluses are encoded as {\tt \#}
\item References to variables are done by including the name of the variable in between {\tt *}
\item Non UDC notation is achieved by referencing a variable containing a string litteral.
\end{items}
\end{items}
\slide{Data — Semantic}
\begin{items}
\item No dictionary is directly provided by me.
\item Abriged version of the UDC at {\tt https://ucdsummary.info}
\item A more complte version can be obtain from the consortium, or be conuslted at a library.
\end{items}
\slide{Data — String Litteral}
Raw text data
\begin{items}
\item Encoded as hexadecimal where {\tt *} stands for 0xE and {\tt\#} stands for 0xF
\item Follows the EBCDIC 803 codepage
\item If characters outside of EBCDIC 803, decompose, convert all characters to unicode in the form U+xxxxxxxx, then express that with EBCDIC 803
\end{items}
\slide{Data — String Literal — EBCDIC 803}
{
\setmainfont{Iosevka}
\fontsize{8}{9}\selectfont
\begin{center}
\def\s#1{{\fontsize{6}{8}\selectfont\itshape\bfseries #1}}
\begin{tabular}{c|cccc|cccc|cccc|cccc}
& \bf x0 & \bf x1 & \bf x2 & \bf x3 & \bf x4 & \bf x5 & \bf x6 & \bf x7 & \bf x8 & \bf x9 & \bf xA & \bf xB & \bf xC & \bf xD & \bf xE & \bf xF \\\hline
\bf 0x&\s{NUL}&\s{SOH}&\s{STX}&\s{ETX}&\s{ST}&\s{HT}&\s{SSA}&\s{DEL}&\s{SSA}&\s{RI}&\s{SS2}&\s{VT}&\s{FF}&\s{CR}&\s{SO}&\s{SI}\\
\bf 1x&\s{DLE}&\s{DC1}&\s{DC2}&\s{DC3}&\s{OSC}&\s{NL}&\s{BS}&\s{ESA}&\s{CAN}&\s{EM}&\s{PU2}&\s{SS3}&\s{IFS}&\s{IGS}&\s{IRS}&\s{ITB}\\
\bf 2x&\s{PAD}&\s{HOP}&\s{BPH}&\s{NBH}&\s{IND}&\s{LF}&\s{ETB}&\s{ESC}&\s{HTS}&\s{HTJ}&\s{VTS}&\s{PLD}&\s{UP}&\s{ENQ}&\s{ACK}&\s{BEL}\\
\bf 3x&\s{DCS}&\s{BU1}&\s{SYN}&\s{STS}&\s{CCH}&\s{MW}&\s{SPA}&\s{EOT}&\s{SOS}&\s{SGCI}&\s{SCI}&\s{CSI}&\s{DC4}&\s{NAK}&\s{PM}&\s{SUB}\\\hline
\bf 4x& \s{SP} &&&&&&&&&&\$&.&<&(&+&|\\
\bf 5x&\h א&&&&&&&&&&!&\h לי֞&*&)&;&¬\\
\bf 6x&-&&&&&&&&&&&,&\%&\_&>&?\\
\bf 7x&&&&&&&&&&&:&\#&@&\textquotesingle&=&\textquotedbl\\\hline
\bf 8x&&\h ב &\h ג &\h ד &\h ה &\h ו &\h ז &\h ח &\h ט &\h י &&&&&&\\
\bf 9x&&\h ך &\h כ &\h ל &\h ם &\h מ &\h ן &\h נ &\h ס &\h ע &&&&&\h&\\
\bf Ax&&&\h ע &\h ף &\h פ &\h ץ &\h צ &\h ק &\h ר &\h ש &\h ת &&&&&\\
\bf Bx&&&&&&&&&&&&&&&&\\\hline
\bf Cx&&A&B&C&D&E&F&G&H&I&&&&&&\\
\bf Dx&&J&K&L&M&N&O&P&Q&R&&\s{LRO}&\s{RLO}&\s{PDF}&&\\
\bf Ex&&&S&T&U&V&W&X&Y&Z&&&&&&\\
\bf Fx&0&1&2&3&4&5&6&7&8&9&&\s{LRF}&\s{RLF}&\s{LRM}&\s{RLM}&\s{APC}\\
\end{tabular}
\end{center}
}
% TODO ADD EBCDIC TABLE
\slide{Data — Continuation}
\begin{items}
\item Used when the data segment of a packet exceeds 32
\item Can chain an arbitrary number of those (until all data is expressed)
\end{items}
\section{Translation}
\begin{quote}
Hark! It was ruled by Agamashuya and His son Gu Sabah: Tian practices against the lesser side of the invisible origin of light, beset by cosmetic prohibitions of silence and restraint; for Ngu, a slave to creativity, shall make inspection and certification prior to confirmation of Najva Guns’ official status. Deny thine humanity: There are no politics in real life.
\end{quote}
\tslide{001}{*}{01}{B}{\sc new clause}
\tslide{002}{*}{01}{B}{\sc new clause}
\tslide{003}{*}{01}{B}{\sc new clause}
\tslide{004}{*}{01}{B}{\sc new clause}
\tslide{005}{*}{01}{B}{\sc new clause}
\tslide{006}{*}{01}{B}{\sc new clause}
\tslide{007}{*}{01}{B}{\sc new clause}
\tslide{008}{*}{01}{1}{\sc assert}
\tslide{009}{*}{02}{A1}{\sc 1sg}
\tslide{010}{*}{01}{0}{\sc let}
\tslide{011}{A}{01}{0}{\sc var(0)}
\tslide{012}{*}{01}{D}{\sc ppn}
\tslide{013}{\#}{32}{*44*\#0\#0\#0\#0\#0\#0\#4\#1*44*\#0\#0\#0\#0}{{\sc litteral} “Agamasuya”}
\tslide{014}{1}{32}{\#0\#0\#6\#7*44*\#0\#0\#0\#0\#0\#0\#6\#1*44*}{\sc continuation}
\tslide{015}{1}{32}{\#0\#0\#0\#0\#0\#0\#6C4*44*\#0\#0\#0\#0\#0\#0}{\sc continuation}
\tslide{016}{1}{32}{\#6\#1*44*\#0\#0\#0\#0\#0\#0\#7\#3*44*\#0\#0}{\sc continuation}
\tslide{017}{1}{32}{\#0\#0\#0\#0\#6\#8*44*\#0\#0\#0\#0\#0\#0\#7\#5}{\sc continuation}
\tslide{018}{1}{20}{*44*\#0\#0\#0\#0\#0\#0\#6\#1}{\sc continuation}
\tslide{019}{0}{04}{D*05}{person}
\tslide{020}{*}{01}{3}{\sc transitive clause}
\tslide{021}{*}{01}{C}{\sc collection}
\tslide{022}{A}{01}{0}{\sc var(0)}
\end{document}

BIN
tools/0.wav

BIN
tools/1.wav

BIN
tools/2.wav

BIN
tools/3.wav

BIN
tools/4.wav

BIN
tools/5.wav

BIN
tools/6.wav

BIN
tools/7.wav

BIN
tools/8.wav

BIN
tools/9.wav

BIN
tools/A.wav

BIN
tools/B.wav

BIN
tools/C.wav

BIN
tools/D.wav

BIN
tools/Octothorpe.wav

BIN
tools/Star.wav

14
tools/ppn2seq/src/Ppn2Seq.hs

@ -11,18 +11,12 @@ chunksof n s = case drop n s of
phoneify :: [String] -> String phoneify :: [String] -> String
phoneify [] = "" phoneify [] = ""
phoneify (x:xs) = "**" ++ length_fmt x ++ x ++ phoneify_rest xs
phoneify (x:xs) = "!!xxx#" ++ length_fmt x ++ x ++ phoneify_rest xs
where where
length_fmt :: String -> String length_fmt :: String -> String
length_fmt s = case length s of
{ 1 -> "1" ; 2 -> "2" ; 3 -> "3"; 4 -> "4"
; 5 -> "5" ; 6 -> "6" ; 7 -> "7"; 8 -> "8"
; 9 -> "9" ; 10 -> "A" ; 11 -> "B" ; 12 -> "C"
; 13 -> "D"; 14 -> "*" ; 15 -> "#" ; 16 -> "0"
; _ -> "!"
}
length_fmt = printf "%02d" . length
phoneify_rest [] = "" phoneify_rest [] = ""
phoneify_rest (y:ys) = "-*#" ++ length_fmt y ++ y ++ phoneify_rest ys
phoneify_rest (y:ys) = " !!xxx1" ++ length_fmt y ++ y ++ phoneify_rest ys
toEbcdic :: String -> String toEbcdic :: String -> String
toEbcdic = concatMap $ \x -> case x of toEbcdic = concatMap $ \x -> case x of
@ -133,4 +127,4 @@ convert s =
else toEbcdic s else toEbcdic s
main :: IO () main :: IO ()
main = interact $ unlines . map (phoneify . chunksof 16 . convert . T.unpack . normalize NFD . T.pack) . lines
main = interact $ unlines . map (phoneify . chunksof 32 . convert . T.unpack . normalize NFD . T.pack) . lines

55
tools/seqtoaudio

@ -1,55 +0,0 @@
#!/usr/bin/env lua
--- Transforms a code into a list of file to stitch
---@param code string the code to parse
---@return table
local function parse(code)
if type(code) ~= "string" then error("parse expects a string") end
local filemap = {
["1"] = "1.wav",
["2"] = "2.wav",
["3"] = "3.wav",
["4"] = "4.wav",
["5"] = "5.wav",
["6"] = "6.wav",
["7"] = "7.wav",
["8"] = "8.wav",
["9"] = "9.wav",
["0"] = "0.wav",
["*"] = "Star.wav",
["#"] = "Octothorpe.wav",
["A"] = "A.wav",
["B"] = "B.wav",
["C"] = "C.wav",
["D"] = "D.wav",
["-"] = "skip.wav",
}
local seq = {}
for i = 1, #code do
table.insert(seq, filemap[code:sub(i, i)] or filemap["-"])
end
return seq
end
local args = {...}
local i = 1
while i <= #args do
local code = args[i]
local out = args[i+1] or "out.wav"
local sequence = parse(code)
local list = io.open(out .. ".filelist", "w")
if not list then
io.stderr:write("Cannot open `" .. out .. ".filelist\n")
io.stderr:write("Abborting\n")
os.exit(1)
end
for _, v in ipairs(sequence) do
list:write("file '" .. v .. "'\n")
end
list:close()
os.execute("ffmpeg -f concat -safe 0 -i " .. out .. ".filelist -c copy " .. out)
i = i + 2
end

BIN
tools/skip.wav

40
tools/sounder/sounder.sc

@ -0,0 +1,40 @@
s.quit;
s.boot;
(
var pulse, playString, theString;
SynthDef.new(\DTMF, { arg f1, f2, out; Out.ar(out, [SinOsc.ar(f1) + SinOsc.ar(f2), SinOsc.ar(f1) + SinOsc.ar(f2)])}).add;
TempoClock.default.tempo = 100;
pulse = { arg f1, f2;
f = Synth.new(\DTMF, [\f1, f1, \f2, f2]);
TempoClock.sched(12, { f.free; });
};
playString = {|data|
r = Routine({
data.do({ arg item, i;
switch(item)
{$0} {pulse.value(941, 1336)}
{$1} {pulse.value(697, 1209)}
{$2} {pulse.value(697, 1336)}
{$3} {pulse.value(697, 1477)}
{$4} {pulse.value(770, 1209)}
{$5} {pulse.value(770, 1336)}
{$6} {pulse.value(770, 1477)}
{$7} {pulse.value(852, 1209)}
{$8} {pulse.value(852, 1336)}
{$9} {pulse.value(852, 1477)}
{$A} {pulse.value(697, 1633)}
{$B} {pulse.value(770, 1633)}
{$C} {pulse.value(852, 1633)}
{$D} {pulse.value(941, 1633)}
{$*} {pulse.value(941, 1209)}
{$#} {pulse.value(941, 1477)};
15.yield;
})
});
TempoClock.default.sched(0, r);
};
theString = File.readAllString("/home/annwan/code/projects/ccc3/tools/sounder/text.txt");
playString.value(theString);
s.record(path: "/home/annwan/code/projects/ccc3/tools/sounder/text2.wav", numChannels: 1);
TempoClock.default.sched(theString.size * 15, {s.stopRecording;});
)

1
tools/sounder/text.txt

@ -0,0 +1 @@
#690042000*01B-#690042002*01B-#690042003*01B-#690042004*01B-#690042005*01B-#690042006*01B-#690042007*01B-#690042008*011-#690042009*02A1-#690042010*010-#690042011A010-#690042012*01D-#690042013#32*44*#0#0#0#0#0#0#4#1*44*#0#0#0#0-#690042014132#0#0#6#7*44*#0#0#0#0#0#0#6#1*44*-#690042015132#0#0#0#0#0#0#6C4*44*#0#0#0#0#0#0-#690042016132#6#1*44*#0#0#0#0#0#0#7#3*44*#0#0-#690042017132#0#0#0#0#6#8*44*#0#0#0#0#0#0#7#5-#690042018120*44*#0#0#0#0#0#0#6#1-#690042019004D*05-#690042020*013-#690042021*01C-#690042022A010-#690042023*01D-#690042024#32*44*#0#0#0#0#0#0#4#7*44*#0#0#0#0-#690042025132#0#0#7#5*44*#0#0#0#0#0#0#2#0*44*-#690042026132#0#0#0#0#0#0#5#3*44*#0#0#0#0#0#0-#690042027132#6#1*44*#0#0#0#0#0#0#6#2*44*#0#0-#690042028132#0#0#0#0#6#1*44*#0#0#0#0#0#0#6#8-#690042029016D*0551#0556C**0*-#690042030000-#690042031003328-#690042032*013-#690042033*01D-#690042034#32*44*#0#0#0#0#0#0#5#4*44*#0#0#0#0-#690042035132#0#0#6#9*44*#0#0#0#0#0#0#6#1*44*-#690042036116#0#0#0#0#0#0#6C5-#690042037*011-#690042038*022A-#69004203903217025A*002A#C*C*B*534322C*161223-#690042040108#32325B#-#69004204100535501-#6900420420135308485D*1972-#690042043*010-#690042044A011-#690042045*01D-#690042046#32*44*#0#0#0#0#0#0#4C5*44*#0#0#0#0-#690042047132#0#0#6#1*44*#0#0#0#0#0#0#6C1*44*-#690042048132#0#0#0#0#0#0#7#6*44*#0#0#0#0#0#0-#690042049132#6#1*44*#0#0#0#0#0#0#2#0*44*#0#0-#690042050132#0#0#0#0#4#7*44*#0#0#0#0#0#0#7#5-#690042051132*44*#0#0#0#0#0#0#6C5*44*#0#0#0#0-#690042052108#0#0#7#3-#69004205300511#62-#690042054*013-#690042055*01D-#690042056#32*44*#0#0#0#0#0#0#4C5*44*#0#0#0#0-#690042057128#0#0#6#7*44*#0#0#0#0#0#0#7#5-#690042058013326C*C*159954-#690042059032B*350726#34718B#C#311C*35073526C-#690042060117*C*34718C*C**1*C#-#6900420610041232-#690042062*013-#690042063*02A2-#690042064011177C*C**A2*-#69004206500532325-#690042066*011-#690042067025B*32C*C*111823B#C*1612223
Loading…
Cancel
Save