vikramvasudevan commited on
Commit
760ffcb
·
verified ·
1 Parent(s): 8108d0e

Upload folder using huggingface_hub

Browse files
This view is limited to 50 files because it contains too many changes.   See raw diff
Files changed (50) hide show
  1. .gitattributes +44 -35
  2. .gitignore +2 -0
  3. .gradioignore +2 -0
  4. README.md +5 -4
  5. app.py +320 -0
  6. data/audio/swarams/c_ak_da1.mp3 +3 -0
  7. data/audio/swarams/c_ak_da1_higher.mp3 +3 -0
  8. data/audio/swarams/c_ak_da1_lower.mp3 +3 -0
  9. data/audio/swarams/c_ak_da2.mp3 +3 -0
  10. data/audio/swarams/c_ak_da2_lower.mp3 +3 -0
  11. data/audio/swarams/c_ak_da3.mp3 +3 -0
  12. data/audio/swarams/c_ak_da3_lower.mp3 +3 -0
  13. data/audio/swarams/c_ak_ga1.mp3 +3 -0
  14. data/audio/swarams/c_ak_ga1_higher.mp3 +3 -0
  15. data/audio/swarams/c_ak_ga2.mp3 +3 -0
  16. data/audio/swarams/c_ak_ga2_higher.mp3 +3 -0
  17. data/audio/swarams/c_ak_ga3.mp3 +3 -0
  18. data/audio/swarams/c_ak_ga3_higher.mp3 +3 -0
  19. data/audio/swarams/c_ak_gamakam_ga3_pa.mp3 +3 -0
  20. data/audio/swarams/c_ak_gamakam_pa_da2.mp3 +3 -0
  21. data/audio/swarams/c_ak_gamakam_sa_higher_da2.mp3 +3 -0
  22. data/audio/swarams/c_ak_gamakam_sa_ri2.mp3 +3 -0
  23. data/audio/swarams/c_ak_ma1.mp3 +3 -0
  24. data/audio/swarams/c_ak_ma1_higher.mp3 +3 -0
  25. data/audio/swarams/c_ak_ma1_lower.mp3 +3 -0
  26. data/audio/swarams/c_ak_ma2.mp3 +3 -0
  27. data/audio/swarams/c_ak_ma2_higher.mp3 +3 -0
  28. data/audio/swarams/c_ak_ma2_lower.mp3 +3 -0
  29. data/audio/swarams/c_ak_ni1.mp3 +3 -0
  30. data/audio/swarams/c_ak_ni1_lower.mp3 +3 -0
  31. data/audio/swarams/c_ak_ni2.mp3 +3 -0
  32. data/audio/swarams/c_ak_ni2_lower.mp3 +3 -0
  33. data/audio/swarams/c_ak_ni3.mp3 +3 -0
  34. data/audio/swarams/c_ak_ni3_lower.mp3 +3 -0
  35. data/audio/swarams/c_ak_pa.mp3 +3 -0
  36. data/audio/swarams/c_ak_pa_higher.mp3 +3 -0
  37. data/audio/swarams/c_ak_pa_lower.mp3 +3 -0
  38. data/audio/swarams/c_ak_ri1.mp3 +3 -0
  39. data/audio/swarams/c_ak_ri1_higher.mp3 +3 -0
  40. data/audio/swarams/c_ak_ri2.mp3 +3 -0
  41. data/audio/swarams/c_ak_ri2_higher.mp3 +3 -0
  42. data/audio/swarams/c_ak_ri3.mp3 +3 -0
  43. data/audio/swarams/c_ak_ri3_higher.mp3 +3 -0
  44. data/audio/swarams/c_ak_sa.mp3 +3 -0
  45. data/audio/swarams/c_ak_sa_higher.mp3 +3 -0
  46. data/audio/swarams/c_ak_silence.mp3 +0 -0
  47. data/audio/swarams/c_ak_tanpura.mp3 +3 -0
  48. data/audio/swarams/c_ak_tanpura_ma1.mp3 +3 -0
  49. data/audio/swarams/c_ak_tanpura_ma2.mp3 +3 -0
  50. data/audio/swarams/c_sw_da1.mp3 +3 -0
