diff --git a/.gitignore b/.gitignore index 3a59d7509dfd3c8c5f62d45ba36e054e6fdf5ff4..1725bb66d4a9616fd86844b581cf480f53a5a3e3 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,3 @@ .idea/ .venv/ +__pycache__/ \ No newline at end of file diff --git a/main.py b/main.py index c36e955485f06628858b39893b6aa7c341be0c90..27c3ed5d5db710c6d48e9c636f761197d4442eb7 100644 --- a/main.py +++ b/main.py @@ -1,2 +1,37 @@ +import sys +import os.path +import numpy as np +from datetime import datetime + +import musicreader as mr +import musicgenerator as mg + +# constants +TRAINING_INPUT_FILENAME = "input.txt" +TRAINING_INFOS_FILENAME = "training_infos.json" +EMBEDDING_FILENAME = "embeddings.npy" +MODEL_PARAMETER_FILENAME = "model_parameters.pt" + + +# default parameters +trainingFolder = os.path.abspath("./training_data/classical_music/test/") +training = True +outputPath = os.path.abspath("./output.mid") + + +def isTrainingNeeded() -> bool: + # TODO + return training + + if __name__ == '__main__': - print("yo") + + if training or isTrainingNeeded(): + minBpm, maxBpm = mr.readTrainingFolder(trainingFolder, TRAINING_INPUT_FILENAME, TRAINING_INFOS_FILENAME) + mr.createEmbedding(os.path.join(trainingFolder, EMBEDDING_FILENAME), os.path.join(trainingFolder, TRAINING_INPUT_FILENAME)) + mg.train(os.path.join(trainingFolder, TRAINING_INPUT_FILENAME), os.path.join(trainingFolder, EMBEDDING_FILENAME), os.path.join(trainingFolder, MODEL_PARAMETER_FILENAME)) + else: + minBpm, maxBpm = mr.getMinMaxBpm(trainingFolder, TRAINING_INFOS_FILENAME) + + bpm = np.random.randint(minBpm, maxBpm + 1) + mg.generate(outputPath, bpm, os.path.join(trainingFolder, MODEL_PARAMETER_FILENAME)) diff --git a/musicgenerator.py b/musicgenerator.py new file mode 100644 index 0000000000000000000000000000000000000000..a461b1d7e0734f3d57f85e919c7bb25e8b7303be --- /dev/null +++ b/musicgenerator.py @@ -0,0 +1,11 @@ +def train(trainingInputFilePath: str, embeddingFilePath: str, modelParametersFilePath: str): + print(f"training from {trainingInputFilePath}") + print(f"read embedding from {embeddingFilePath}") + print(f"save training in {modelParametersFilePath}") + pass + + +def generate(outputFilePath: str, bpm: int, modelParametersFilePath: str): + print(f"read parameters in {modelParametersFilePath}") + print(f"generate {outputFilePath}") + pass diff --git a/musicreader.py b/musicreader.py new file mode 100644 index 0000000000000000000000000000000000000000..6610c4fcd6fd124c08728b89fa08607897b3e6e5 --- /dev/null +++ b/musicreader.py @@ -0,0 +1,37 @@ +import json +import os + +import music21 + + +def readTrainingFolder(folderPath: str, trainingTextFilename: str, trainingInfoJsonFilename: str) -> (int, int): + """ + Read all midi files and save it into a text file that can be read for the training process. + Also save some info about the training data in trainingInfoJsonFilename. + :param folderPath: path to folder containing all training midi files to read + :param trainingInfoJsonFilename: + :param trainingTextFilename: + :return: min and max bpm of the training data + """ + print(f"read all midi files in {folderPath}") + print(f"save content in {os.path.join(folderPath, trainingTextFilename)}") + print(f"save infos in {os.path.join(folderPath, trainingInfoJsonFilename)}") + return 0, 0 + + +def getMinMaxBpm(folderPath: str, trainingInfoJsonFilename: str) -> (int, int): + """ + ASSUMING THAT THE TRAINING DATA HAS ALREADY BEEN READ ONCE. + Read the trainingInfoJsonFilename file and return the min/max bpm. + :param folderPath: path to folder containing all training midi files + :param trainingInfoJsonFilename: + :return: min and max bpm of the training data + """ + print(f"read infos in {os.path.join(folderPath, trainingInfoJsonFilename)}") + return 0, 0 + + +def createEmbedding(embeddingFilePath: str, trainingTextFilePath: str): + print(f"read {trainingTextFilePath}") + print(f"create embedding {embeddingFilePath}") + pass diff --git a/training_data/classical_music/.DS_Store b/training_data/classical_music/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..7213aaa9f6371e31641db96d670adc4661d4f35e Binary files /dev/null and b/training_data/classical_music/.DS_Store differ diff --git a/training_data/classical_music/bach_846.mid b/training_data/classical_music/bach_846.mid new file mode 100644 index 0000000000000000000000000000000000000000..e279b06060142adefa25200612dc6a268bff3dbb Binary files /dev/null and b/training_data/classical_music/bach_846.mid differ diff --git a/training_data/classical_music/bach_847.mid b/training_data/classical_music/bach_847.mid new file mode 100644 index 0000000000000000000000000000000000000000..70b438479639b7c68742d41a5be9ca776b6f7bf8 Binary files /dev/null and b/training_data/classical_music/bach_847.mid differ diff --git a/training_data/classical_music/bach_850.mid b/training_data/classical_music/bach_850.mid new file mode 100644 index 0000000000000000000000000000000000000000..8a9ec88c1f7b0d76bf4311bae6e15ed2c8cd988e Binary files /dev/null and b/training_data/classical_music/bach_850.mid differ diff --git a/training_data/classical_music/beethoven_hammerklavier_1.mid b/training_data/classical_music/beethoven_hammerklavier_1.mid new file mode 100644 index 0000000000000000000000000000000000000000..e0f2c21f7318c48b008d193773884f333397b0da Binary files /dev/null and b/training_data/classical_music/beethoven_hammerklavier_1.mid differ diff --git a/training_data/classical_music/beethoven_hammerklavier_2.mid b/training_data/classical_music/beethoven_hammerklavier_2.mid new file mode 100644 index 0000000000000000000000000000000000000000..222324f17d57f9718cbb18b456d20f2fccd48379 Binary files /dev/null and b/training_data/classical_music/beethoven_hammerklavier_2.mid differ diff --git a/training_data/classical_music/beethoven_hammerklavier_3.mid b/training_data/classical_music/beethoven_hammerklavier_3.mid new file mode 100644 index 0000000000000000000000000000000000000000..abd9566b3fae370a52e79468eebf223a522b8fe3 Binary files /dev/null and b/training_data/classical_music/beethoven_hammerklavier_3.mid differ diff --git a/training_data/classical_music/beethoven_hammerklavier_4.mid b/training_data/classical_music/beethoven_hammerklavier_4.mid new file mode 100644 index 0000000000000000000000000000000000000000..472077796b6d3682d5947bb9596ef1aae333d1f1 Binary files /dev/null and b/training_data/classical_music/beethoven_hammerklavier_4.mid differ diff --git a/training_data/classical_music/beethoven_les_adieux_1.mid b/training_data/classical_music/beethoven_les_adieux_1.mid new file mode 100644 index 0000000000000000000000000000000000000000..2f5f6e2a87a4bf85210340455dc3f209605c608e Binary files /dev/null and b/training_data/classical_music/beethoven_les_adieux_1.mid differ diff --git a/training_data/classical_music/beethoven_les_adieux_2.mid b/training_data/classical_music/beethoven_les_adieux_2.mid new file mode 100644 index 0000000000000000000000000000000000000000..4425bbe48103f0d28696659ad8c9fcedb0d22e0f Binary files /dev/null and b/training_data/classical_music/beethoven_les_adieux_2.mid differ diff --git a/training_data/classical_music/beethoven_les_adieux_3.mid b/training_data/classical_music/beethoven_les_adieux_3.mid new file mode 100644 index 0000000000000000000000000000000000000000..b46851594a65497e93b5c946a15ce0fb7d3d508f Binary files /dev/null and b/training_data/classical_music/beethoven_les_adieux_3.mid differ diff --git a/training_data/classical_music/beethoven_opus10_1.mid b/training_data/classical_music/beethoven_opus10_1.mid new file mode 100644 index 0000000000000000000000000000000000000000..b7479c82ccac08a0d23225033b559dedfed291ec Binary files /dev/null and b/training_data/classical_music/beethoven_opus10_1.mid differ diff --git a/training_data/classical_music/beethoven_opus10_2.mid b/training_data/classical_music/beethoven_opus10_2.mid new file mode 100644 index 0000000000000000000000000000000000000000..d9b21c8d1032b2a79307b70a5ab73da333ec0f56 Binary files /dev/null and b/training_data/classical_music/beethoven_opus10_2.mid differ diff --git a/training_data/classical_music/beethoven_opus10_3.mid b/training_data/classical_music/beethoven_opus10_3.mid new file mode 100644 index 0000000000000000000000000000000000000000..f909ea4d9c8d9c75a7b2ba230a87b4bc5a875a1a Binary files /dev/null and b/training_data/classical_music/beethoven_opus10_3.mid differ diff --git a/training_data/classical_music/beethoven_opus22_1.mid b/training_data/classical_music/beethoven_opus22_1.mid new file mode 100644 index 0000000000000000000000000000000000000000..82bc3fbd6c470828cf326ba6544cb5a32e720f9a Binary files /dev/null and b/training_data/classical_music/beethoven_opus22_1.mid differ diff --git a/training_data/classical_music/beethoven_opus22_2.mid b/training_data/classical_music/beethoven_opus22_2.mid new file mode 100644 index 0000000000000000000000000000000000000000..069af0d98cbeb299eafc1f5a97db5252f9913e0f Binary files /dev/null and b/training_data/classical_music/beethoven_opus22_2.mid differ diff --git a/training_data/classical_music/beethoven_opus22_3.mid b/training_data/classical_music/beethoven_opus22_3.mid new file mode 100644 index 0000000000000000000000000000000000000000..0911392c4b948ece14ab8f0fd5a0c0e1482ee89b Binary files /dev/null and b/training_data/classical_music/beethoven_opus22_3.mid differ diff --git a/training_data/classical_music/beethoven_opus22_4.mid b/training_data/classical_music/beethoven_opus22_4.mid new file mode 100644 index 0000000000000000000000000000000000000000..95289570364d6d880c916e5d93f9dbba25da4986 Binary files /dev/null and b/training_data/classical_music/beethoven_opus22_4.mid differ diff --git a/training_data/classical_music/beethoven_opus90_1.mid b/training_data/classical_music/beethoven_opus90_1.mid new file mode 100644 index 0000000000000000000000000000000000000000..6e5f3e97ddb7a532d565001dd18ab52b3d62fbd9 Binary files /dev/null and b/training_data/classical_music/beethoven_opus90_1.mid differ diff --git a/training_data/classical_music/beethoven_opus90_2.mid b/training_data/classical_music/beethoven_opus90_2.mid new file mode 100644 index 0000000000000000000000000000000000000000..351117c46a3f5479ee49b17cc1860ff38a0b9643 Binary files /dev/null and b/training_data/classical_music/beethoven_opus90_2.mid differ diff --git a/training_data/classical_music/chp_op18.mid b/training_data/classical_music/chp_op18.mid new file mode 100644 index 0000000000000000000000000000000000000000..df9efad059528c62bbd7971dc726410b25105f17 Binary files /dev/null and b/training_data/classical_music/chp_op18.mid differ diff --git a/training_data/classical_music/chp_op31.mid b/training_data/classical_music/chp_op31.mid new file mode 100644 index 0000000000000000000000000000000000000000..76a6fc4bf34ae460e0f75ed43c14bfeee2247172 Binary files /dev/null and b/training_data/classical_music/chp_op31.mid differ diff --git a/training_data/classical_music/chpn_op10_e01.mid b/training_data/classical_music/chpn_op10_e01.mid new file mode 100644 index 0000000000000000000000000000000000000000..5d9798080c262072e180787fd12d2291d28a7ed3 Binary files /dev/null and b/training_data/classical_music/chpn_op10_e01.mid differ diff --git a/training_data/classical_music/chpn_op10_e05.mid b/training_data/classical_music/chpn_op10_e05.mid new file mode 100644 index 0000000000000000000000000000000000000000..0d0f7b6dadd8116f343c63b7415f70f97b86a432 Binary files /dev/null and b/training_data/classical_music/chpn_op10_e05.mid differ diff --git a/training_data/classical_music/chpn_op10_e12.mid b/training_data/classical_music/chpn_op10_e12.mid new file mode 100644 index 0000000000000000000000000000000000000000..54482032e91e53892acdae29eaa87a03d82b5560 Binary files /dev/null and b/training_data/classical_music/chpn_op10_e12.mid differ diff --git a/training_data/classical_music/chpn_op23.mid b/training_data/classical_music/chpn_op23.mid new file mode 100644 index 0000000000000000000000000000000000000000..d9cfec759734e9c7cd194e1e6400ee2bca63e938 Binary files /dev/null and b/training_data/classical_music/chpn_op23.mid differ diff --git a/training_data/classical_music/chpn_op25_e1.mid b/training_data/classical_music/chpn_op25_e1.mid new file mode 100644 index 0000000000000000000000000000000000000000..8ec7da247ac596718c0318c70e683b1a0693bbd6 Binary files /dev/null and b/training_data/classical_music/chpn_op25_e1.mid differ diff --git a/training_data/classical_music/chpn_op25_e11.mid b/training_data/classical_music/chpn_op25_e11.mid new file mode 100644 index 0000000000000000000000000000000000000000..261f6f6b201799b447cfd9b59d6bf0434cf64eb5 Binary files /dev/null and b/training_data/classical_music/chpn_op25_e11.mid differ diff --git a/training_data/classical_music/chpn_op25_e12.mid b/training_data/classical_music/chpn_op25_e12.mid new file mode 100644 index 0000000000000000000000000000000000000000..2e427aabf89ea7ed471a5ee35808f6d4afdc1765 Binary files /dev/null and b/training_data/classical_music/chpn_op25_e12.mid differ diff --git a/training_data/classical_music/chpn_op25_e2.mid b/training_data/classical_music/chpn_op25_e2.mid new file mode 100644 index 0000000000000000000000000000000000000000..564d29d5922ba3158e485ae9e9925ec3e7645ccc Binary files /dev/null and b/training_data/classical_music/chpn_op25_e2.mid differ diff --git a/training_data/classical_music/chpn_op25_e3.mid b/training_data/classical_music/chpn_op25_e3.mid new file mode 100644 index 0000000000000000000000000000000000000000..a17da9c95da590c2a8bc4f67ef47bfa0ecd444b9 Binary files /dev/null and b/training_data/classical_music/chpn_op25_e3.mid differ diff --git a/training_data/classical_music/chpn_op25_e4.mid b/training_data/classical_music/chpn_op25_e4.mid new file mode 100644 index 0000000000000000000000000000000000000000..305011dae30636e8211234d6be822023a7e1f14f Binary files /dev/null and b/training_data/classical_music/chpn_op25_e4.mid differ diff --git a/training_data/classical_music/chpn_op27_1.mid b/training_data/classical_music/chpn_op27_1.mid new file mode 100644 index 0000000000000000000000000000000000000000..d6607b75cf3f1131e8d9cecfe6054de41b3a5f03 Binary files /dev/null and b/training_data/classical_music/chpn_op27_1.mid differ diff --git a/training_data/classical_music/chpn_op27_2.mid b/training_data/classical_music/chpn_op27_2.mid new file mode 100644 index 0000000000000000000000000000000000000000..02870127003a27d8907668c114e00ed1a5dc48b9 Binary files /dev/null and b/training_data/classical_music/chpn_op27_2.mid differ diff --git a/training_data/classical_music/chpn_op7_1.mid b/training_data/classical_music/chpn_op7_1.mid new file mode 100644 index 0000000000000000000000000000000000000000..739badabc5c6684acb290ffef75c03ec0da220eb Binary files /dev/null and b/training_data/classical_music/chpn_op7_1.mid differ diff --git a/training_data/classical_music/chpn_op7_2.mid b/training_data/classical_music/chpn_op7_2.mid new file mode 100644 index 0000000000000000000000000000000000000000..5fc9f9c7e9935e5fbc742918805a004eba249215 Binary files /dev/null and b/training_data/classical_music/chpn_op7_2.mid differ diff --git a/training_data/classical_music/elise.mid b/training_data/classical_music/elise.mid new file mode 100644 index 0000000000000000000000000000000000000000..958a295e134fddd58ecf5f2f84005b57321891e9 Binary files /dev/null and b/training_data/classical_music/elise.mid differ diff --git a/training_data/classical_music/mz_311_1.mid b/training_data/classical_music/mz_311_1.mid new file mode 100644 index 0000000000000000000000000000000000000000..b5f74cb95046c78953474a0f4a85875540c235f5 Binary files /dev/null and b/training_data/classical_music/mz_311_1.mid differ diff --git a/training_data/classical_music/mz_311_2.mid b/training_data/classical_music/mz_311_2.mid new file mode 100644 index 0000000000000000000000000000000000000000..c89003803ad2dd2f9af6b58e5267b6e53e3393e8 Binary files /dev/null and b/training_data/classical_music/mz_311_2.mid differ diff --git a/training_data/classical_music/mz_311_3.mid b/training_data/classical_music/mz_311_3.mid new file mode 100644 index 0000000000000000000000000000000000000000..f14135acff832cf951d55405671d959363b864ca Binary files /dev/null and b/training_data/classical_music/mz_311_3.mid differ diff --git a/training_data/classical_music/mz_330_1.mid b/training_data/classical_music/mz_330_1.mid new file mode 100644 index 0000000000000000000000000000000000000000..70fcc6784bc5cd43a2812bff6f0d9c5ebcec1fe1 Binary files /dev/null and b/training_data/classical_music/mz_330_1.mid differ diff --git a/training_data/classical_music/mz_330_2.mid b/training_data/classical_music/mz_330_2.mid new file mode 100644 index 0000000000000000000000000000000000000000..1499cc026ccd24f7ce9db86d406f4c32a379c51e Binary files /dev/null and b/training_data/classical_music/mz_330_2.mid differ diff --git a/training_data/classical_music/mz_330_3.mid b/training_data/classical_music/mz_330_3.mid new file mode 100644 index 0000000000000000000000000000000000000000..38c929a733741dd7e03ca2cbc271198fd4b5d9ef Binary files /dev/null and b/training_data/classical_music/mz_330_3.mid differ diff --git a/training_data/classical_music/mz_331_1.mid b/training_data/classical_music/mz_331_1.mid new file mode 100644 index 0000000000000000000000000000000000000000..81edeafc58d95ebb21342a11aab147a8753d2cbf Binary files /dev/null and b/training_data/classical_music/mz_331_1.mid differ diff --git a/training_data/classical_music/mz_331_2.mid b/training_data/classical_music/mz_331_2.mid new file mode 100644 index 0000000000000000000000000000000000000000..eb1ba7aae6779649ba063a84823ab33514876409 Binary files /dev/null and b/training_data/classical_music/mz_331_2.mid differ diff --git a/training_data/classical_music/mz_331_3.mid b/training_data/classical_music/mz_331_3.mid new file mode 100644 index 0000000000000000000000000000000000000000..403fc89836e33099bc331c40609eb14e15d13e4a Binary files /dev/null and b/training_data/classical_music/mz_331_3.mid differ diff --git a/training_data/classical_music/mz_332_1.mid b/training_data/classical_music/mz_332_1.mid new file mode 100644 index 0000000000000000000000000000000000000000..0dc2d8b99f2a8c7712c73449684822f28ba7ad77 Binary files /dev/null and b/training_data/classical_music/mz_332_1.mid differ diff --git a/training_data/classical_music/mz_332_2.mid b/training_data/classical_music/mz_332_2.mid new file mode 100644 index 0000000000000000000000000000000000000000..59103600f5add1dc6d574f01657e440fb808d852 Binary files /dev/null and b/training_data/classical_music/mz_332_2.mid differ diff --git a/training_data/classical_music/mz_332_3.mid b/training_data/classical_music/mz_332_3.mid new file mode 100644 index 0000000000000000000000000000000000000000..a351b1ce04328653b00718abffc657cc99c053a0 Binary files /dev/null and b/training_data/classical_music/mz_332_3.mid differ diff --git a/training_data/classical_music/mz_333_1.mid b/training_data/classical_music/mz_333_1.mid new file mode 100644 index 0000000000000000000000000000000000000000..c4b5d74a896ffd5b4c8193e009df058579da809a Binary files /dev/null and b/training_data/classical_music/mz_333_1.mid differ diff --git a/training_data/classical_music/mz_333_2.mid b/training_data/classical_music/mz_333_2.mid new file mode 100644 index 0000000000000000000000000000000000000000..df3d6febe78032da03eafd95e1763ee501fd3f61 Binary files /dev/null and b/training_data/classical_music/mz_333_2.mid differ diff --git a/training_data/classical_music/mz_333_3.mid b/training_data/classical_music/mz_333_3.mid new file mode 100644 index 0000000000000000000000000000000000000000..de036dcf2559e2540a4dcb21c474584ad979146e Binary files /dev/null and b/training_data/classical_music/mz_333_3.mid differ diff --git a/training_data/classical_music/mz_545_1.mid b/training_data/classical_music/mz_545_1.mid new file mode 100644 index 0000000000000000000000000000000000000000..924e6c68b303f689b73350041a090801622ecfb8 Binary files /dev/null and b/training_data/classical_music/mz_545_1.mid differ diff --git a/training_data/classical_music/mz_545_2.mid b/training_data/classical_music/mz_545_2.mid new file mode 100644 index 0000000000000000000000000000000000000000..42409685871ba25b8ebd6ae43b23ddaedd9ecba9 Binary files /dev/null and b/training_data/classical_music/mz_545_2.mid differ diff --git a/training_data/classical_music/mz_545_3.mid b/training_data/classical_music/mz_545_3.mid new file mode 100644 index 0000000000000000000000000000000000000000..57aa8f23ca28ce1d1f2f844f4a6a0a49b54e7506 Binary files /dev/null and b/training_data/classical_music/mz_545_3.mid differ diff --git a/training_data/classical_music/mz_570_1.mid b/training_data/classical_music/mz_570_1.mid new file mode 100644 index 0000000000000000000000000000000000000000..40f8bbec9d998c9cf9826bd5a9a83dea612ab587 Binary files /dev/null and b/training_data/classical_music/mz_570_1.mid differ diff --git a/training_data/classical_music/mz_570_2.mid b/training_data/classical_music/mz_570_2.mid new file mode 100644 index 0000000000000000000000000000000000000000..105458aaa190a981f30df481d7e2e0a777eaa13c Binary files /dev/null and b/training_data/classical_music/mz_570_2.mid differ diff --git a/training_data/classical_music/mz_570_3.mid b/training_data/classical_music/mz_570_3.mid new file mode 100644 index 0000000000000000000000000000000000000000..f454d83b50b2793e74dd1de9ba94e9ff8e78062a Binary files /dev/null and b/training_data/classical_music/mz_570_3.mid differ diff --git a/training_data/classical_music/test/bach_846.mid b/training_data/classical_music/test/bach_846.mid new file mode 100644 index 0000000000000000000000000000000000000000..e279b06060142adefa25200612dc6a268bff3dbb Binary files /dev/null and b/training_data/classical_music/test/bach_846.mid differ diff --git a/training_data/classical_music/test/bach_847.mid b/training_data/classical_music/test/bach_847.mid new file mode 100644 index 0000000000000000000000000000000000000000..70b438479639b7c68742d41a5be9ca776b6f7bf8 Binary files /dev/null and b/training_data/classical_music/test/bach_847.mid differ