# Experiment 6: Generated music analysis: WAV check, waveform, spectrogram
# Requires: librosa, soundfile, matplotlib | uses music.wav (included in this package)
# Exact code of Exp6.ipynb. Notebook-only lines (!pip / %pip) are kept as comments so the file runs as normal Python.
# ===========================================================================

# %pip install -q librosa matplotlib soundfile

import os
import numpy as np
import librosa
import librosa.display
import soundfile as sf
import matplotlib.pyplot as plt
from IPython.display import Audio, display

WAV_PATH = "music.wav"

audio, sr = sf.read(WAV_PATH)

print("Sample rate:", sr)
print("Duration:", round(len(audio) / sr, 2), "seconds")
print("Valid audio:", len(audio) > 0 and np.isfinite(audio).all())

display(Audio(audio.T, rate=sr))

# Convert stereo audio to mono for plotting
mono = audio.mean(axis=1) if audio.ndim == 2 else audio

time_axis = np.arange(len(mono)) / sr

plt.figure(figsize=(10, 3))
plt.plot(time_axis, mono)
plt.xlabel("Time (seconds)")
plt.ylabel("Amplitude")
plt.title("Waveform of Generated Jazz Music")
plt.grid()
plt.show()

D = librosa.stft(mono)
S_db = librosa.amplitude_to_db(np.abs(D), ref=np.max)

plt.figure(figsize=(10, 4))
librosa.display.specshow(
    S_db,
    sr=sr,
    x_axis="time",
    y_axis="log"
)
plt.colorbar(format="%+2.0f dB")
plt.title("Spectrogram of Generated Jazz Music")
plt.show()
