kernpy 0.0.2__py3-none-any.whl → 1.0.1__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (56) hide show
  1. kernpy/__init__.py +30 -0
  2. kernpy/__main__.py +127 -0
  3. kernpy/core/__init__.py +119 -0
  4. kernpy/core/_io.py +48 -0
  5. kernpy/core/base_antlr_importer.py +61 -0
  6. kernpy/core/base_antlr_spine_parser_listener.py +196 -0
  7. kernpy/core/basic_spine_importer.py +43 -0
  8. kernpy/core/document.py +965 -0
  9. kernpy/core/dyn_importer.py +30 -0
  10. kernpy/core/dynam_spine_importer.py +42 -0
  11. kernpy/core/error_listener.py +51 -0
  12. kernpy/core/exporter.py +535 -0
  13. kernpy/core/fing_spine_importer.py +42 -0
  14. kernpy/core/generated/kernSpineLexer.interp +444 -0
  15. kernpy/core/generated/kernSpineLexer.py +535 -0
  16. kernpy/core/generated/kernSpineLexer.tokens +236 -0
  17. kernpy/core/generated/kernSpineParser.interp +425 -0
  18. kernpy/core/generated/kernSpineParser.py +9954 -0
  19. kernpy/core/generated/kernSpineParser.tokens +236 -0
  20. kernpy/core/generated/kernSpineParserListener.py +1200 -0
  21. kernpy/core/generated/kernSpineParserVisitor.py +673 -0
  22. kernpy/core/generic.py +426 -0
  23. kernpy/core/gkern.py +526 -0
  24. kernpy/core/graphviz_exporter.py +89 -0
  25. kernpy/core/harm_spine_importer.py +41 -0
  26. kernpy/core/import_humdrum_old.py +853 -0
  27. kernpy/core/importer.py +285 -0
  28. kernpy/core/importer_factory.py +43 -0
  29. kernpy/core/kern_spine_importer.py +73 -0
  30. kernpy/core/mens_spine_importer.py +23 -0
  31. kernpy/core/mhxm_spine_importer.py +44 -0
  32. kernpy/core/pitch_models.py +338 -0
  33. kernpy/core/root_spine_importer.py +58 -0
  34. kernpy/core/spine_importer.py +45 -0
  35. kernpy/core/text_spine_importer.py +43 -0
  36. kernpy/core/tokenizers.py +239 -0
  37. kernpy/core/tokens.py +2011 -0
  38. kernpy/core/transposer.py +300 -0
  39. kernpy/io/__init__.py +14 -0
  40. kernpy/io/public.py +355 -0
  41. kernpy/polish_scores/__init__.py +13 -0
  42. kernpy/polish_scores/download_polish_dataset.py +357 -0
  43. kernpy/polish_scores/iiif.py +47 -0
  44. kernpy/test_grammar.sh +22 -0
  45. kernpy/util/__init__.py +14 -0
  46. kernpy/util/helpers.py +55 -0
  47. kernpy/util/store_cache.py +35 -0
  48. kernpy/visualize_analysis.sh +23 -0
  49. kernpy-1.0.1.dist-info/METADATA +497 -0
  50. kernpy-1.0.1.dist-info/RECORD +51 -0
  51. {kernpy-0.0.2.dist-info → kernpy-1.0.1.dist-info}/WHEEL +1 -2
  52. kernpy/example.py +0 -1
  53. kernpy-0.0.2.dist-info/LICENSE +0 -19
  54. kernpy-0.0.2.dist-info/METADATA +0 -19
  55. kernpy-0.0.2.dist-info/RECORD +0 -7
  56. kernpy-0.0.2.dist-info/top_level.txt +0 -1
