From 9b70aa22b614f35671816bace11f59cef71f61a1 Mon Sep 17 00:00:00 2001 From: Tobias Reisinger Date: Thu, 5 Mar 2020 21:46:08 +0100 Subject: [PATCH] init --- .gitignore | 2 + audio.php | 16 +++++ generate_locale.sh | 9 +++ index.php | 111 +++++++++++++++++++++++++++++ lib/config.php | 53 ++++++++++++++ lib/helpers.php | 37 ++++++++++ lib/validation.php | 119 ++++++++++++++++++++++++++++++++ locale/de/LC_MESSAGES/rhythm.po | 68 ++++++++++++++++++ locale/en/LC_MESSAGES/rhythm.po | 68 ++++++++++++++++++ locale/rhythm.pot | 67 ++++++++++++++++++ messages.po | 72 +++++++++++++++++++ static/res/tempo.png | Bin 0 -> 25579 bytes templates/index.tpl.php | 89 ++++++++++++++++++++++++ 13 files changed, 711 insertions(+) create mode 100644 .gitignore create mode 100644 audio.php create mode 100755 generate_locale.sh create mode 100644 index.php create mode 100644 lib/config.php create mode 100644 lib/helpers.php create mode 100644 lib/validation.php create mode 100644 locale/de/LC_MESSAGES/rhythm.po create mode 100644 locale/en/LC_MESSAGES/rhythm.po create mode 100644 locale/rhythm.pot create mode 100644 messages.po create mode 100644 static/res/tempo.png create mode 100644 templates/index.tpl.php diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..dd5c071 --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +locale/*/LC_MESSAGES/rhythm.mo +locale/*/LC_MESSAGES/rhythm.po~ diff --git a/audio.php b/audio.php new file mode 100644 index 0000000..9096c6b --- /dev/null +++ b/audio.php @@ -0,0 +1,16 @@ + diff --git a/generate_locale.sh b/generate_locale.sh new file mode 100755 index 0000000..814aeaf --- /dev/null +++ b/generate_locale.sh @@ -0,0 +1,9 @@ +#!/usr/bin/env sh + +xgettext --add-comments templates/*.php -o locale/rhythm.pot + +msgmerge --update locale/de/LC_MESSAGES/rhythm.po locale/rhythm.pot +msgmerge --update locale/en/LC_MESSAGES/rhythm.po locale/rhythm.pot + +msgfmt locale/de/LC_MESSAGES/rhythm.po --output-file=locale/de/LC_MESSAGES/rhythm.mo +msgfmt locale/en/LC_MESSAGES/rhythm.po --output-file=locale/en/LC_MESSAGES/rhythm.mo diff --git a/index.php b/index.php new file mode 100644 index 0000000..8931bb7 --- /dev/null +++ b/index.php @@ -0,0 +1,111 @@ + MAX_FRACTION) || (!is_valid_note($note_val))) + { + continue; + } + if($rhythm_length + (MAX_FRACTION / $note_val) > $rhythm_length_max) + { + continue; + } + $rhythm_length += MAX_FRACTION / $note_val; + + if($notes_modifiers[$i] & 0b0111) + { + $notes_final[] = PERCUSSION_CLAP . $note_val; + } + else + { + $notes_final[] = PERCUSSION_REST . $note_val; + } + + if($rhythm_length == $rhythm_length_max) + { + $notes_final[] = "|"; + $rhythm_length = 0; + $bars_count++; + } + } + $id_hashed = md5($id_hashed); +} while($bars_count < $bars); + +$notes_final = implode(" ", $notes_final); + +$rest_padding = array_fill(0, $time_explode[0], PERCUSSION_REST . $time_explode[1]); +$rest_padding[0] = $rest_padding[0] . "\\$dynamic_rhythm"; +$rest_padding = implode(" ", $rest_padding); + +$beats_one_bar = array_fill(1, $time_explode[0] - 1, PERCUSSION_BEAT . $time_explode[1]); +array_unshift($beats_one_bar, PERCUSSION_BEAT_ACCENT . $time_explode[1] . "\\$dynamic_beat"); +array_push($beats_one_bar, "|"); +$beats = implode(" ", array_fill(0, $bars_count + 2, implode(" ", $beats_one_bar))); + +$file_content = sprintf( + LILYPOND_FORMAT, + $time, + $tempo, + $notes_final, + $rest_padding, + $beats +); +$file_name = md5($file_content); + +file_put_contents( OUTPUT_FOLDER . $file_name . ".ly", $file_content); +exec(sprintf("lilypond --png -o %1\$s %1\$s$file_name.ly && convert %1\$s$file_name.png -trim %1\$s$file_name.png", OUTPUT_FOLDER)); + +echo(render( + "./templates/index.tpl.php", + $locale, + array( + "id" => $id, + "time" => $time, + "tempo" => $tempo, + "bars" => $bars, + "file_name" => $file_name, + "dynamic_beat" => $dynamic_beat, + "dynamic_rhythm" => $dynamic_rhythm, + ) +)); + +?> diff --git a/lib/config.php b/lib/config.php new file mode 100644 index 0000000..2f86f27 --- /dev/null +++ b/lib/config.php @@ -0,0 +1,53 @@ +> + \\midi { + \\tempo %2$s + } +} +\\score { + \\new DrumStaff \with { + drumStyleTable = #percussion-style + \override StaffSymbol.line-count = #1 + } << + \\new DrumVoice { \\voiceOne \\main } + >> + \\layout { } +} +\\paper { +}'; + +?> diff --git a/lib/helpers.php b/lib/helpers.php new file mode 100644 index 0000000..7c75877 --- /dev/null +++ b/lib/helpers.php @@ -0,0 +1,37 @@ + diff --git a/lib/validation.php b/lib/validation.php new file mode 100644 index 0000000..6f910f6 --- /dev/null +++ b/lib/validation.php @@ -0,0 +1,119 @@ + 64) + { + return false; + } + return true; +} + +function is_valid_dynamic($check_dynamic) +{ + if(!is_string($check_dynamic)) + { + return false; + } + $allowed_dynamics_regex = "/^(p{1,5}|f{1,5}|m(p|f)|s(p{1,2}|f{1,2})|fp|(s|r)fz)$/"; + if(!preg_match($allowed_dynamics_regex, $check_dynamic)) + { + return false; + } + return true; +} + +function validate_get_parameter() +{ + if(!(isset($_GET["time"]) && is_valid_time($_GET["time"]))) + { + $_GET["time"] = "4/4"; + } + $_GET["time"] = remove_whitespace($_GET["time"]); + + if(!(isset($_GET["tempo"]) && is_valid_tempo($_GET["tempo"]))) + { + $_GET["tempo"] = "4=90"; + } + $_GET["tempo"] = remove_whitespace($_GET["tempo"]); + + if(!(isset($_GET["bars"]) && is_valid_bars($_GET["bars"]))) + { + $_GET["bars"] = "2"; + } + + if(!(isset($_GET["dynamic_beat"]) && is_valid_dynamic($_GET["dynamic_beat"]))) + { + $_GET["dynamic_beat"] = "pp"; + } + if(!(isset($_GET["dynamic_rhythm"]) && is_valid_dynamic($_GET["dynamic_rhythm"]))) + { + $_GET["dynamic_rhythm"] = "ff"; + } + + if(!(isset($_GET["id"]) && is_string($_GET["id"]) && strlen($_GET["id"]) > 1)) + { + $_GET["id"] = md5(random_bytes(60)); + } +} + +?> diff --git a/locale/de/LC_MESSAGES/rhythm.po b/locale/de/LC_MESSAGES/rhythm.po new file mode 100644 index 0000000..25451a3 --- /dev/null +++ b/locale/de/LC_MESSAGES/rhythm.po @@ -0,0 +1,68 @@ +# This file is distributed under the same license as the rhythm package. +# Serguzim , 2020. +# +msgid "" +msgstr "" +"Project-Id-Version: 0.0.1 VERSION\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2020-03-05 21:21+0100\n" +"PO-Revision-Date: 2020-03-05 18:53+0100\n" +"Last-Translator: \n" +"Language-Team: German \n" +"Language: de\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#: templates/index.tpl.php:26 +msgid "Solution" +msgstr "Lösung" + +#: templates/index.tpl.php:37 +msgid "Generate this rhythm" +msgstr "Erzeuge diesen Rhythmus" + +#: templates/index.tpl.php:38 +msgid "Generate new rhythm" +msgstr "Erzeuge neues Rhythmus" + +#: templates/index.tpl.php:43 +msgid "Anything is possible. Used as seed for the rhythm." +msgstr "Alles ist möglich. Wird als Grundlage für den Rhythmus verwendet." + +#: templates/index.tpl.php:47 +msgid "Time Signature" +msgstr "Taktvorzeichen" + +#: templates/index.tpl.php:50 templates/index.tpl.php:58 +msgid "Examples" +msgstr "Beispiele" + +#: templates/index.tpl.php:54 +msgid "Tempo" +msgstr "Tempo" + +#: templates/index.tpl.php:58 +msgid "click" +msgstr "klick" + +#: templates/index.tpl.php:66 +msgid "Bars" +msgstr "Takte" + +#: templates/index.tpl.php:69 +#, php-format +msgid "Anything between %s and %s" +msgstr "Alles zwischen %s und %s" + +#: templates/index.tpl.php:73 +msgid "Dynamic for Beat" +msgstr "Dynamik für den Beat" + +#: templates/index.tpl.php:80 +msgid "Dynamic for Rhythm" +msgstr "Dynamik für den Rhytmus" + +#~ msgid "Submit" +#~ msgstr "Absenden" diff --git a/locale/en/LC_MESSAGES/rhythm.po b/locale/en/LC_MESSAGES/rhythm.po new file mode 100644 index 0000000..f509faf --- /dev/null +++ b/locale/en/LC_MESSAGES/rhythm.po @@ -0,0 +1,68 @@ +# This file is distributed under the same license as the rhythm package. +# Serguzim , 2020. +# +msgid "" +msgstr "" +"Project-Id-Version: 0.0.1 VERSION\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2020-03-05 21:21+0100\n" +"PO-Revision-Date: 2020-03-05 19:14+0100\n" +"Last-Translator: \n" +"Language-Team: German \n" +"Language: de\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#: templates/index.tpl.php:26 +msgid "Solution" +msgstr "Solution" + +#: templates/index.tpl.php:37 +msgid "Generate this rhythm" +msgstr "Generate this rhythm" + +#: templates/index.tpl.php:38 +msgid "Generate new rhythm" +msgstr "Generate new rhythm" + +#: templates/index.tpl.php:43 +msgid "Anything is possible. Used as seed for the rhythm." +msgstr "Anything is possible. Used as seed for the rhythm." + +#: templates/index.tpl.php:47 +msgid "Time Signature" +msgstr "Time Signature" + +#: templates/index.tpl.php:50 templates/index.tpl.php:58 +msgid "Examples" +msgstr "Examples" + +#: templates/index.tpl.php:54 +msgid "Tempo" +msgstr "Tempo" + +#: templates/index.tpl.php:58 +msgid "click" +msgstr "click" + +#: templates/index.tpl.php:66 +msgid "Bars" +msgstr "Bars" + +#: templates/index.tpl.php:69 +#, php-format +msgid "Anything between %s and %s" +msgstr "Anything between %s and %s" + +#: templates/index.tpl.php:73 +msgid "Dynamic for Beat" +msgstr "Dynamic for Beat" + +#: templates/index.tpl.php:80 +msgid "Dynamic for Rhythm" +msgstr "Dynamic for Rhythm" + +#~ msgid "Submit" +#~ msgstr "Submit" diff --git a/locale/rhythm.pot b/locale/rhythm.pot new file mode 100644 index 0000000..6cfbf2a --- /dev/null +++ b/locale/rhythm.pot @@ -0,0 +1,67 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# FIRST AUTHOR , YEAR. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2020-03-05 21:22+0100\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME \n" +"Language-Team: LANGUAGE \n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=CHARSET\n" +"Content-Transfer-Encoding: 8bit\n" + +#: templates/index.tpl.php:26 +msgid "Solution" +msgstr "" + +#: templates/index.tpl.php:37 +msgid "Generate this rhythm" +msgstr "" + +#: templates/index.tpl.php:38 +msgid "Generate new rhythm" +msgstr "" + +#: templates/index.tpl.php:43 +msgid "Anything is possible. Used as seed for the rhythm." +msgstr "" + +#: templates/index.tpl.php:47 +msgid "Time Signature" +msgstr "" + +#: templates/index.tpl.php:50 templates/index.tpl.php:58 +msgid "Examples" +msgstr "" + +#: templates/index.tpl.php:54 +msgid "Tempo" +msgstr "" + +#: templates/index.tpl.php:58 +msgid "click" +msgstr "" + +#: templates/index.tpl.php:66 +msgid "Bars" +msgstr "" + +#: templates/index.tpl.php:69 +#, php-format +msgid "Anything between %s and %s" +msgstr "" + +#: templates/index.tpl.php:73 +msgid "Dynamic for Beat" +msgstr "" + +#: templates/index.tpl.php:80 +msgid "Dynamic for Rhythm" +msgstr "" diff --git a/messages.po b/messages.po new file mode 100644 index 0000000..6a10bae --- /dev/null +++ b/messages.po @@ -0,0 +1,72 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# FIRST AUTHOR , YEAR. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2020-03-05 21:19+0100\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME \n" +"Language-Team: LANGUAGE \n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: templates/index.tpl.php:26 templates/index.tpl.php:67 +msgid "Solution" +msgstr "" + +#: templates/index.tpl.php:37 +msgid "Generate this rhythm" +msgstr "" + +#: templates/index.tpl.php:38 +msgid "Generate new rhythm" +msgstr "" + +#: templates/index.tpl.php:43 templates/index.tpl.php:19 +msgid "Anything is possible. Used as seed for the rhythm." +msgstr "" + +#: templates/index.tpl.php:47 templates/index.tpl.php:23 +msgid "Time Signature" +msgstr "" + +#: templates/index.tpl.php:50 templates/index.tpl.php:58 +#: templates/index.tpl.php:26 templates/index.tpl.php:34 +msgid "Examples" +msgstr "" + +#: templates/index.tpl.php:54 templates/index.tpl.php:30 +msgid "Tempo" +msgstr "" + +#: templates/index.tpl.php:58 templates/index.tpl.php:34 +msgid "click" +msgstr "" + +#: templates/index.tpl.php:66 templates/index.tpl.php:42 +msgid "Bars" +msgstr "" + +#: templates/index.tpl.php:69 templates/index.tpl.php:45 +#, php-format +msgid "Anything between %s and %s" +msgstr "" + +#: templates/index.tpl.php:73 templates/index.tpl.php:49 +msgid "Dynamic for Beat" +msgstr "" + +#: templates/index.tpl.php:80 templates/index.tpl.php:56 +msgid "Dynamic for Rhythm" +msgstr "" + +#: templates/index.tpl.php:63 +msgid "Submit" +msgstr "" diff --git a/static/res/tempo.png b/static/res/tempo.png new file mode 100644 index 0000000000000000000000000000000000000000..b9d0fa60ed7f13c85e070742921d47d19b93aef5 GIT binary patch literal 25579 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 + + Rhythm Thing + + + + + + +
+
+

Quick Rhythm Maker

+
+
+
+
+ +
+
+
+
+ +
+
+ +
+
+
+
+
+
+ + +
+ ID + + + + +
+
+ + + + : 4/4, 3/4, 6/8, 2/2, 13/8, 11/16, 2/4 + +
+
+ + + + + () + + +
+ +
+
+
+ + + + + +
+
+ + + + ppppp, pppp, ppp, pp, p, mp, mf, f, ff, fff, ffff, fffff, fp, sf, sff, sp, spp, sfz, rfz + +
+
+ + + + ppppp, pppp, ppp, pp, p, mp, mf, f, ff, fff, ffff, fffff, fp, sf, sff, sp, spp, sfz, rfz + +
+
+
+
+