Full-Stack Carnatic Music Notation Engine A human-readable, AI-compatible notation system for Carnatic classical music.
RagaNotate is a full-stack Carnatic music notation system that bridges human musicians and AI/ML systems. It provides:
- A clean ASCII + Unicode notation format for human-readable Carnatic swaras, gamakas, and talas
- A TypeScript/JS library for parsing notation strings into SVG visual output
- A Python package (
raganotate) for parsing, MIDI export, and AI tokenization - A Web UI with a live notation editor and gamaka pitch contour visualizer
- An AI-ready dataset of annotated Carnatic compositions for ML training
Inspired by: srikumarks/carnot · ragasangrah.com · iSargam (Springer 2016) · Sangita Sampradaya Pradarshini
# Octaves
MANDRA: .s .r .g .m .p .d .n (lower octave)
MADHYA: S R G M P D N (middle octave)
TARA: S' R' G' M' P' D' N' (upper octave)
# Duration
S = 1 akshara (full beat)
S; = 2 aksharas (double duration)
S: = 0.5 aksharas (half)
S:: = 0.25 aksharas (quarter)
# Beat Markers
| = Beat separator , = Half-beat gap
|| = Section end - = Rest / pause
_ = Invisible grace gap
# Gamakas
~~ = Kampita (vibrato) ^ = Etra Jaru (slide up)
v = Irakka Jaru (slide down)
* = Nokku (stress) (^) = Sphurita (v) = Pratyaghata
# Example — Adi Tala, Madhya Sthayi
| S R~~ G M | P^D N S' | N v D P | M G R S |
RagaNotate/
├── README.md ← You are here
├── CHANGELOG.md ← Version history
├── SPEC.md ← Full notation specification
├── todo.md ← Project roadmap & master TODO
├── LICENSE
├── .gitignore
├── CONTRIBUTING.md
│
├── spec/
│ ├── PHONETICS.md ← 16 Swarasthana phonetic encoding
│ ├── GAMAKAS.md ← 15 Gamakas reference + AI vectors
│ └── TALAS.md ← Suladi Sapta + Chapu + 108-tala system
│
├── packages/
│ ├── js/ ← TypeScript/JS library
│ │ ├── src/
│ │ │ ├── lexer.ts ← Tokenizer
│ │ │ ├── parser.ts ← AST builder
│ │ │ ├── renderer.ts ← SVG output
│ │ │ ├── gamaka.ts ← Pitch contour engine
│ │ │ └── tala.ts ← Beat pattern generator
│ │ ├── package.json
│ │ └── tsconfig.json
│ │
│ └── python/ ← Python package
│ ├── raganotate/
│ │ ├── __init__.py
│ │ ├── swara.py ← Swara + Swarasthana classes
│ │ ├── gamaka.py ← Gamaka types + AI feature vectors
│ │ ├── tala.py ← Tala + Anga system
│ │ ├── parser.py ← ASCII notation → Python objects
│ │ ├── renderer.py ← MIDI / LilyPond / MusicXML export
│ │ ├── ai_encoder.py ← Notation → AI tokens
│ │ └── dataset.py ← Dataset utilities for ML
│ ├── tests/
│ └── setup.py
│
├── web/ ← Web UI
│ ├── index.html
│ ├── editor.html
│ └── assets/
│
├── examples/ ← Sample compositions
│ ├── ganarajena.txt
│ ├── sri_ganesha.txt
│ └── vathapi.txt
│
└── dataset/ ← AI training data
├── annotated/
└── gamaka_labels.json
| Version | Phase | Status |
|---|---|---|
| v0.1.0 | Phase 1 — Core Specification | ✅ Complete |
| v0.2.0 | Phase 2 — TypeScript Library | 🔲 Next |
| v0.3.0 | Phase 3 — Python raganotate Package |
🔲 Planned |
| v0.4.0 | Phase 4 — Web UI Editor | 🔲 Planned |
| v0.5.0 | Phase 5 — GitHub CI/CD + Examples | 🔲 Planned |
| v1.0.0 | Phase 6 — Dataset + AI Release | 🔲 Planned |
See CHANGELOG.md for full version history and todo.md for detailed task breakdown.
| # | Symbol | Phonetic | AI Token | Ratio | Hz @ Sa=240 |
|---|---|---|---|---|---|
| 1 | S | Sa | SA_0 | 1/1 | 240.00 |
| 2 | r | Ra | RI_1 | 256/243 | 252.84 |
| 3 | R | Ri | RI_2 | 9/8 | 270.00 |
| 4 | g | Ga | GA_1 | 32/27 | 284.44 |
| 5 | G | Gi | GA_2 | 6/5 | 288.00 |
| 6 | G+ | Gu | GA_3 | 5/4 | 300.00 |
| 7 | m | Ma | MA_1 | 4/3 | 320.00 |
| 8 | M | Mi | MA_2 | 45/32 | 337.50 |
| 9 | P | Pa | PA_0 | 3/2 | 360.00 |
| 10 | d | Da | DA_1 | 128/81 | 379.26 |
| 11 | D | Di | DA_2 | 5/3 | 400.00 |
| 12 | n | Na | NI_1 | 16/9 | 426.67 |
| 13 | N | Ni | NI_2 | 9/5 | 432.00 |
| 14 | N+ | Nu | NI_3 | 15/8 | 450.00 |
| 15 | S' | Sa' | SA_0_HI | 2/1 | 480.00 |
| 16 | .s | .sa | SA_0_LO | 1/2 | 120.00 |
from raganotate import swara_hz, print_scale
# Get frequency of any swara
hz = swara_hz("G", octave="tara", sa_hz=240.0)
print(f"Antara Gandharam (tara): {hz} Hz")
# Print full scale for Sa = 261.63 Hz (C4)
print_scale(261.63)- srikumarks/carnot — JavaScript SVG rendering engine for Carnatic notation
- ragasangrah.com/gamakas — Gamaka reference
- iSargam (Springer 2016) — Unicode-based Indian notation encoding
- karnatik.com/symbols — Standard notation symbols
- saayujya.com — Gamaka Notation
- Upbeat Labs — Tala Primer
- Sangita Sampradaya Pradarshini — Subbarama Dikshitar
- Natya Shastra — Bharata Muni
Jags · @jags111 · info@revsmartasia.com
MIT © 2026 Jags (jags111). See LICENSE.