File size: 1,678 Bytes
9a55333
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
import tensorflow as tf
from tensorflow.keras.layers import LSTM, Dense, Embedding
from tensorflow.keras.models import Sequential
import numpy as np

class MusicGenerator:
    def __init__(self, vocab_size):
        self.model = Sequential([
            Embedding(vocab_size, 128, input_length=1),
            LSTM(256, return_sequences=True),
            LSTM(256),
            Dense(vocab_size, activation='softmax')
        ])
        self.model.compile(optimizer='adam', loss='sparse_categorical_crossentropy')
        self.vocab_size = vocab_size

    def train(self, sequences, epochs=10):
        X = np.array([s[:-1] for s in sequences])
        y = np.array([s[1:] for s in sequences])
        self.model.fit(X, y, epochs=epochs)

    def generate(self, start_sequence, length=10):
        result = start_sequence
        current_sequence = np.array(start_sequence)
        for _ in range(length):
            predicted_probs = self.model.predict(current_sequence, verbose=0)[0]
            predicted_id = np.random.choice(len(predicted_probs), p=predicted_probs)
            result.append(predicted_id)
            current_sequence = np.array([predicted_id])
        return result

if __name__ == '__main__':
    # Example usage
    vocab_size = 12  # C, C#, D, ...
    generator = MusicGenerator(vocab_size)

    # Dummy training data (replace with real data)
    sequences = [
        [0, 4, 7, 0], # Cmaj -> C
        [5, 9, 0, 5]  # Fmaj -> F
    ]
    generator.train(sequences)

    # Generate a new sequence
    start_sequence = [0] # Start with C
    generated_sequence = generator.generate(start_sequence)
    print("Generated sequence:", generated_sequence)