@@ -0,0 +1,497 @@
1
+ Metadata-Version: 2.4
2
+ Name: kernpy
3
+ Version: 1.0.1
4
+ Summary: Python Humdrum **kern and **mens utilities
5
+ Project-URL: Homepage, https://github.com/OMR-PRAIG-UA-ES/kernpy
6
+ Project-URL: Documentation, https://github.com/OMR-PRAIG-UA-ES/kernpy#readme
7
+ Project-URL: Issues, https://github.com/OMR-PRAIG-UA-ES/kernpy/issues
8
+ Author-email: David Rizo Valero <drizo@ua.es>, Joan Cerveto Serrano <joan.cerveto@ua.es>
9
+ License: AGPL-3.0-only
10
+ Classifier: License :: OSI Approved :: GNU Affero General Public License v3
11
+ Classifier: Operating System :: OS Independent
12
+ Classifier: Programming Language :: Python :: 3
13
+ Requires-Python: >=3.9
14
+ Requires-Dist: antlr4-python3-runtime
15
+ Requires-Dist: pillow
16
+ Requires-Dist: requests
17
+ Requires-Dist: urllib3>=1.26.6
18
+ Description-Content-Type: text/markdown
19
+
20
+ # Python Humdrum **kern and **mens utilities
21
+
22
+ [![License: AGPL v3](https://img.shields.io/badge/License-AGPL%20v3-blue.svg?style=for-the-badge)](https://www.gnu.org/licenses/agpl-3.0)
23
+ ![Python Version](https://img.shields.io/badge/Python-3.9+-3776AB?logo=python&logoColor=white&style=for-the-badge)
24
+ [![PyPI](https://img.shields.io/pypi/v/kernpy?color=brightgreen&label=PyPI&style=for-the-badge&logo=pypi)](https://pypi.org/project/kernpy/)
25
+ [![Docs](https://img.shields.io/badge/docs-available-blue?style=for-the-badge&logo=readthedocs)](https://kernpy.pages.dev)
26
+ [![Tests](https://img.shields.io/badge/tests-passing-brightgreen?style=for-the-badge&logo=pytest)](https://github.com/kernpy/kernpy/actions)
27
+ [![Contributions welcome](https://img.shields.io/badge/contributions-welcome-orange?style=for-the-badge&logo=github)](CONTRIBUTING.md)
28
+
29
+
30
+ Python package that provides comprehensive tools for working with symbolic modern and mensural notations in Humdrum format. kernpy is a fully open-source project open to contributions.
31
+
32
+ ## Documentation
33
+ Visit the online website: <a target="_blank" href="https://kernpy.pages.dev/">https://kernpy.pages.dev/</a>
34
+
35
+ ## Index:
36
+ - [Code examples](#code-examples)
37
+ - [Installation](#installation)
38
+ - [Documentation](#documentation)
39
+ - [Run tests](#run-tests)
40
+ - [Contributing](#contributing)
41
+ - [Citation](#citation)
42
+
43
+
44
+ ## Code examples
45
+
46
+ ### Basic Usage
47
+
48
+ Load a `**kern`/`**mens` file into a `kp.Document`.
49
+ ```python
50
+ import kernpy as kp
51
+
52
+ # Read a **kern file
53
+ document, errors = kp.load("path/to/file.krn")
54
+ ```
55
+
56
+ Load a `**kern`/`**mens` from a string into a `kp.Document`.
57
+ ```python
58
+ import kernpy as kp
59
+
60
+ document, errors = kp.loads("**kern\n*clefC3\n*k[b-e-a-]\n*M3/4\n4e-\n4g\n4c\n=1\n4r\n2cc;\n==\n*-")
61
+ ```
62
+
63
+ Create a new standardized file from a `kp.Document`.
64
+ ```python
65
+ import kernpy as kp
66
+
67
+ kp.dump(document, "newfile.krn")
68
+ ```
69
+
70
+ Save the document in a string from a `kp.Document`.
71
+ ```python
72
+ import kernpy as kp
73
+
74
+ content = kp.dumps(document)
75
+ ````
76
+
77
+ ### Exploring different options when creating new files
78
+
79
+ Only use the specified spines in `spine_types`.
80
+ ```python
81
+ import kernpy as kp
82
+
83
+ # only export the **kern spines
84
+ kp.dump(document, "newfile_core.krn",
85
+ spine_types=['**kern'])
86
+
87
+ # only export the **text spines
88
+ kp.dump(document, "newfile_lyrics.krn",
89
+ spine_types=['**text])
90
+
91
+ # only export **kern and **text spines
92
+ kp.dump(document, "newfile_core_and_lyrics.krn",
93
+ spine_types=['*+text'])
94
+ ```
95
+
96
+ - The categories are hierarchically defined in the `TokenCategory` class.
97
+ See the hierarchy as a tree
98
+ ```python
99
+ import kernpy as kp
100
+
101
+
102
+ print(kp.TokenCategory.tree())
103
+ ```
104
+ Tree:
105
+ ```txt
106
+ .
107
+ ├── STRUCTURAL
108
+ │ ├── HEADER
109
+ │ └── SPINE_OPERATION
110
+ ├── CORE
111
+ │ ├── NOTE_REST
112
+ │ │ ├── DURATION
113
+ │ │ ├── NOTE
114
+ │ │ │ ├── PITCH
115
+ │ │ │ ├── DECORATION
116
+ │ │ │ └── ALTERATION
117
+ │ │ └── REST
118
+ │ ├── CHORD
119
+ │ ├── EMPTY
120
+ │ └── ERROR
121
+ ├── SIGNATURES
122
+ │ ├── CLEF
123
+ │ ├── TIME_SIGNATURE
124
+ │ ├── METER_SYMBOL
125
+ │ ├── KEY_SIGNATURE
126
+ │ └── KEY_TOKEN
127
+ ├── ENGRAVED_SYMBOLS
128
+ ├── OTHER_CONTEXTUAL
129
+ ├── BARLINES
130
+ ├── COMMENTS
131
+ │ ├── FIELD_COMMENTS
132
+ │ └── LINE_COMMENTS
133
+ ├── DYNAMICS
134
+ ├── HARMONY
135
+ ├── FINGERING
136
+ ├── LYRICS
137
+ ├── INSTRUMENTS
138
+ ├── IMAGE_ANNOTATIONS
139
+ │ ├── BOUNDING_BOXES
140
+ │ └── LINE_BREAK
141
+ ├── OTHER
142
+ ├── MHXM
143
+ └── ROOT
144
+ ```
145
+
146
+ - Use `include` for selecting the **kern semantic categories **to use**. The output only contains what is passed. By default, all the categories are included.
147
+ ```python
148
+ import kernpy as kp
149
+
150
+
151
+ kp.dump(document, "newfile_only_clefs.krn",
152
+ include={kp.TokenCategory.CLEF})
153
+ kp.dump(document, "newfile_only_durations_and_bounding_boxes.krn",
154
+ include={kp.TokenCategory.DURATION, kp.TokenCategory.BOUNDING_BOXES})
155
+ ```
156
+ - Use `exclude` for selecting the **kern semantic categories **to not use**. The output contains everything except what is passed. By default, any category is excluded.
157
+ ```python
158
+ import kernpy as kp
159
+
160
+ kp.dump(document, "newfile_without_pitches.krn",
161
+ exclude={kp.TokenCategory.PITCH})
162
+ kp.dump(document, "newfile_without_durations_or_rests.krn",
163
+ exclude={kp.TokenCategory.BARLINES, kp.TokenCategory.REST})
164
+ ```
165
+ - Use `include` and `exclude` together to select the **kern semantic categories **to use**. The output combines both.
166
+ ```python
167
+ import kernpy as kp
168
+
169
+ kp.dump(document, "newfile_custom.krn",
170
+ include=kp.BEKERN_CATEGORIES, # Preloaded set of simple categories
171
+ exclude={kp.TokenCategory.PITCH})
172
+
173
+ # Inspect the BEKERN preloaded categories
174
+ print(kp.BEKERN_CATEGORIES)
175
+ ```
176
+
177
+ - Use `tokenizer` to select how the categories are split. By default, the `normalizedKern` tokenizer is used.
178
+
179
+ ```python
180
+ import kernpy as kp
181
+
182
+ kp.dump(document, "newfile_normalized.krn",
183
+ tokenizer=kp.Encoding.normalizedKern) # Default tokenizer
184
+ ```
185
+ Select the proper Humdrum **kern tokenizer:
186
+
187
+ `kernpy` provides different tokenizers to export the content each symbol in different formats.
188
+
189
+ | Encoding | Tokenized | Description |
190
+ |----------|--------------|----------------------------------------|
191
+ | kern | 2.bb-_L | Traditional Humdrum **kern encoding |
192
+ | ekern | 2@.@bb@-·_·L | Extended Humdrum **kern encoding |
193
+
194
+ Use the `Encoding` enum class to select the tokenizer:
195
+
196
+ ```python
197
+ import kernpy as kp
198
+
199
+ doc, _ = kp.load('resource_dir/legacy/chor048.krn')
200
+
201
+ kern_content = kp.dumps(doc, tokenizer=kp.Encoding.normalizedKern)
202
+ ekern_content = kp.dumps(doc, tokenizer=kp.Encoding.eKern)
203
+ ```
204
+
205
+ - Use `from_measure` and `to_measure` to select the measures to export. By default, all the measures are exported.
206
+ ```python
207
+ import kernpy as kp
208
+
209
+ kp.dump(document, "newfile_1_to_10.krn",
210
+ from_measure=1, # First from measure 1
211
+ to_measure=10) # Last measure exported
212
+ ```
213
+
214
+ - Use `spine_ids` to select the spines to export. By default, all the spines are exported.
215
+ ```python
216
+ import kernpy as kp
217
+
218
+ kp.dump(document, "newfile_1_and_2.krn",
219
+ spine_ids=[0, 1]) # Export only the first and the second spine
220
+ ```
221
+
222
+ - Use `show_measure_numbers` to select if the measure numbers are shown. By default, the measure numbers are shown.
223
+ ```python
224
+ import kernpy as kp
225
+
226
+ kp.dump(document, "newfile_no_measure_numbers.krn",
227
+ show_measure_numbers=False) # Do not show measure numbers
228
+ ```
229
+
230
+ - Use all the options at the same time.
231
+
232
+ ```python
233
+ import kernpy as kp
234
+
235
+ kp.dump(document, "newfile.krn",
236
+ spine_types=['**kern'], # Export only the **kern spines
237
+ include=kp.BEKERN_CATEGORIES, # Token categories to include
238
+ exclude={kp.TokenCategory.PITCH}, # Token categories to exclude
239
+ tokenizer=kp.Encoding.eKern, # Kern encoding
240
+ from_measure=1, # First from measure 1
241
+ to_measure=10, # Last measure exported
242
+ spine_ids=[0, 1], # Export only the first and the second spine
243
+ show_measure_numbers=False, # Do not show measure numbers
244
+ )
245
+ ```
246
+
247
+ ## Exploring `kernpy` utilities.
248
+
249
+
250
+ - Spines analysis
251
+ Retrieve all the spine types of the document.
252
+ ```python
253
+ import kernpy as kp
254
+
255
+ kp.spine_types(document)
256
+ # ['**kern', '**kern', '**kern', '**kern', '**root', '**harm']
257
+
258
+ kp.spine_types(document, spine_types=None)
259
+ # ['**kern', '**kern', '**kern', '**kern', '**root', '**harm']
260
+
261
+ kp.spine_types(document, spine_types=['**kern'])
262
+ # ['**kern', '**kern', '**kern', '**kern']
263
+ ```
264
+
265
+ - Get specific **kern spines.
266
+ ```python
267
+ import kernpy as kp
268
+
269
+ def how_many_instrumental_spines(document):
270
+ print(kp.spine_types(document, ['**kern']))
271
+ return len(kp.spine_types(document, ['**kern']))
272
+ # ['**kern', '**kern', '**kern', '**kern']
273
+ # 4
274
+
275
+ def has_voice(document):
276
+ return len(kp.spine_types(document, ['**text'])) > 0
277
+ # True
278
+ ```
279
+
280
+
281
+
282
+ ### How many measures are there in the document? Which measures do you want to export?
283
+
284
+ After reading the score into the `Document` object. You can get some useful data:
285
+ ```python
286
+ first_measure: int = document.get_first_measure()
287
+ last_measure: int = document.measures_count()
288
+ ```
289
+
290
+ Iterate over all the measures of the document.
291
+ ```python
292
+ import kernpy as kp
293
+
294
+ doc, _ = kp.load('resource_dir/legacy/chor048.krn') # 10 measures score
295
+ for i in range(doc.get_first_measure(), doc.measures_count(), 1): # from 1 to 11, step 1
296
+ # Export only the i-th measure (1 long measure scores)
297
+ content_ith_measure = kp.dumps(doc, from_measure=i, to_measure=i)
298
+
299
+ # Export the i-th measure and the next 4 measures (5 long measure scores)
300
+ if i + 4 <= doc.measures_count():
301
+ content_longer = kp.dumps(doc, from_measure=i, to_measure=i + 4)
302
+ ...
303
+ ```
304
+
305
+ It is easier to iterate over all the measures using the `for measure in doc`: loop
306
+ (using the `__ iter__` method):
307
+ ```python
308
+ import kernpy as kp
309
+
310
+ for measure in doc:
311
+ content = kp.dumps(doc, from_measure=measure, to_measure=measure)
312
+ ...
313
+ ```
314
+
315
+ Exploring the page bounding boxes.
316
+
317
+ ```python
318
+ import kernpy as kp
319
+
320
+ # Iterate over the pages using the bounding boxes
321
+ doc, _ = kp.load('kern_having_bounding_boxes.krn')
322
+
323
+ # Inspect the bounding boxes
324
+ print(doc.page_bounding_boxes)
325
+
326
+
327
+ def are_there_bounding_boxes(doc):
328
+ return len(doc.get_all_tokens(filter_by_categories=[kp.TokenCategory.BOUNDING_BOXES])) > 0
329
+
330
+
331
+ # True
332
+
333
+ # Iterate over the pages
334
+ for page_label, bounding_box_measure in doc.page_bounding_boxes.items():
335
+ print(f"Page: {page_label}"
336
+ f"Bounding box: {bounding_box_measure}"
337
+ f"from_measure: {bounding_box_measure.from_measure}"
338
+ f"to_measure+1: {bounding_box_measure.to_measure}") # TODO: Check bounds
339
+ kp.dump(doc, f"foo_{page_label}.ekrn",
340
+ spine_types=['**kern'],
341
+ token_categories=kp.BEKERN_CATEGORIES,
342
+ tokenizer=kp.Encoding.eKern,
343
+ from_measure=bounding_box_measure.from_measure,
344
+ to_measure=bounding_box_measure.to_measure - 1 # TODO: Check bounds
345
+ )
346
+ ```
347
+
348
+ ### Merge different full kern scores
349
+ ```python
350
+ import kernpy as kp
351
+ # NOT AVAILABLE YET!!!
352
+ # Pay attention to `kp.merge` too.
353
+
354
+ # Concat two valid documents
355
+ score_a = '**kern\n*clefG2\n=1\n4c\n4d\n4e\n4f\n*-\n'
356
+ score_b = '**kern\n*clefG2\n=1\n4a\n4c\n4d\n4c\n*-\n'
357
+ concatenated = kp.merge([score_a, score_b])
358
+ ```
359
+
360
+ # Concatenate sorted fragments of the same score
361
+ ```python
362
+ import kernpy as kp
363
+
364
+ fragment_a = '**kern\n*clefG2\n=1\n4c\n4d\n4e\n4f\n*-\n'
365
+ fragment_b = '=2\n4a\n4c\n4d\n4c\n*-\n=3\n4a\n4c\n4d\n4c\n*-\n'
366
+ fragment_c = '=4\n4a\n4c\n4d\n4c\n*-\n=5\n4a\n4c\n4d\n4c\n*-\n'
367
+ fragment_d = '=6\n4a\n4c\n4d\n4c\n*-\n=7\n4a\n4c\n4d\n4c\n*-\n==*-'
368
+ fragments = [fragment_a, fragment_b, fragment_c, fragment_d]
369
+
370
+ doc_merged, indexes = kp.concat(fragments)
371
+ for index_pair in indexes:
372
+ from_measure, to_measure = index_pair
373
+ print(f'From measure: {from_measure}, To measure: {to_measure}')
374
+ print(kp.dumps(doc_merged, from_measure=from_measure, to_measure=to_measure))
375
+
376
+ # Sometimes is useful having a different separator between the fragments rather than the default one (newline)...
377
+ doc_merged, indexes = kp.concat(fragments, separator='')
378
+ ```
379
+
380
+ ### Inspect the `Document` class functions
381
+ ```python
382
+ import kernpy as kp
383
+ doc, _ = kp.load('resource_dir/legacy/chor048.krn') # 10 measures score
384
+
385
+ frequencies = doc.frequencies() # All the token categories
386
+ filtered_frequencies = doc.frequencies(filter_by_categories=[kp.TokenCategory.SIGNATURES])
387
+ frequencies['*k[f#c#]']
388
+ # {
389
+ # 'occurrences': 4,
390
+ # 'category': SIGNATURES,
391
+ # }
392
+
393
+ # Get all the tokens in the document
394
+ all_tokens: [kp.Token] = doc.get_all_tokens()
395
+ all_tokens_encodings: [str] = doc.get_all_tokens_encodings()
396
+
397
+ # Get the unique tokens in the document (vocabulary)
398
+ unique_tokens: [kp.Token] = doc.get_unique_tokens()
399
+ unique_token_encodings: [str] = doc.get_unique_token_encodings()
400
+
401
+ # Get the line comments in the document
402
+ document.get_metacomments()
403
+ # ['!!!COM: Coltrane', '!!!voices: 1', '!!!OPR: Blue Train']
404
+ document.get_metacomments(KeyComment='COM')
405
+ # ['!!!COM: Coltrane']
406
+ document.get_metacomments(KeyComment='COM', clear=True)
407
+ # ['Coltrane']
408
+ document.get_metacomments(KeyComment='non_existing_key')
409
+ # []
410
+ ```
411
+
412
+ ## Transpose
413
+ - Inspect what intervals are available for transposing.
414
+ ```python
415
+ import kernpy as kp
416
+
417
+ print(kp.AVAILABLE_INTERVALS)
418
+ ```
419
+
420
+ - Transpose the document to a specific interval.
421
+ ```python
422
+ import kernpy as kp
423
+
424
+ doc, err = kp.load('resource_dir/legacy/chor048.krn') # 10 measures score
425
+ higher_octave_doc = doc.to_transposed('octave', 'up')
426
+
427
+ kp.dump(higher_octave_doc, 'higher_octave.krn')
428
+ ```
429
+
430
+ ### On your own
431
+
432
+ - Handle the document if needed.
433
+ ```python
434
+ import kernpy as kp
435
+
436
+ # Access the document tree
437
+ print(document.tree)
438
+ # <kernpy.core.document.DocumentTree object at 0x7f8b3b3b3d30>
439
+
440
+ # View the tree-based Document structure for debugging.
441
+ kp.graph(document, '/tmp/graph.dot')
442
+ # Render the graph
443
+ # - using Graphviz extension in your IDE
444
+ # - in the browser here: https://dreampuf.github.io/GraphvizOnline/
445
+ ```
446
+
447
+
448
+ ## Installation
449
+
450
+ ### Production version:
451
+ Just install the last version of **kernpy** using pip:
452
+ ```shell
453
+ pip3 install kernpy
454
+
455
+ # ensure you have the latest version
456
+ pip3 install kernpy --upgrade
457
+ ```
458
+
459
+ > [!NOTE]
460
+ > This module is downloaded by default in the _/tmp_ directory in Linux. So it is removed when shutdown the machine.
461
+
462
+ <hr>
463
+
464
+ ## Documentation
465
+ Documentation available at [https://kernpy.pages.dev/](https://kernpy.pages.dev/)
466
+
467
+
468
+ **kernpy** also supports been executed as a module. Find out the available commands:
469
+ ```shell
470
+ python -m kernpy --help
471
+ python -m kernpy <command> <options>
472
+ ```
473
+
474
+
475
+ ## Run tests:
476
+ ```shell
477
+ cd tests && python -m pytest
478
+ ```
479
+
480
+
481
+ ## Contributing
482
+
483
+ We welcome contributions from the community! If you'd like to contribute to the project, please follow these steps:
484
+
485
+ Go to the file [CONTRIBUTING.md](CONTRIBUTING.md) for more information on how to contribute.
486
+
487
+ ## Citation:
488
+ ```bibtex
489
+ @inproceedings{kernpy_mec_2025,
490
+ title={{kernpy: a Humdrum **Kern Oriented Python Package for Optical Music Recognition Tasks}},
491
+ author={Cerveto-Serrano, Joan and Rizo, David and Calvo-Zaragoza, Jorge},
492
+ booktitle={{Proceedings of the Music Encoding Conference (MEC2025)}},
493
+ address={London, United Kingdom},
494
+ year={2025}
495
+ }
496
+ ```
497
+
@@ -0,0 +1,51 @@
1
+ kernpy/__init__.py,sha256=HdHS0T3se8qIU0d2mULhwhgJRfgGmNA4Zhxl4YvjeVA,313
2
+ kernpy/__main__.py,sha256=ZxsPlyfgzpZjU8TdNBc1SrMyTTr-Osu4j08DXHAgpVQ,4437
3
+ kernpy/test_grammar.sh,sha256=MP9Hav9nPxTbHeofFEuunwDsLcBoeFRtzPp4bbPnqBU,520
4
+ kernpy/visualize_analysis.sh,sha256=z68jyZ8zj4w7v5CoC8-J7PGh7dYA_iQbuFL5T63X6qY,526
5
+ kernpy/core/__init__.py,sha256=gIbOKMWcPcQc4c6QpslWnAw9XkcMJ6OvedHANyDABbs,2581
6
+ kernpy/core/_io.py,sha256=WqH30iDjfzGRCIzlqrAE9Oi_nfyleUpp8xGK8xZPh_w,1208
7
+ kernpy/core/base_antlr_importer.py,sha256=2pPJ7sdWWCBU9Vw2ZAx-j-674DlSp82ajapeex-pF2I,1475
8
+ kernpy/core/base_antlr_spine_parser_listener.py,sha256=HqKYACgzdiIc1fAoSaiLzfogkv7pAuiqUHlIRF8c--c,9837
9
+ kernpy/core/basic_spine_importer.py,sha256=aYceG5wxlm7qTrd0KTR6-P4v4VVlYYPEe8omd3vmC0I,1523
10
+ kernpy/core/document.py,sha256=Y_Wpwc-t1GkaGr2QVU0hqLRFJv9wJ_Nm6UitgwAlT8w,34892
11
+ kernpy/core/dyn_importer.py,sha256=dKgZqVIdEELUu8HY63ClLJAMQXXItjHmaYxxOwFZRiY,1025
12
+ kernpy/core/dynam_spine_importer.py,sha256=crg4LwsWr56VZ6GLYAO1CDnLuum9f1tlX_pXCqKemEc,1450
13
+ kernpy/core/error_listener.py,sha256=bTlAZvVIQx_6BLZ3oRut_pn24JnV8_7GnNONiwoMMPU,1516
14
+ kernpy/core/exporter.py,sha256=5MWOk1JmPtpXfjN_VBv5jxUhYu8hhAZwt9eB5u9f1eM,21371
15
+ kernpy/core/fing_spine_importer.py,sha256=5GLPPakmZVRcNbbaoCn1p1cQdat5QttflbpKu3AytQU,1382
16
+ kernpy/core/generic.py,sha256=9OTDE2t49laVk6fgtydK5yZh7SCfZwViP_dZUJlskA8,10967
17
+ kernpy/core/gkern.py,sha256=nRYFLFJ0uOLJwio0DKxQ0YIqLixy6-qCM-eY8DNdxfM,16332
18
+ kernpy/core/graphviz_exporter.py,sha256=lzeJ0sJoKCDYam1oLJ4pjnlf_NHBJFH0V9w0Pjic5SI,3447
19
+ kernpy/core/harm_spine_importer.py,sha256=L2eVxW4-tMG3JCtCwLVx6En-ulSn9S90wdUoffj_U5s,1379
20
+ kernpy/core/import_humdrum_old.py,sha256=NZTQgANQc2BCYJRbGG6AyxcGHxjyy8XXa9dz88zrnMk,35304
21
+ kernpy/core/importer.py,sha256=Rg4vIvEl2yhMwYrN5NenhdQG4_2dNByCRvHCEBJgWI8,13684
22
+ kernpy/core/importer_factory.py,sha256=mXYWaAMyd8q1o2hJg5m0gxpBHX-nX6KGPyWl-zjrX7o,1570
23
+ kernpy/core/kern_spine_importer.py,sha256=9jKDTDDcH81U4Vws4x5msUDq89QzwbdEGYb6uHt-cDI,2581
24
+ kernpy/core/mens_spine_importer.py,sha256=GGutGL3qeatIkdHZxiOJNcT5mc70acJ728xu-VVLkOU,692
25
+ kernpy/core/mhxm_spine_importer.py,sha256=45QhuqIgXKkLMFkZYk17sdgOH8dfzK08mWE24fGZ-n4,1410
26
+ kernpy/core/pitch_models.py,sha256=TpSt1uxGYhbhXs0viB1dNo4jiGxyCOHWseyRHTpfH-0,9730
27
+ kernpy/core/root_spine_importer.py,sha256=w7oFbMeXakHF9OAlgKWm_HaGJoNq6u7BE_JUnvLiLnU,1893
28
+ kernpy/core/spine_importer.py,sha256=_VoWcVGfDMhxDn-hCu18g_29Aw2c2bjLnaXuvW2Fbsc,1430
29
+ kernpy/core/text_spine_importer.py,sha256=mz1qX2nviJs0VsGsN87jk6BVWCIE7mmB9IxEx4RdhT8,1522
30
+ kernpy/core/tokenizers.py,sha256=dJsaCdPStruzToaYA-RyM9beJ9tQyZRjM4qKLK0d0k4,7899
31
+ kernpy/core/tokens.py,sha256=0XhbYm6F9NDfYpP5gbrgzZL3qB_xWs74faTwAZghpyM,66515
32
+ kernpy/core/transposer.py,sha256=EqsEy7Z3bWIXdxUTruBrg8z9sWdJ3Cd_KIzo_6ZuNNA,9352
33
+ kernpy/core/generated/kernSpineLexer.interp,sha256=Y3_seqmHQu3czO9fHE8XtRwTrk8g4Txf0IKiMaHBqeg,28801
34
+ kernpy/core/generated/kernSpineLexer.py,sha256=is10dvLvtJw4bA4rHRb_PA4JKTDKCKhAj9ASTNxVuFo,30170
35
+ kernpy/core/generated/kernSpineLexer.tokens,sha256=ciGB91o4t7VM-tgSLtGB-BUFzHNocVJSUlkjNzK2lcc,2634
36
+ kernpy/core/generated/kernSpineParser.interp,sha256=mnomJbjTpqMgQdAmYbqBUxk6s7D6OGYh2ya5r6qy8uc,41570
37
+ kernpy/core/generated/kernSpineParser.py,sha256=j8jnx4gEiTVDJ-juys8YS8-4zHUNfBDuFC3sIBSsK90,338634
38
+ kernpy/core/generated/kernSpineParser.tokens,sha256=ciGB91o4t7VM-tgSLtGB-BUFzHNocVJSUlkjNzK2lcc,2634
39
+ kernpy/core/generated/kernSpineParserListener.py,sha256=fcOPxYkGbNbIw8Qk9aqYXnuTB48WWJCn_ZYxTdoFtpY,40015
40
+ kernpy/core/generated/kernSpineParserVisitor.py,sha256=YSEdcb4kuIi-E4rAFhDKsCVu0lyPdlqrCMtQAeVDhZY,23821
41
+ kernpy/io/__init__.py,sha256=9103cE_Ao1tu2mi4EaFni-YmnCnwtJqQqFqgeFuT7rA,147
42
+ kernpy/io/public.py,sha256=p5f22Vse54vU3QYDBn5Z5iJXhRLrF9OTG1MYD8QhdGc,13782
43
+ kernpy/polish_scores/__init__.py,sha256=EjILt5N5T9cKKdhWwflS_MU4TXuLhdHOYhW8txaicrI,217
44
+ kernpy/polish_scores/download_polish_dataset.py,sha256=VqACpxDiM1yQYDs4QHHlZ87ZW2gkjl6R_bxYh5E67K4,14633
45
+ kernpy/polish_scores/iiif.py,sha256=yITdrQbMsGmm8qag8TSousjCjS2io148Jk9xwEKa3B4,1526
46
+ kernpy/util/__init__.py,sha256=dfW3nRSMkGQS7p7YebM271_0H8_pVw4IiDKeINs_LI8,152
47
+ kernpy/util/helpers.py,sha256=Xbj3nWNyErdOpLHYd4uVyfwleXvmC5_FlYEhxaeTtS8,1549
48
+ kernpy/util/store_cache.py,sha256=AA7SFCGQ6ryy-c02wbLy8gIQ2C-VdM1JSWFoWIK_KLA,1186
49
+ kernpy-1.0.1.dist-info/METADATA,sha256=1SpNbdsg1KHO4FnR7vSeabwlsueGoA8y-4RDN-v2vZk,15096
50
+ kernpy-1.0.1.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
51
+ kernpy-1.0.1.dist-info/RECORD,,
@@ -1,5 +1,4 @@
1
1
  Wheel-Version: 1.0
2
- Generator: setuptools (75.8.2)
2
+ Generator: hatchling 1.27.0
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any
5
-
kernpy/example.py DELETED
@@ -1 +0,0 @@
1
- kernpy='MEC 2025'
@@ -1,19 +0,0 @@
1
- Copyright (c) 2018 The Python Packaging Authority
2
-
3
- Permission is hereby granted, free of charge, to any person obtaining a copy
4
- of this software and associated documentation files (the "Software"), to deal
5
- in the Software without restriction, including without limitation the rights
6
- to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
7
- copies of the Software, and to permit persons to whom the Software is
8
- furnished to do so, subject to the following conditions:
9
-
10
- The above copyright notice and this permission notice shall be included in all
11
- copies or substantial portions of the Software.
12
-
13
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
14
- IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
15
- FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
16
- AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
17
- LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
18
- OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
19
- SOFTWARE.
@@ -1,19 +0,0 @@
1
- Metadata-Version: 2.2
2
- Name: kernpy
3
- Version: 0.0.2
4
- Summary: A small example package
5
- Author-email: Example Author <author@example.com>
6
- License: MIT
7
- Project-URL: Homepage, https://github.com/pypa/sampleproject
8
- Project-URL: Issues, https://github.com/pypa/sampleproject/issues
9
- Classifier: Programming Language :: Python :: 3
10
- Classifier: Operating System :: OS Independent
11
- Requires-Python: >=3.8
12
- Description-Content-Type: text/markdown
13
- License-File: LICENSE
14
-
15
- # Example Package
16
-
17
- This is a simple example package. You can use
18
- [GitHub-flavored Markdown](https://guides.github.com/features/mastering-markdown/)
19
- to write your content.
@@ -1,7 +0,0 @@
1
- kernpy/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
2
- kernpy/example.py,sha256=NCJb_ORah5NZc_e8t2N7un7fJDlCoC65nwdJDHEq9uA,17
3
- kernpy-0.0.2.dist-info/LICENSE,sha256=2bm9uFabQZ3Ykb_SaSU_uUbAj2-htc6WJQmS_65qD00,1073
4
- kernpy-0.0.2.dist-info/METADATA,sha256=29JiQ-bagu4sl0HUI0E1GyFUyvK2zjau_Yl3Jls7_S8,625
5
- kernpy-0.0.2.dist-info/WHEEL,sha256=jB7zZ3N9hIM9adW7qlTAyycLYW9npaWKLRzaoVcLKcM,91
6
- kernpy-0.0.2.dist-info/top_level.txt,sha256=mioh6PCXgxwhchgmJSffHmPGltPeMR0vava0faosCxA,7
7
- kernpy-0.0.2.dist-info/RECORD,,
@@ -1 +0,0 @@
1
- kernpy