| import json | |
| import numpy as np | |
| def generate_consonance_matrix(): | |
| """ | |
| Generates a 12x12 matrix representing the consonance/dissonance | |
| between the 12 notes of the chromatic scale. | |
| """ | |
| # Scores based on music theory (higher is more consonant) | |
| # These values are chosen to represent relative consonance and dissonance. | |
| interval_scores = { | |
| 0: 10, # Unison | |
| 1: -8, # Minor Second (dissonant) | |
| 2: -4, # Major Second (dissonant) | |
| 3: 5, # Minor Third (consonant) | |
| 4: 6, # Major Third (consonant) | |
| 5: 4, # Perfect Fourth (context-dependent, generally consonant) | |
| 6: -10, # Tritone (highly dissonant) | |
| 7: 8, # Perfect Fifth (highly consonant) | |
| 8: 5, # Minor Sixth (consonant) | |
| 9: 6, # Major Sixth (consonant) | |
| 10: -3, # Minor Seventh (dissonant) | |
| 11: -7 # Major Seventh (dissonant) | |
| } | |
| matrix = np.zeros((12, 12), dtype=int) | |
| for i in range(12): | |
| for j in range(12): | |
| interval = abs(i - j) | |
| # We only care about the shortest distance between notes on the circle | |
| if interval > 6: | |
| interval = 12 - interval | |
| matrix[i, j] = interval_scores[interval] | |
| return matrix | |
| def save_matrix_to_json(matrix, path): | |
| """ | |
| Saves the matrix to a JSON file. | |
| """ | |
| with open(path, 'w') as f: | |
| json.dump(matrix.tolist(), f, indent=2) | |
| if __name__ == '__main__': | |
| consonance_matrix = generate_consonance_matrix() | |
| file_path = '/home/KidIkaros/Documents/code/Ikaros/musick/chord_detector_extension/consonance_.json' | |
| save_matrix_to_json(consonance_matrix, file_path) | |
| print(f"Consonance matrix saved to {file_path}") | |
| print(consonance_matrix) | |