README.md

# Tomusic.AI-1

A lightweight Elixir library for interacting with the tomusic.ai API, providing tools for music analysis and generation. This package facilitates seamless integration with the tomusic.ai platform for Elixir applications.

## Installation

Add `tomusic_ai_1` to your list of dependencies in `mix.exs`:
elixir
def deps do
  [
    {:tomusic_ai_1, "~> 1.0.0"}
  ]
end

Then, run `mix deps.get` to fetch the dependencies.

## Usage

Ensure you have configured your API key using application environment variables:
elixir
config :tomusic_ai_1,
  api_key: System.get_env("TOMUSIC_AI_API_KEY")

Here are some example usage scenarios:

**1. Analyzing Music Structure:**
elixir
alias TomusicAI1.Analysis

song_data = %{title: "My Song", artist: "Some Artist", audio_url: "http://example.com/song.mp3"}

case Analysis.analyze_structure(song_data) do
  {:ok, structure} ->
    IO.puts "Song structure analysis successful:"
    IO.inspect structure
  {:error, reason} ->
    IO.puts "Error analyzing song structure: #{reason}"
end

**2. Generating a Melody based on Mood:**
elixir
alias TomusicAI1.Generation

mood = "happy"

case Generation.generate_melody(mood) do
  {:ok, melody} ->
    IO.puts "Generated melody:"
    IO.inspect melody
  {:error, reason} ->
    IO.puts "Error generating melody: #{reason}"
end

**3. Transcribing Audio to Sheet Music:**
elixir
alias TomusicAI1.Transcription

audio_file_path = "/path/to/audio.wav"

case Transcription.transcribe(audio_file_path) do
  {:ok, sheet_music} ->
    IO.puts "Transcription successful:"
    IO.puts sheet_music
  {:error, reason} ->
    IO.puts "Error transcribing audio: #{reason}"
end

**4. Using Pipes for Sequential Operations:**
elixir
alias TomusicAI1.Analysis
alias TomusicAI1.Generation

song_data = %{title: "Another Song", artist: "Another Artist", audio_url: "http://example.com/another_song.mp3"}

song_data
|> Analysis.analyze_structure()
|> case do
  {:ok, structure} ->
    structure
    |> Map.get(:key) # Example: Access the detected key
    |> Generation.generate_melody() # Example: Generate melody based on key
    |> IO.inspect()
  {:error, reason} ->
    IO.puts "Error: #{reason}"
end

**5. Handling Different Error Scenarios:**
elixir
alias TomusicAI1.Analysis

song_data = %{title: "Broken Song", artist: "Bad Artist", audio_url: "invalid_url"}

case Analysis.analyze_structure(song_data) do
  {:ok, structure} ->
    IO.puts "Analysis successful (unexpectedly):"
    IO.inspect structure
  {:error, :invalid_url} ->
    IO.puts "Invalid URL provided."
  {:error, :api_unavailable} ->
    IO.puts "Tomusic.ai API is currently unavailable."
  {:error, reason} ->
    IO.puts "An unknown error occurred: #{reason}"
end

## Feature Summary

*   **Music Structure Analysis:** Analyze the structure of a given song based on audio data.
*   **Melody Generation:** Generate melodies based on specified moods or parameters.
*   **Audio Transcription:** Transcribe audio files into sheet music notation.
*   **Error Handling:** Provides robust error handling for various API and data issues.
*   **Simple Integration:** Easy to integrate into existing Elixir projects.

## License

MIT

This package is part of the tomusic.ai-1 ecosystem. For advanced features and enterprise-grade tools, visit: https://tomusic.ai/