.gitattributes CHANGED
@@ -1,35 +1,44 @@
1
- *.7z filter=lfs diff=lfs merge=lfs -text
2
- *.arrow filter=lfs diff=lfs merge=lfs -text
3
- *.bin filter=lfs diff=lfs merge=lfs -text
4
- *.bz2 filter=lfs diff=lfs merge=lfs -text
5
- *.ckpt filter=lfs diff=lfs merge=lfs -text
6
- *.ftz filter=lfs diff=lfs merge=lfs -text
7
- *.gz filter=lfs diff=lfs merge=lfs -text
8
- *.h5 filter=lfs diff=lfs merge=lfs -text
9
- *.joblib filter=lfs diff=lfs merge=lfs -text
10
- *.lfs.* filter=lfs diff=lfs merge=lfs -text
11
- *.mlmodel filter=lfs diff=lfs merge=lfs -text
12
- *.model filter=lfs diff=lfs merge=lfs -text
13
- *.msgpack filter=lfs diff=lfs merge=lfs -text
14
- *.npy filter=lfs diff=lfs merge=lfs -text
15
- *.npz filter=lfs diff=lfs merge=lfs -text
16
- *.onnx filter=lfs diff=lfs merge=lfs -text
17
- *.ot filter=lfs diff=lfs merge=lfs -text
18
- *.parquet filter=lfs diff=lfs merge=lfs -text
19
- *.pb filter=lfs diff=lfs merge=lfs -text
20
- *.pickle filter=lfs diff=lfs merge=lfs -text
21
- *.pkl filter=lfs diff=lfs merge=lfs -text
22
- *.pt filter=lfs diff=lfs merge=lfs -text
23
- *.pth filter=lfs diff=lfs merge=lfs -text
24
- *.rar filter=lfs diff=lfs merge=lfs -text
25
- *.safetensors filter=lfs diff=lfs merge=lfs -text
26
- saved_model/**/* filter=lfs diff=lfs merge=lfs -text
27
- *.tar.* filter=lfs diff=lfs merge=lfs -text
28
- *.tar filter=lfs diff=lfs merge=lfs -text
29
- *.tflite filter=lfs diff=lfs merge=lfs -text
30
- *.tgz filter=lfs diff=lfs merge=lfs -text
31
- *.wasm filter=lfs diff=lfs merge=lfs -text
32
- *.xz filter=lfs diff=lfs merge=lfs -text
33
- *.zip filter=lfs diff=lfs merge=lfs -text
34
- *.zst filter=lfs diff=lfs merge=lfs -text
35
- *tfevents* filter=lfs diff=lfs merge=lfs -text
 
 
 
 
 
 
 
 
 
 
1
+ *.7z filter=lfs diff=lfs merge=lfs -text
2
+ *.arrow filter=lfs diff=lfs merge=lfs -text
3
+ *.bin filter=lfs diff=lfs merge=lfs -text
4
+ *.bz2 filter=lfs diff=lfs merge=lfs -text
5
+ *.ckpt filter=lfs diff=lfs merge=lfs -text
6
+ *.ftz filter=lfs diff=lfs merge=lfs -text
7
+ *.gz filter=lfs diff=lfs merge=lfs -text
8
+ *.h5 filter=lfs diff=lfs merge=lfs -text
9
+ *.joblib filter=lfs diff=lfs merge=lfs -text
10
+ *.lfs.* filter=lfs diff=lfs merge=lfs -text
11
+ *.mlmodel filter=lfs diff=lfs merge=lfs -text
12
+ *.model filter=lfs diff=lfs merge=lfs -text
13
+ *.msgpack filter=lfs diff=lfs merge=lfs -text
14
+ *.npy filter=lfs diff=lfs merge=lfs -text
15
+ *.npz filter=lfs diff=lfs merge=lfs -text
16
+ *.onnx filter=lfs diff=lfs merge=lfs -text
17
+ *.ot filter=lfs diff=lfs merge=lfs -text
18
+ *.parquet filter=lfs diff=lfs merge=lfs -text
19
+ *.pb filter=lfs diff=lfs merge=lfs -text
20
+ *.pickle filter=lfs diff=lfs merge=lfs -text
21
+ *.pkl filter=lfs diff=lfs merge=lfs -text
22
+ *.pt filter=lfs diff=lfs merge=lfs -text
23
+ *.pth filter=lfs diff=lfs merge=lfs -text
24
+ *.rar filter=lfs diff=lfs merge=lfs -text
25
+ *.safetensors filter=lfs diff=lfs merge=lfs -text
26
+ saved_model/**/* filter=lfs diff=lfs merge=lfs -text
27
+ *.tar.* filter=lfs diff=lfs merge=lfs -text
28
+ *.tar filter=lfs diff=lfs merge=lfs -text
29
+ *.tflite filter=lfs diff=lfs merge=lfs -text
30
+ *.tgz filter=lfs diff=lfs merge=lfs -text
31
+ *.wasm filter=lfs diff=lfs merge=lfs -text
32
+ *.xz filter=lfs diff=lfs merge=lfs -text
33
+ *.zip filter=lfs diff=lfs merge=lfs -text
34
+ *.zst filter=lfs diff=lfs merge=lfs -text
35
+ *tfevents* filter=lfs diff=lfs merge=lfs -text
36
+ *.mp3 filter=lfs diff=lfs merge=lfs -text
37
+ *.gitignore filter=lfs diff=lfs merge=lfs -text
38
+ *.gradioignore filter=lfs diff=lfs merge=lfs -text
39
+ *.md filter=lfs diff=lfs merge=lfs -text
40
+ *.py filter=lfs diff=lfs merge=lfs -text
41
+ *.json filter=lfs diff=lfs merge=lfs -text
42
+ *.toml filter=lfs diff=lfs merge=lfs -text
43
+ *.txt filter=lfs diff=lfs merge=lfs -text
44
+ *.lock filter=lfs diff=lfs merge=lfs -text
.gitignore ADDED
@@ -0,0 +1,2 @@
 
 
 
