From eab831fe8bee7c75ac15e13c1a3e5434fa694fa8 Mon Sep 17 00:00:00 2001 From: Navan Chauhan Date: Mon, 9 Mar 2020 22:25:20 +0530 Subject: [PATCH] Initial Commit --- .gitignore | 2 + README.md | 47 ++++++++++++++ VaporSong.py | 180 +++++++++++++++++++++++++++++++++++++++++++++++++++ get-beats | Bin 0 -> 183527 bytes main.py | 127 ++++++++++++++++++++++++++++++++++++ 5 files changed, 356 insertions(+) create mode 100644 .gitignore create mode 100644 README.md create mode 100644 VaporSong.py create mode 100755 get-beats create mode 100644 main.py diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..ac43ebc --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +*.pyc +*.py~ diff --git a/README.md b/README.md new file mode 100644 index 0000000..2e5c6e0 --- /dev/null +++ b/README.md @@ -0,0 +1,47 @@ +# V A P O R W A V E +A vaporwave music (+art, +video soon, I promise) generator bodged together using code from various sources ( Hopefully I have credited all of them in the source code). Runs on Python3 + +## Installation + +This was tested on macOS Catalina ( so should work on almost all macOS versions). +Windows is unsupported at this time ( I need to find a way to use aubio's python module) + +### Dependencies + +#### Linux + +``` +sudo apt install ffmpeg libavl1 sox +pip install -r requirements.txt +``` + +#### macOS + +Make sure you have brew installed + +``` +brew install noah # I would have had to re-compile the executeable :( +brew install sox +pip install -r requirements.txt + +## Usage + +### YouTube URL +``` +python3 main.py +``` +### Song Title +``` +python3 main.py Song Title +``` + +## Bugs + +This project is a result of bodging and therefore has tons of bugs which need to be ironed out + +## To-Do + +[ ] Move away from using os.system calls, and use Python modules instead ( Looking at you, Sox and aubio) +[ ] Clean the Code +[ ] Add Artwork Generator +[ ] Add Video Generator diff --git a/VaporSong.py b/VaporSong.py new file mode 100644 index 0000000..0d55a97 --- /dev/null +++ b/VaporSong.py @@ -0,0 +1,180 @@ +import os +import subprocess +import re +from random import randint + +import logzero +from logzero import logger +from logzero import setup_logger + +CONFIDENCE_THRESH = 0.02 + +class VaporSong: + + # Slows down Track + + def slow_down(src, rate, dest): + cmd = "sox -G -D " + src + " " + dest + " speed " + str(rate) + os.system(cmd) + return dest + + # Adds Reverb + + def reverbize(src, dest): + cmd = "sox -G -D " + src + " " + dest + " reverb 100 fade 5 -0 7" # idk what this does tbh, https://stackoverflow.com/a/57767238/8386344 + os.system(cmd) + return dest + + + # Crops "src" from "start" plus "start + dur" and return it in "dest" + def crop(src,dest,start,dur): + cmd = "sox " + src + " " + dest + " trim " + " " + str(start) + " " + str(dur) + os.system(cmd) + + + # Randomly crops a part of the song of at most max_sec_len. + def random_crop(src, max_sec_len, dest): + out = subprocess.check_output(["soxi","-D",src]).rstrip() + f_len = int(float(out)) + if (f_len <= max_sec_len): + os.system("cp " + src + " " + dest) + return + else: + start_region = f_len - max_sec_len + start = randint(0,start_region) + VaporSong.crop(src,dest,start,max_sec_len) + + + # Given a file, returns a list of [beats, confidence], executable based on audibo's test-beattracking.c + # TODO: Move away from executable and use aubio's Python module + def fetchbeats(src): + beat_matrix = [] + if os.name == 'posix': + beats = subprocess.check_output(["noah", "get-beats",src]).rstrip() + else: + beats = subprocess.check_output(["get-beats",src]).rstrip() + beats_ary = beats.splitlines() + for i in beats_ary: + record = i.split() + record[0] = float(record[0])/1000.0 + record[1] = float(record[1]) + beat_matrix.append(record) + return beat_matrix + + # Splits an audio file into beats according to beat_matrix list + + def split_beat(src,beat_matrix): + split_files = [] + for i in range(0,len(beat_matrix)-1): + + if(beat_matrix[i][1] > CONFIDENCE_THRESH): + dur = (beat_matrix[i+1][0] - beat_matrix[i][0]) + out = src.split(".")[0]+str(i)+".wav" + VaporSong.crop(src,out,beat_matrix[i][0],dur) + split_files.append(out) + return split_files + + # Combines a list of sections + + def combine(sections,dest): + tocomb = [] + tocomb.append("sox") + tocomb.append("-G") + for section in sections: + for sample in section: + tocomb.append(sample) + tocomb.append(dest) + tmpFileLimit = len(tocomb) + 256 # in case the program messes up, it does not actually frick up your system + os.system("ulimit -n " + str(tmpFileLimit)) + subprocess.check_output(tocomb) + return dest + + # Arbitrarily groups beats into lists of 4, 6, 8, or 9, perfect for looping. + + def generate_sections(ary): + sections = [] + beats = [4,6,8,9] + index = 0 + while(index != len(ary)): + current_beat = beats[randint(0,len(beats)-1)] + new_section = [] + while((current_beat != 0) and (index != len(ary))): + new_section.append(ary[index]) + current_beat -= 1 + index += 1 + sections.append(new_section) + return sections + + + # given a list of sections, selects some of them and duplicates them, perfect for that vaporwave looping effect + def dup_sections(sections): + new_section = [] + for section in sections: + new_section.append(section) + if(randint(0,1) == 0): + new_section.append(section) + return new_section + + # a passage is a list of sections. This takes some sections and groups them into passages. + + def make_passages(sections): + passages = [] + index = 0 + while(index != len(sections)): + passage_len = randint(1,4) + passage = [] + while(index != len(sections) and passage_len > 0): + passage.append(sections[index]) + index += 1 + passage_len -= 1 + passages.append(passage) + return passages + + # Given all of our passages, picks some of them and inserts them into a list some number of times. + + def reorder_passages(passages): + new_passages = [] + passage_count = randint(5,12) + while(passage_count != 0): + passage = passages[randint(0,len(passages)-1)] + passage_count -= 1 + dup = randint(1,4) + while(dup != 0): + dup -= 1 + new_passages.append(passage) + return new_passages + + # converts a list of passages to a list of sections. + + def flatten(passages): + sections = [] + for passage in passages: + for section in passage: + sections.append(section) + return sections + + # It's all coming together + + def vaporize_song(fname, title): + logger.info("Slowing down the music") + VaporSong.slow_down(fname, 0.7, "beats/out.wav") + #logger.info("Cropping") + #VaporSong.random_crop("beats/out.wav",150,"beats/outcrop.wav") + logger.info("Doing Beat Analysis") + bm = VaporSong.fetchbeats("beats/out.wav") + logger.info("Split into beats") + splitd = VaporSong.split_beat("beats/out.wav",bm) + #group beats to sections + logger.info("Divide into sections") + sections = VaporSong.generate_sections(splitd) + logger.info("Duping Sections") + sdup = VaporSong.dup_sections(sections) + # group sections into passages + paslist = VaporSong.make_passages(sdup) + # reorder packages + pasloop = VaporSong.reorder_passages(paslist) + sectionflat = VaporSong.flatten(pasloop) + logger.info("Mastering & Reverbing") + VaporSong.combine(sectionflat,"beats/out_norev.wav") + VaporSong.reverbize("beats/out_norev.wav","./" + (re.sub(r"\W+|_", " ", title)).replace(" ","_") + ".wav") + logger.info("Generated V A P O R W A V E") diff --git a/get-beats b/get-beats new file mode 100755 index 0000000000000000000000000000000000000000..cbe5203aa24ee67eda3e579cc1510c014f169d3c GIT binary patch literal 183527 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%0A% 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 5): + # get first video that fits the limit duration + logger.info("Got video: " + str(full_title)) + file_title = info['title'] + break + + # if we ran out of urls, return error + if (not info): + raise ValueError('Could not find a video.') + + # query was a youtube link + else: + logger.info("Query was a YouTube URL.") + url = query + info = youtube_dl.YoutubeDL(ydl_opts).extract_info(url,download = False) + file_title = info['title'] + # check if video fits limit duration + if (info['duration'] < 5 or info['duration'] > MAX_DURATION): + raise ValueError('Video is too short. Need 5 seconds or more.') + + # download video and extract audio + logger.info("Downloading video...") + with youtube_dl.YoutubeDL(ydl_opts) as ydl: + try: + ydl.download([url]) + except Exception as e: + logger.error(e) + raise ValueError('Could not download ' + str(full_title) + '.') + + return original_path, file_title + + +def gen_vapor(filePath, title): + # Delete stuff if there is anything left over. + os.system("rm -r download/") + os.system("rm -r beats/") + + # Make the proper folders for intermediate steps + os.system("mkdir download/") + os.system("mkdir beats/") + + + # Download the youtube query's first result. Might be wrong but YOLO + #YTDownloader.download_wav_to_samp2(query) + + # For every song in download folder(just one for now) + """ + for fs in os.listdir("download/"): + # Slow down the song. + VaporSong.vaporize_song(query,"download/"+fs) + pass + # When we are finished, delete the old folders. + """ + VaporSong.vaporize_song(filePath, title) + + os.system("rm -r download/") + os.system("rm -r beats/") + + + +## Makes this a command line tool: disable when we get the webserver going +sys.argv.pop(0) +query = "" +for s in sys.argv: + query = query + s + +name, title = download_file(query) +gen_vapor(name, title)