Esempio n. 1
0
def create_song(dir):
    
    """
    Funkcja tworząca piosenkę.
    Argument:
        * dir - folder z plikami piosenki
    """
    
    # wczytujemy plik z własnościami piosenki
    defs = open(dir + '/defs.txt', 'r')
    properties = eval(defs.read())
    defs.close()

    # wczytujemy plik z częstotliwościami nutek
    freq = open('./notes.txt', 'r')
    notes = eval(freq.read())
    freq.close()
    
    # wczytujemy interesujące nas własności
    bpm = properties['bpm']
    
    # wczytujemy plik z kolejnością odgrywanych ścieżek
    song_table = np.genfromtxt(dir + '/song.txt', dtype = 'str')

    # tworzymy słownik ścieżek oraz ich przesunięć i je wczytujemy (by szybciej działało)
    tracks = np.unique(song_table)
    tracks_dict = dict()
    tracks_delays = dict()
    for x in tracks:
        track, track_delay = create_track(dir, x, bpm, notes)
        tracks_dict[x] = track
        tracks_delays[x] = track_delay
    
    # tworzymy piosenkę
    fs = 44100 # częstotliwość
    delay = 0 # przesunięcie ze względu na wczytywane linie ze ścieżkami
    song = np.zeros((0,2))
    for line in song_table:
        song = merge_sounds(song, tracks_dict[line], delay)
        delay += tracks_delays[line]
    sc.write(dir + '.wav', fs, np.int16(song / np.amax(np.abs(song)) * 32767))  
Esempio n. 2
0
def create_track(dir, track_file, bpm, notes):
    
    """
    Funkcja tworząca ścieżkę.
    Argumenty:
        * dir - folder z plikami piosenki
        * track_file - numer pliku ze ścieżką
        * bpm - beats per minute
        * notes - słownik z częstotliwościami nutek
    """
    
    # wczytujemy plik z kolejnością odgrywanych sampli
    track_table = np.genfromtxt(dir + '/track' + track_file + '.txt',
                                dtype = 'str', comments = '"') 
    
    # zczytujemy długości elementów by wiedzieć czy sample czy nutka czy instrument
    n, m = np.shape(track_table)
    lengths = np.zeros((n, m))
    for i in np.arange(n):
        for j in np.arange(m):
            lengths[i, j] = len(track_table[i, j])
    
    # tworzymy słownik pomocniczy z samplami, nutkami i instrumentami (by szybciej działało)
    music_dict = dict()
    
    # dodajemy sample do słownika
    samples = np.unique(track_table[np.where(lengths == 2)])
    for x in samples:
        if x == '--':
            continue
        fs, sample = sc.read(dir + '/sample' + x + '.wav')
        sample = sample / np.amax(sample) # normujemy do jednej głośności
        music_dict[x] = sample
    
    # dodajemy nutki do słownika
    samples_notes = np.unique(track_table[np.where(lengths == 3)])
    for x in samples_notes:
        if x == '---':
            continue
        sound = sound_sin(notes[x], (60 / bpm), 0, 0)
        note = np.repeat(sound, 2)
        note = np.reshape(note, (len(sound), 2))
        note = note / np.amax(note) # normujemy do jednej głośności
        music_dict[x] = note
        
    # dodajemy instrumenty do słownika
    sample_instruments = np.unique(track_table[np.where(lengths == 6)])
    global instrument
    for x in sample_instruments:
        if x == '------':
            continue
        instrument_file = open(dir + '/sample' + x[0:2] + '.txt', 'r')
        instrument_definition = instrument_file.read()
        instrument_file.close()
        exec(instrument_definition)
        instrument = instrument / np.amax(instrument) # normujemy do jednej głośności
        music_dict[x] = instrument
    
    # tworzymy ścieżkę
    fs = 44100 # częstotliwość
    delay = 0 # przesunięcie ze względu na wczytywane linie z samplami
    track = np.zeros((0,2))
    for line in track_table:
        for x in line:
            if (x != '--' and x != '---' and x != '------'):
                track = merge_sounds(track, music_dict[x], delay)
        delay += int((60 / bpm) * fs)

    # informacja z przesunięciem dla całej ścieżki
    track_delay = int(np.shape(track_table)[0] * (60 / bpm) * fs)
    
    return (track, track_delay)