1
+ .env
2
+ .venv/
.gradioignore ADDED
@@ -0,0 +1,2 @@
 
 
 
1
+ .env
2
+ .venv/
README.md CHANGED
@@ -1,8 +1,9 @@
1
  ---
2
- title: Carnatic Music Ai
3
- emoji: 🦀
4
- colorFrom: indigo
5
- colorTo: purple
 
6
  sdk: gradio
7
  sdk_version: 5.35.0
8
  app_file: app.py
 
1
  ---
2
+ title: carnatic-music-ai
3
+ python_version: 3.12
4
+ emoji: 🚀
5
+ colorFrom: purple
6
+ colorTo: pink
7
  sdk: gradio
8
  sdk_version: 5.35.0
9
  app_file: app.py
app.py ADDED
@@ -0,0 +1,320 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import json
2
+ import os
3
+ import gradio as gr
4
+ from dotenv import load_dotenv
5
+ from openai import OpenAI
6
+ import operator
7
+ from typing import Callable, Iterable, List, Mapping, Any
8
+
9
+ # ----------------------------------------------------------------------
10
+ # Shared operator registry and resolver
11
+ # ----------------------------------------------------------------------
12
+ _OPS: dict[str, Callable[[Any, Any], bool]] = {
13
+ "==": operator.eq,
14
+ "!=": operator.ne,
15
+ "<": operator.lt,
16
+ "<=": operator.le,
17
+ ">": operator.gt,
18
+ ">=": operator.ge,
19
+ "in": lambda lhs, rhs: lhs in rhs,
20
+ "contains": lambda lhs, rhs: (
21
+ all(item in lhs for item in rhs)
22
+ if isinstance(rhs, (list, tuple, set, frozenset))
23
+ else rhs in lhs
24
+ ),
25
+ }
26
+
27
+ def _resolve(op: str | Callable[[Any, Any], bool]) -> Callable[[Any, Any], bool]:
28
+ if callable(op):
29
+ return op
30
+ try:
31
+ return _OPS[op]
32
+ except KeyError:
33
+ raise ValueError(f"Unsupported operator: {op!r}") from None
34
+
35
+ # ----------------------------------------------------------------------
36
+ # Helper: fetch a value no matter where it is nested
37
+ # ----------------------------------------------------------------------
38
+ def _get_nested_value(obj: Any, field: str) -> Any:
39
+ """
40
+ • Supports dotted paths like "signature.aarohanam".
41
+ • If no dots are given, searches *recursively* for a key
42
+ with that name and returns the first match.
43
+ • Returns [] (empty list) when the key can’t be found
44
+ so that “contains” still works safely.
45
+ """
46
+ # 1) dotted‑path lookup ------------------------------------------
47
+ if "." in field:
48
+ for part in field.split("."):
49
+ if isinstance(obj, Mapping) and part in obj:
50
+ obj = obj[part]
51
+ else:
52
+ return [] # path breaks ⇒ treat as “nothing here”
53
+ return obj
54
+
55
+ # 2) recursive scan (simple key) ---------------------------------
56
+ if isinstance(obj, Mapping):
57
+ if field in obj:
58
+ return obj[field]
59
+ for v in obj.values():
60
+ got = _get_nested_value(v, field)
61
+ if got != []:
62
+ return got
63
+ elif isinstance(obj, (list, tuple, set, frozenset)):
64
+ for v in obj:
65
+ got = _get_nested_value(v, field)
66
+ if got != []:
67
+ return got
68
+ return [] # not found anywhere
69
+
70
+ # ----------------------------------------------------------------------
71
+ # 1‑filter version (unchanged, for reference)
72
+ # ----------------------------------------------------------------------
73
+ def query_collection(collectionName: str,
74
+ field: str | None = None,
75
+ op: str | Callable[[Any, Any], bool] | None = None,
76
+ value: Any | None = None):
77
+ collection: Iterable[Mapping[str, Any]] = read_file_as_json_array(
78
+ collectionName, f"data/{collectionName}.json")
79
+
80
+ if not op:
81
+ return collection[:20]
82
+
83
+ cmp = _resolve(op)
84
+ return [
85
+ item
86
+ for item in collection
87
+ if cmp(_get_nested_value(item, field), value)
88
+ ]
89
+
90
+
91
+ # ----------------------------------------------------------------------
92
+ # NEW: multi‑filter counter
93
+ # ----------------------------------------------------------------------
94
+ def count_documents(collectionName: str,
95
+ filters: List[Mapping[str, Any] | None] = None) -> int:
96
+ """
97
+ *filters* is a list/tuple of dict‑like objects with keys:
98
+ • field – str
99
+ • op – str key in _OPS **or** a custom 2‑arg callable
100
+ • value – value to compare against
101
+
102
+ All filters are AND‑ed together (an item must satisfy every filter).
103
+ """
104
+ collection: Iterable[Mapping[str, Any]] = read_file_as_json_array(
105
+ collectionName, f"data/{collectionName}.json")
106
+
107
+ # Pre‑compute each filter as (field, cmp‑function, value)
108
+ compiled = [(f["field"], _resolve(f["op"]), f["value"])
109
+ for f in filters] if filters else []
110
+
111
+ def matches(item):
112
+ return all(cmp(item[field] if field in item else None, value) for field, cmp, value in compiled)
113
+
114
+ return sum(1 for item in collection if matches(item))
115
+
116
+
117
+ def read_file_as_json_array(label, fileName):
118
+ with open(fileName, "r", encoding="utf-8") as f:
119
+ some_str = f.read()
120
+
121
+ json_array = json.loads(some_str)
122
+ print(f"Number of {label} loaded = ")
123
+ print(len(json_array))
124
+ return json_array
125
+
126
+
127
+ def get_audio_update(swaram):
128
+ print("play_swaram called for " + swaram)
129
+ results = query_collection("swarams", "name", "==", swaram.upper())
130
+
131
+ if len(results) > 0:
132
+ swaramInfo = results[0]
133
+ print(swaramInfo)
134
+ audioFilePath = f"data/audio/swarams/c_sw_{swaramInfo['fileName']}.mp3"
135
+ audio_update = gr.update(value=audioFilePath, visible=True)
136
+ # return f"Playing swaram {swaram} using audio file {audioFilePath}"
137
+ return audio_update
138
+ else:
139
+ audio_update = gr.update(visible=False)
140
+ # return f"Unknown swaram {swaram}"
141
+ return audio_update
142
+
143
+
144
+ def play_swaram(swaram):
145
+ # play the swaram using audio library
146
+ return get_audio_update(swaram)
147
+
148
+
149
+ load_dotenv(override=True)
150
+
151
+ tool_specs = [
152
+ {
153
+ "type": "function",
154
+ "function": {
155
+ "name": "query_collection",
156
+ "description": "Run a structured filter over Firestore",
157
+ "parameters": {
158
+ "type": "object",
159
+ "properties": {
160
+ "collectionName": {"type": "string"},
161
+ "field": {"type": "string"},
162
+ "op": {"type": "string", "enum": ["==", "<", "<=", ">", ">="]},
163
+ "value": {"type": "string"}
164
+ },
165
+ "required": ["collection"]
166
+ }
167
+ },
168
+ },
169
+ {
170
+ "type": "function",
171
+ "function": {
172
+ "name": "vector_search",
173
+ "description": "Semantic search over a collection using embeddings",
174
+ "parameters": {
175
+ "type": "object",
176
+ "properties": {
177
+ "collectionName": {"type": "string"},
178
+ "query": {"type": "string"},
179
+ "top_k": {"type": "integer", "default": 5}
180
+ },
181
+ "required": ["collectionName", "query"]
182
+ }
183
+ },
184
+ },
185
+ {
186
+ "type": "function",
187
+ "function": {
188
+ "name": "count_documents",
189
+ "description": "Return how many documents satisfy optional filters",
190
+ "parameters": {
191
+ "type": "object",
192
+ "properties": {
193
+ "collectionName": {"type": "string",
194
+ "description": "Firestore collection name"},
195
+ "filters": {
196
+ "type": "array",
197
+ "items": {
198
+ "type": "object",
199
+ "properties": {
200
+ "field": {"type": "string"},
201
+ "op": {"type": "string",
202
+ "enum": ["==", "<", "<=", ">", ">=", "!="]},
203
+ "value": {}
204
+ },
205
+ "required": ["field", "op", "value"]
206
+ },
207
+ "description": "Optional list of field comparisons"
208
+ }
209
+ },
210
+ "required": ["collectionName"]
211
+ }
212
+ }
213
+ },
214
+ {
215
+ "type": "function",
216
+ "function": {
217
+ "name": "play_swaram",
218
+ "description": "Play a swaram",
219
+ "parameters": {
220
+ "type": "object",
221
+ "properties": {
222
+ "swaram": {"type": "string"},
223
+ },
224
+ "required": ["swaram"]
225
+ }
226
+ },
227
+ },
228
+
229
+ ]
230
+
231
+
232
+ openai = OpenAI()
233
+ system_prompt = f"""You are an encyclopedia of carnatic music. Users will query you asking questions about various aspects of carnatic music.
234
+ if the user asks about ragams or ragas, use the ragams collection from the database instead of ragas. If you already fetched the data earlier, don't again query from the database.
235
+ If the user asks for a count, total, number of X, etc call count_documents.
236
+ if user asks for ragams containing some swarams X,Y,Z in aarohanam or avarohanam, use operator contains and pass an array of swarams to it as value.
237
+ Using ONLY the tools query_collection, count_documents and vector_search as your datasources, please answer the questions. If you don't know the answer to a question, please say so.
238
+ """
239
+
240
+
241
+ def handle_tool_calls(tool_calls):
242
+ results = []
243
+ for tool_call in tool_calls:
244
+ tool_name = tool_call.function.name
245
+ tool = globals().get(tool_name)
246
+ arguments = json.loads(tool_call.function.arguments)
247
+ print(arguments)
248
+ result = tool(**arguments)
249
+ results.append(
250
+ {"role": "tool", "tool_call_id": tool_call.id, "content": json.dumps(result)})
251
+ return results
252
+
253
+
254
+ def chat(message, history):
255
+ chat_history = history + [{"role": "user", "content": message}]
256
+ # print("history = " + json.dumps(history))
257
+ messages = [{"role": "system", "content": system_prompt}]
258
+
259
+ # for user_msg, assistant_msg in history:
260
+ # if user_msg is not None:
261
+ # messages.append({"role": "user", "content": user_msg})
262
+ # if assistant_msg is not None:
263
+ # messages.append({"role": "assistant", "content": assistant_msg})
264
+
265
+ messages += history
266
+
267
+ messages.append({"role": "user", "content": message})
268
+
269
+ print("messages = " + json.dumps(messages))
270
+ response = openai.chat.completions.create(
271
+ model="gpt-4o-mini", messages=messages, tools=tool_specs, tool_choice="auto")
272
+
273
+ response_message = response.choices[0].message
274
+ if response.choices[0].finish_reason == "tool_calls":
275
+ tool_calls = response.choices[0].message.tool_calls
276
+ tool_responses = handle_tool_calls(tool_calls)
277
+ messages.append(response_message)
278
+ messages.extend(tool_responses)
279
+ followup_response = openai.chat.completions.create(
280
+ model="gpt-4o-mini", messages=messages, tools=tool_specs, tool_choice="auto")
281
+ chat_history.append(
282
+ {"role": "assistant", "content": followup_response.choices[0].message.content})
283
+ play_audio_tool = [
284
+ tool_call for tool_call in tool_calls if tool_call.function.name == "play_swaram"]
285
+ # print(play_audio_tool)
286
+ if (len(play_audio_tool) > 0):
287
+ args = json.loads(play_audio_tool[0].function.arguments)
288
+ return "", chat_history, get_audio_update(**args)
289
+ else:
290
+ return "", chat_history, gr.update(visible=False)
291
+ else:
292
+ print("message.content = " + message)
293
+ print("response.choices[0].message.content" +
294
+ response.choices[0].message.content)
295
+ chat_history.append({"role": "assistant",
296
+ "content": response.choices[0].message.content})
297
+ return "", chat_history, gr.update(visible=False)
298
+
299
+
300
+ # demo = gr.ChatInterface(chat, type="messages")
301
+
302
+ # demo.launch()
303
+
304
+ # ----------------------------------
305
+ # Interface
306
+ # ----------------------------------
307
+ with gr.Blocks(title="Chat + Player") as demo:
308
+ chatbot = gr.Chatbot(height=400, type="messages")
309
+ # hidden until needed
310
+ audio_out = gr.Audio(interactive=False, visible=False, autoplay=True)
311
+ textbox = gr.Textbox(placeholder="Type here and hit Enter")
312
+
313
+ # wire textbox -> respond()
314
+ textbox.submit(
315
+ chat,
316
+ inputs=[textbox, chatbot],
317
+ outputs=[textbox, chatbot, audio_out],
318
+ )
319
+
320
+ demo.launch()
data/audio/swarams/c_ak_da1.mp3 ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:3c8c59f56872cd1ced8f5ad6ff5552df906fb066d5b9980de36600e63b8e2e7e
3
+ size 182760
data/audio/swarams/c_ak_da1_higher.mp3 ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:d1677ce898106ace7bad03a02be3484136915791f22c4e1c4e4433719dc5b6da
3
+ size 185763
data/audio/swarams/c_ak_da1_lower.mp3 ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:04a272b19898c1d837c4dbcab5c07f1e9f60d6d15f0c949c5346482ca65e1ec0
3
+ size 147148
data/audio/swarams/c_ak_da2.mp3 ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:3b99a7d1bae1842f70477b3336df201446eeee63221b7681309f6558762c6709
3
+ size 168934
data/audio/swarams/c_ak_da2_lower.mp3 ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:f3b485286bad1eb325192c0baeed4ca34c6b691c217fa574e1ab9e983e596ffa
3
+ size 117670
data/audio/swarams/c_ak_da3.mp3 ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:bc4c8b18efb26d4a66993ff36a7f6cea2b29ba040187f1a087d441f7419e480e
3
+ size 179520
data/audio/swarams/c_ak_da3_lower.mp3 ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:497706fc4bfb44298422699ac6754bffbf0679d968dec56dabe3b8b0129b2b73
3
+ size 219533
data/audio/swarams/c_ak_ga1.mp3 ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:b668b200f0eda100fd35148d46ff15616be7dae3fd564ae8862ba4a46f1aac1b
3
+ size 207047
data/audio/swarams/c_ak_ga1_higher.mp3 ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:00b0902f3613ce8b579eb266ce21ff737c0f1ccb064e5fa180bbb3555cf21d92
3
+ size 131214
data/audio/swarams/c_ak_ga2.mp3 ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:c99ed885d02e23a14eacba1560318fd0f439d7cff3d970286c0e8f72472bf07a
3
+ size 193990
data/audio/swarams/c_ak_ga2_higher.mp3 ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:7f4542da10e06347348d86b4565cd48861504fc0fd0f6d6706c6946d60d7297f
3
+ size 189574
data/audio/swarams/c_ak_ga3.mp3 ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:cd1b8ba80ed796344ecbe9a94a542ece8acd24ab3603c6b9efeb878add5066a9
3
+ size 209350
data/audio/swarams/c_ak_ga3_higher.mp3 ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:71973cf59760eedc57f5f2e8c666942e3d25f0c4fd7a466aae7eb0209bb81634
3
+ size 175229
data/audio/swarams/c_ak_gamakam_ga3_pa.mp3 ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:c094de550d2f877b58f02a34eb9fbe5405e03681c2e560a5d629a374106519e3
3
+ size 164612
data/audio/swarams/c_ak_gamakam_pa_da2.mp3 ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:d2bb3e00c394354d340fa9e0fbca60fc2a5a6ba1cb5f10f0b81d8143f1993ddf
3
+ size 159798
data/audio/swarams/c_ak_gamakam_sa_higher_da2.mp3 ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:b2ff0de7d62931936ca17d2fa29bc1b992deade3676d91dc60182c06ee3ad528
3
+ size 166528
data/audio/swarams/c_ak_gamakam_sa_ri2.mp3 ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:118a26e77c1a44e2aaf75dc664323dae9efbf14641e6da5f3d8fddf20c07f9b5
3
+ size 157879
data/audio/swarams/c_ak_ma1.mp3 ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:18b55c1a6efe5942f012d3f8e9a059f98fe5f5b3dc95ce57002bd49d8a587e66
3
+ size 132480
data/audio/swarams/c_ak_ma1_higher.mp3 ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:77fc40b4c980cf6ff58d04abac0712a07b88760fad525b0bf9a540f8b2c16ceb
3
+ size 162893
data/audio/swarams/c_ak_ma1_lower.mp3 ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:7e0a072b1ded10d1fdfbbbae010949f54616213f2813931fc1cc17e76f2b3d96
3
+ size 282509
data/audio/swarams/c_ak_ma2.mp3 ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:1059239094da13d5c7be6f7801380aa7070e4f62df4060d8311edff6ba77c9e5
3
+ size 194759
data/audio/swarams/c_ak_ma2_higher.mp3 ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:4808150f923a76d3a36a76f03bfec32e6c7e33e70bfa231f24dc41c456215531
3
+ size 192455
data/audio/swarams/c_ak_ma2_lower.mp3 ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:ab3352e939fa75d8f010505bdd1b56607323abd681a46d239ba3eea3b11dc0f6
3
+ size 288269
data/audio/swarams/c_ak_ni1.mp3 ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:3b99a7d1bae1842f70477b3336df201446eeee63221b7681309f6558762c6709
3
+ size 168934
data/audio/swarams/c_ak_ni1_lower.mp3 ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:f3b485286bad1eb325192c0baeed4ca34c6b691c217fa574e1ab9e983e596ffa
3
+ size 117670
data/audio/swarams/c_ak_ni2.mp3 ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:bc4c8b18efb26d4a66993ff36a7f6cea2b29ba040187f1a087d441f7419e480e
3
+ size 179520
data/audio/swarams/c_ak_ni2_lower.mp3 ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:497706fc4bfb44298422699ac6754bffbf0679d968dec56dabe3b8b0129b2b73
3
+ size 219533
data/audio/swarams/c_ak_ni3.mp3 ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:22dde43d9ea173da6646596b7744562e6851c4502d0830127bb86e65fdbff94b
3
+ size 181440
data/audio/swarams/c_ak_ni3_lower.mp3 ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:6c62d5223e80f4a09ee48661ce4ecd7b5e1998a458863d072d22c7cc98102d08
3
+ size 311597
data/audio/swarams/c_ak_pa.mp3 ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:5d66b988139a64d32fb4a5bce90b51d1c7cee3d655480cdc4eb4555df8285663
3
+ size 163200
data/audio/swarams/c_ak_pa_higher.mp3 ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:56766b44e2bccad015dfb5a236803fb9c9f6b5dc08b26617ba2037c59d2ad5d0
3
+ size 186893
data/audio/swarams/c_ak_pa_lower.mp3 ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:41be7ba427e71a85d7727dd257aee8c5e11ba6e846aa526f338a3bef973bf95b
3
+ size 301420
data/audio/swarams/c_ak_ri1.mp3 ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:cd80e7895a4a223e0ab2318dfdfebda3dc9839d187cfe447f9852dd58885554b
3
+ size 171840
data/audio/swarams/c_ak_ri1_higher.mp3 ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:5ee6ea2d89a7976d86a40b6bdf561a87f9c067d7fe9bb5b41678c67fcb6b8bf6
3
+ size 112014
data/audio/swarams/c_ak_ri2.mp3 ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:b668b200f0eda100fd35148d46ff15616be7dae3fd564ae8862ba4a46f1aac1b
3
+ size 207047
data/audio/swarams/c_ak_ri2_higher.mp3 ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:00b0902f3613ce8b579eb266ce21ff737c0f1ccb064e5fa180bbb3555cf21d92
3
+ size 131214
data/audio/swarams/c_ak_ri3.mp3 ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:c99ed885d02e23a14eacba1560318fd0f439d7cff3d970286c0e8f72472bf07a
3
+ size 193990
data/audio/swarams/c_ak_ri3_higher.mp3 ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:7f4542da10e06347348d86b4565cd48861504fc0fd0f6d6706c6946d60d7297f
3
+ size 189574
data/audio/swarams/c_ak_sa.mp3 ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:27155e8166ae8102e69af485182130fa01572377c9b9131e81ee54bcf3f54e7d
3
+ size 208198
data/audio/swarams/c_ak_sa_higher.mp3 ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:0ef20076f09cee0481c852ac517247b0159177973a05baac1030ccc923b1ac56
3
+ size 130560
data/audio/swarams/c_ak_silence.mp3 ADDED
Binary file (41.2 kB). View file
 
data/audio/swarams/c_ak_tanpura.mp3 ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:cbb267917b6a5f51bd03856bb8e47ddf6fb8852dcbccb7b8bb8387938dcb9a22
3
+ size 240817
data/audio/swarams/c_ak_tanpura_ma1.mp3 ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:09c32116f9aa65d69a9e2ef4a2a7d9883d8b208ba958ab761e2124e6cecc71bd
3
+ size 236544
data/audio/swarams/c_ak_tanpura_ma2.mp3 ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:8594d15d418d1ab7ff452ea79fdd721725fbc425c38ea683966e0b0bd6e53b0e
3
+ size 265056
data/audio/swarams/c_sw_da1.mp3 ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:1142a4c534f4df1249b6aacefdc5285c2e9db8e46842ae5160658462c9e9c7ed
3
+ size 144530