major refactor
This commit is contained in:
parent
ae04b22c7a
commit
b68a426b92
8
.editorconfig
Normal file
8
.editorconfig
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
root = true
|
||||||
|
|
||||||
|
[*]
|
||||||
|
end_of_line = crlf
|
||||||
|
insert_final_newline = true
|
||||||
|
indent_size = 4
|
||||||
|
charset = utf-8
|
||||||
|
indent_style = tab
|
11
.gitignore
vendored
11
.gitignore
vendored
@ -53,14 +53,5 @@ Mkfile.old
|
|||||||
dkms.conf
|
dkms.conf
|
||||||
|
|
||||||
# ---> products
|
# ---> products
|
||||||
# Substituted code
|
build/
|
||||||
formula_substituted.*
|
|
||||||
|
|
||||||
# Executables
|
|
||||||
*.a
|
|
||||||
*.out
|
|
||||||
*.exe
|
|
||||||
render_bytebeat.*
|
|
||||||
|
|
||||||
# Output
|
|
||||||
output.wav
|
output.wav
|
||||||
|
@ -1,5 +1,4 @@
|
|||||||
$ cat | ./bytebeat_compiler.py - && ./render_bytebeat
|
$ echo 't&((t>>7)-t)&t>>8' | ./bytebeat_compiler.py - && ./render_bytebeat
|
||||||
t&(t>>7)-t&t>>8
|
|
||||||
Compiling
|
Compiling
|
||||||
:: C bytebeat generator runtime unit
|
:: C bytebeat generator runtime unit
|
||||||
|
|
||||||
|
@ -1,18 +1,33 @@
|
|||||||
#!/usr/bin/python3
|
#!/usr/bin/python3
|
||||||
|
|
||||||
DEFAULT_PARAMETERS = {
|
from os.path import exists, join as path_join
|
||||||
"CC": "gcc",
|
from os import system, environ, makedirs
|
||||||
"CC_FLAGS": "-Os -Wall -Werror -Wpedantic",
|
|
||||||
"INPUT_FILES": ["engine.c", "formula_substituted.c"],
|
|
||||||
"OUTPUT_FILE": "render_bytebeat"
|
|
||||||
}
|
|
||||||
|
|
||||||
from os.path import exists
|
|
||||||
from os import system, environ
|
|
||||||
from argparse import ArgumentParser
|
from argparse import ArgumentParser
|
||||||
from sys import stdin
|
from sys import stdin
|
||||||
import subprocess
|
import subprocess
|
||||||
|
|
||||||
|
# Paths
|
||||||
|
PATHS = {
|
||||||
|
"src_dir": "src/",
|
||||||
|
"build_dir": "build/",
|
||||||
|
"template": "template.c",
|
||||||
|
"substitute": "substituted.c",
|
||||||
|
"output": "render_bytebeat"
|
||||||
|
}
|
||||||
|
|
||||||
|
# Solve paths
|
||||||
|
PATHS["template"] = path_join(PATHS["src_dir"], PATHS["template"])
|
||||||
|
PATHS["substitute"] = path_join(PATHS["build_dir"], PATHS["substitute"])
|
||||||
|
PATHS["output"] = path_join(PATHS["build_dir"], PATHS["output"])
|
||||||
|
|
||||||
|
# Default parameters
|
||||||
|
DEFAULT_PARAMETERS = {
|
||||||
|
"CC": "gcc",
|
||||||
|
"CC_FLAGS": "-Os -Wall -Werror -Wpedantic",
|
||||||
|
"INPUT_FILE": PATHS["substitute"],
|
||||||
|
"OUTPUT_FILE": PATHS["output"]
|
||||||
|
}
|
||||||
|
|
||||||
def fetch(name: str):
|
def fetch(name: str):
|
||||||
return res if (res := environ.get(name)) else DEFAULT_PARAMETERS[name]
|
return res if (res := environ.get(name)) else DEFAULT_PARAMETERS[name]
|
||||||
|
|
||||||
@ -36,16 +51,14 @@ def substitute_value(placeholder: str, replacement, text: str) -> str:
|
|||||||
|
|
||||||
CC = fetch("CC")
|
CC = fetch("CC")
|
||||||
CC_FLAGS = fetch("CC_FLAGS")
|
CC_FLAGS = fetch("CC_FLAGS")
|
||||||
INPUT_FILES = fetch("INPUT_FILES")
|
INPUT_FILE = fetch("INPUT_FILE")
|
||||||
OUTPUT_FILE = fetch("OUTPUT_FILE")
|
OUTPUT_FILE = fetch("OUTPUT_FILE")
|
||||||
|
|
||||||
if __name__ == "__main__":
|
if __name__ == "__main__":
|
||||||
print("Bytebeat compiler")
|
|
||||||
|
|
||||||
parser = ArgumentParser(description=\
|
parser = ArgumentParser(description=\
|
||||||
"Substitutes supplied C (non-JavaScript!) bytebeat into the template, "
|
"Substitutes supplied C (non-JavaScript!) bytebeat into the template, "
|
||||||
"then attempts to compile the instance of the template. Uses "
|
"then attempts to compile the instance of the template. Uses "
|
||||||
"environmental variables `CC`, `CC_FLAGS`, `INPUT_FILES`, "
|
"environmental variables `CC`, `CC_FLAGS`, `INPUT_FILE`, "
|
||||||
"`OUTPUT_FILE`.")
|
"`OUTPUT_FILE`.")
|
||||||
parser.add_argument("file", type=str,
|
parser.add_argument("file", type=str,
|
||||||
help="bytebeat formula file")
|
help="bytebeat formula file")
|
||||||
@ -69,31 +82,29 @@ if __name__ == "__main__":
|
|||||||
print("No valid contents")
|
print("No valid contents")
|
||||||
raise SystemExit
|
raise SystemExit
|
||||||
|
|
||||||
# Substitute all placeholders in formula_template.c -> formula_substitute.c
|
# - Compilation
|
||||||
|
makedirs(PATHS["build_dir"], exist_ok=True)
|
||||||
|
|
||||||
if not args.no_return: # Insert return statement
|
if not args.no_return: # Insert return statement
|
||||||
bytebeat_contents = f"\treturn\n\n{bytebeat_contents}"
|
bytebeat_contents = f"\treturn\n\n{bytebeat_contents}"
|
||||||
|
|
||||||
substitute_c = read_file("formula_template.c")
|
substitute = read_file(PATHS["template"])
|
||||||
substitute_c = substitute_value("bytebeat_contents",
|
substitute = substitute_value("bytebeat_contents",
|
||||||
bytebeat_contents, substitute_c)
|
bytebeat_contents, substitute)
|
||||||
rewrite_file("formula_substituted.c", substitute_c)
|
substitute = substitute_value("sample_rate",
|
||||||
|
args.sample_rate, substitute)
|
||||||
# Substitute all placeholders in formula_template.h -> formula_substitute.h
|
substitute = substitute_value("bit_depth",
|
||||||
substitute_h = read_file("formula_template.h")
|
args.bit_depth, substitute)
|
||||||
substitute_h = substitute_value("sample_rate",
|
substitute = substitute_value("is_signed",
|
||||||
args.sample_rate, substitute_h)
|
"1" if args.signed else "0", substitute)
|
||||||
substitute_h = substitute_value("bit_depth",
|
substitute = substitute_value("channels",
|
||||||
args.bit_depth, substitute_h)
|
args.channels, substitute)
|
||||||
substitute_h = substitute_value("is_signed",
|
substitute = substitute_value("seconds",
|
||||||
"1" if args.signed else "0", substitute_h)
|
args.seconds, substitute)
|
||||||
substitute_h = substitute_value("channels",
|
rewrite_file(PATHS["substitute"], substitute)
|
||||||
args.channels, substitute_h)
|
|
||||||
substitute_h = substitute_value("seconds",
|
|
||||||
args.seconds, substitute_h)
|
|
||||||
rewrite_file("formula_substituted.h", substitute_h)
|
|
||||||
|
|
||||||
# Compile by invoking the shell script
|
# Compile by invoking the shell script
|
||||||
print("Compiling")
|
print("Compiling")
|
||||||
|
|
||||||
# Let system execute aliases by calling os.system
|
# Let the system execute aliases by calling os.system
|
||||||
system(" ".join([CC, CC_FLAGS, *INPUT_FILES, "-o", OUTPUT_FILE]))
|
system(" ".join([CC, CC_FLAGS, INPUT_FILE, "-o", OUTPUT_FILE]))
|
||||||
|
7
documentation.md
Normal file
7
documentation.md
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
# C_bytebeat_render
|
||||||
|
|
||||||
|
## Bytebeat code
|
||||||
|
|
||||||
|
**Variables:**
|
||||||
|
- `w`: `long double`
|
||||||
|
- `t`: `w` casted as `uintmax_t`
|
@ -1,13 +0,0 @@
|
|||||||
#include <stdint.h>
|
|
||||||
|
|
||||||
#include "formula_substituted.h"
|
|
||||||
|
|
||||||
SAMPLE_TYPE
|
|
||||||
bytebeat(long double w)
|
|
||||||
{
|
|
||||||
uintmax_t t = (uintmax_t)w;
|
|
||||||
|
|
||||||
`bytebeat_contents`
|
|
||||||
|
|
||||||
;
|
|
||||||
}
|
|
@ -1,23 +0,0 @@
|
|||||||
#ifndef _FORMULA_TEMPLATE_H
|
|
||||||
#define _FORMULA_TEMPLATE_H
|
|
||||||
|
|
||||||
#define SAMPLE_RATE `sample_rate`
|
|
||||||
#define BIT_DEPTH `bit_depth`
|
|
||||||
#define IS_SIGNED `is_signed`
|
|
||||||
#define CHANNELS `channels`
|
|
||||||
#define SECONDS `seconds`
|
|
||||||
|
|
||||||
#if BIT_DEPTH <= 8
|
|
||||||
#define SAMPLE_TYPE uint8_t
|
|
||||||
#elif BIT_DEPTH >= 16
|
|
||||||
#if IS_SIGNED
|
|
||||||
#define SAMPLE_TYPE int16_t
|
|
||||||
#else
|
|
||||||
#define SAMPLE_TYPE uint16_t
|
|
||||||
#endif
|
|
||||||
#endif
|
|
||||||
|
|
||||||
SAMPLE_TYPE
|
|
||||||
bytebeat(long double w);
|
|
||||||
|
|
||||||
#endif /* _FORMULA_TEMPLATE_H */
|
|
@ -7,8 +7,7 @@
|
|||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <time.h>
|
#include <time.h>
|
||||||
|
|
||||||
#include "formula_substituted.h"
|
// constants
|
||||||
|
|
||||||
#if defined(_WIN32)
|
#if defined(_WIN32)
|
||||||
#define __ANSI_CLEAR_STRING "\r"
|
#define __ANSI_CLEAR_STRING "\r"
|
||||||
#elif defined(__unix__) || defined(__linux__)
|
#elif defined(__unix__) || defined(__linux__)
|
||||||
@ -18,6 +17,22 @@
|
|||||||
#endif
|
#endif
|
||||||
const char* ANSI_CLEAR = __ANSI_CLEAR_STRING;
|
const char* ANSI_CLEAR = __ANSI_CLEAR_STRING;
|
||||||
|
|
||||||
|
#define SAMPLE_RATE `sample_rate`
|
||||||
|
#define BIT_DEPTH `bit_depth`
|
||||||
|
#define IS_SIGNED `is_signed`
|
||||||
|
#define CHANNELS `channels`
|
||||||
|
#define SECONDS `seconds`
|
||||||
|
|
||||||
|
#if BIT_DEPTH <= 8
|
||||||
|
#define SAMPLE_TYPE uint8_t
|
||||||
|
#elif BIT_DEPTH >= 16
|
||||||
|
#if IS_SIGNED
|
||||||
|
#define SAMPLE_TYPE int16_t
|
||||||
|
#else
|
||||||
|
#define SAMPLE_TYPE uint16_t
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
|
||||||
#define PRODUCT (SAMPLE_RATE * SECONDS * CHANNELS)
|
#define PRODUCT (SAMPLE_RATE * SECONDS * CHANNELS)
|
||||||
#define FREQUENCY_OF_STATUS_REPORTING 5000
|
#define FREQUENCY_OF_STATUS_REPORTING 5000
|
||||||
|
|
||||||
@ -33,9 +48,20 @@ const char* dbgpnt_labels[3] = { "memory allocation",
|
|||||||
#define dbgpnt_labels_size \
|
#define dbgpnt_labels_size \
|
||||||
(unsigned int)(sizeof(dbgpnt_labels) / sizeof(dbgpnt_labels[0]))
|
(unsigned int)(sizeof(dbgpnt_labels) / sizeof(dbgpnt_labels[0]))
|
||||||
|
|
||||||
bool silent_mode = 0;
|
// global variables
|
||||||
bool debug_mode = 0;
|
bool silent_mode = false, debug_mode = false;
|
||||||
|
|
||||||
|
// function prototypes
|
||||||
|
void
|
||||||
|
debug_print(void);
|
||||||
|
|
||||||
|
long double
|
||||||
|
random(void);
|
||||||
|
|
||||||
|
SAMPLE_TYPE
|
||||||
|
bytebeat(long double w);
|
||||||
|
|
||||||
|
// function implementations
|
||||||
void
|
void
|
||||||
debug_print(void)
|
debug_print(void)
|
||||||
{
|
{
|
||||||
@ -66,6 +92,16 @@ random(void)
|
|||||||
return (long double)rand() / RAND_MAX;
|
return (long double)rand() / RAND_MAX;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
SAMPLE_TYPE
|
||||||
|
bytebeat(long double w)
|
||||||
|
{
|
||||||
|
uintmax_t t = (uintmax_t)w;
|
||||||
|
|
||||||
|
`bytebeat_contents`
|
||||||
|
|
||||||
|
;
|
||||||
|
}
|
||||||
|
|
||||||
int
|
int
|
||||||
main(int argc, char** argv)
|
main(int argc, char** argv)
|
||||||
{
|
{
|
Loading…
Reference in New Issue
Block a user