{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "0",
   "metadata": {},
   "outputs": [],
   "source": [
    "from suno_utils.audio import Audio\n",
    "import requests\n",
    "import os"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "1",
   "metadata": {},
   "outputs": [],
   "source": [
    "params = {\n",
    "    \"gen_id\": \"f62ab88d-0d12-4d31-bc7a-89b36730b6c5\",\n",
    "    \"min_loop_length_bars\": 2,\n",
    "    \"max_loop_length_bars\": 4,\n",
    "    #\"override_target_tempo\": 144,\n",
    "    #\"confidence_cutoff\": 0.8,\n",
    "    \"output_stems\": True,\n",
    "}\n",
    "\n",
    "response = requests.get(\n",
    "    \"https://suno-ai--loop-extraction-dev-extract-loop-points.modal.run\",\n",
    "    params=params\n",
    ")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "2",
   "metadata": {},
   "outputs": [],
   "source": [
    "response_json = response.json()\n",
    "gen_id = response_json['gen_id']\n",
    "loops = response_json['loops']\n",
    "print(gen_id)\n",
    "print(f\"Found {len(loops)} loops\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "3",
   "metadata": {},
   "outputs": [],
   "source": [
    "audio_paths = []\n",
    "response_json = response.json()\n",
    "for loop, loop_data in response_json[\"loops\"].items():\n",
    "    bars = loop_data[\"bar_length\"]\n",
    "    tempo = loop_data[\"tempo\"]\n",
    "    print(f\"{bars} bars, {tempo} bpm\")\n",
    "    if \"s3_path\" in loop_data:\n",
    "        parent_loop = loop_data[\"s3_path\"]\n",
    "        print(f\"Parent: {parent_loop}\")\n",
    "        audio_paths.append(parent_loop)\n",
    "    if \"stems\" in loop_data:\n",
    "        stems = loop_data[\"stems\"]\n",
    "        stem_loudness = loop_data[\"loudness_metrics\"]\n",
    "        for stem, loudness in zip(stems, stem_loudness):\n",
    "            if loudness and loudness[\"peak_db\"] > -10:\n",
    "                print(stem, loudness[\"peak_db\"])\n",
    "                audio_paths.append(stem)\n",
    "\n",
    "print(audio_paths)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "4",
   "metadata": {},
   "outputs": [],
   "source": [
    "audios = [Audio.from_s3(ap) for ap in audio_paths]\n",
    "\n",
    "for audio in audios:\n",
    "    audio_loop = Audio.concatenate([audio, audio, audio])\n",
    "    audio_loop.play()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "5",
   "metadata": {},
   "outputs": [],
   "source": [
    "output_dir = f\"/home/sara/sara/{gen_id}\"\n",
    "os.makedirs(output_dir, exist_ok=True)\n",
    "\n",
    "for idx, audio in enumerate(audios):\n",
    "    local_fp = os.path.join(output_dir, f\"{idx}.wav\")\n",
    "    audio.write_wav(local_fp)"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "suno_clean",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.10.15"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
