Tools for music analysis and generation
Project description
tonal
Tools for music analysis and generation
To install: pip install tonal
Examples
chords
from tonal import chords_to_wav
chord_sequence = [
('Bdim', 120),
('Em11', 120),
('Amin9', 120),
('Dm7', 120),
'G7',
'Cmaj7',
]
wav_filepath = chords_to_wav(chord_sequence)
If you have hum you can use it to diplay (and hear) the sound:
from hum import Sound
Sound.from_file(wav_filepath).display()
Change the way the chords are played, and what the name (really, filepath) of the midi and wav files produce are.
from tonal.chords import play_arpeggio
Sound.from_file(
chords_to_wav(chord_sequence, name='test_arpeggio', render_chord=play_arpeggio)
).display()
counterpoint
The `translate_in_scale` allows you to translate a sequence of notes, or multiple
tracks of notes by the given number of steps within the given scale.
>>> stream = translate_in_scale(['C4', 'E4', 'B3', 'C4'], -2, 'C')
>>> stream # doctest: +ELLIPSIS
<music21.stream.Stream ...>
>>> note_names(stream)
['A3', 'C4', 'G3', 'A3']
For multiple tracks:
>>> tracks = [['C4', 'E4', 'G4'], ['A4', 'C5', 'E5']]
>>> translated_tracks = translate_in_scale(tracks, -2, 'C')
>>> multi_note_names(translated_tracks)
[['A3', 'C4', 'E4'], ['F4', 'A4', 'C5']]
Using some other scales:
With a E major scale:
>>> tracks = [['E4', 'G#4', 'B4'], ['C#5', 'E5', 'G#5']]
>>> translated_tracks = translate_in_scale(tracks, 1, 'E')
>>> multi_note_names(translated_tracks)
[['F#4', 'A4', 'C#5'], ['D#5', 'F#5', 'A5']]
With a D flat major scale:
>>> tracks = [['Db4', 'F4', 'Ab4'], ['Bb4', 'Db5', 'F5']]
>>> translated_tracks = translate_in_scale(tracks, -3, 'Db')
>>> multi_note_names(translated_tracks)
[['A-3', 'C4', 'E-4'], ['F4', 'A-4', 'C5']]
Now let's use a different, "custom" scale, as well as demonstrate the use
of a partial function to get a translator with a fixed input scale:
>>> from functools import partial
>>> from music21.scale import HarmonicMinorScale
>>> translate = partial(
... translate_in_scale, input_scale='A', scale_creator=HarmonicMinorScale
... )
>>> tracks = [['A4', 'C5', 'E5'], ['G#5', 'A5', 'C6']]
>>> translated_tracks = translate(tracks, 2)
>>> multi_note_names(translated_tracks)
[['C5', 'E5', 'G#5'], ['B5', 'C6', 'E6']]
Let's make a four part cycling V-I progression.
from tonal.counterpoint import translate_in_scale, create_score_from_tracks
from tonal.util import play_music21_object
motif = [
"C4 C4".split(),
"E4 E4".split(),
"G4 F4".split(),
"B4 A4".split(),
]
tracks = translate_in_scale(motif, range(7, -14, -1), 'C')
score = create_score_from_tracks(tracks)
score.show()
play_music21_object(score)
Project details
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
tonal-0.0.6.tar.gz
(12.9 kB
view details)
Built Distribution
tonal-0.0.6-py3-none-any.whl
(13.9 kB
view details)
File details
Details for the file tonal-0.0.6.tar.gz
.
File metadata
- Download URL: tonal-0.0.6.tar.gz
- Upload date:
- Size: 12.9 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/5.1.1 CPython/3.10.13
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | 03394b8a30d645264ac00468c757bef1dfea5f85635fd96e97584d3c75fd0ef8 |
|
MD5 | 8b323f933bf791ad219a73753dd060e1 |
|
BLAKE2b-256 | fcc383d885e60e64a33900e3a88e73d5d0d6a6ff3fb89b0518674951fd8fdcec |
File details
Details for the file tonal-0.0.6-py3-none-any.whl
.
File metadata
- Download URL: tonal-0.0.6-py3-none-any.whl
- Upload date:
- Size: 13.9 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/5.1.1 CPython/3.10.13
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | b52dd1268addccb3e2a96c203bab97f8910855ac0def4364419e29259446e301 |
|
MD5 | 03fe40e3bb47f7845a2965b47ed0f49d |
|
BLAKE2b-256 | f3042e75fd5e0a2ceab68e1b03972487f62984fabb3a794323722ba0908160f0 |