Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ОНИ.ПР1.4016.Жовтяк.docx
Скачиваний:
5
Добавлен:
27.08.2024
Размер:
2.42 Mб
Скачать

Приложение а

Листинг 1. Код алгоритма для вывода графиков нот

note_names = ["C", "C#", "D", "Eb", "E", "F", "F#", "G", "Ab", "A", "Bb", "B"]

def create_scatter_from_file(file):

import csv

import matplotlib.pyplot as plt

delta_t = 64

def str_list_to_float_list(str_list):

float_list = []

for str_num in str_list:

try:

float_num = float(str_num)

except ValueError:

raise ValueError(f"Не удалось преобразовать '{str_num}' в дробное число.")

float_list.append(float_num)

return float_list

def find_max_index(data_list):

if not data_list:

return -1

max_index = 0

for i, value in enumerate(data_list):

if value > data_list[max_index]:

max_index = i

return max_index

def calculate_average(data_slice):

return sum(data_slice) / len(data_slice)

# Загрузка данных из CSV-файла

with open(file, 'r') as csvfile:

reader = csv.reader(csvfile, delimiter=';')

# Пропуск заголовка

next(reader, None)

# Извлечение времени и высоты ноты

times, pitches = [], []

pitches_matrix = []

index = 0

for row in reader:

float_list = str_list_to_float_list(row)

max_value_index = find_max_index(float_list)

pitches_matrix.append(float_list)

times.append(delta_t * len(pitches) / 10000) # добавляем время, основанное на количестве уже обработанных нот

pitches.append(note_names[max_value_index])

slice_size = 100

# Замена каждых 5 элементов на средние значения выборки из 5 элементов

for i in range(0, len(pitches_matrix), slice_size):

if i + slice_size <= len(pitches_matrix):

pitches_matrix_slice = pitches_matrix[i:i+5]

average_values = [calculate_average([pitches_matrix_slice[j][k] for j in range(5)]) for k in range(12)]

for j in range(slice_size):

pitches_matrix[i+j] = average_values

temp_pitches = []

for i in range(0, len(pitches_matrix)):

index = find_max_index(pitches_matrix[i])

temp_pitches.append(note_names[index])

# Создаем словарь для соответствия индексов нотам

note_to_index = {note: index for index, note in enumerate(note_names)}

# Создаем новый список высот, соответствующий каждой временной метке

# Используем индексы нот из словаря note_to_index

pitches_indices = [note_to_index[note] for note in temp_pitches]

print(pitches_matrix)

plt.figure(figsize=(20, 6))

plt.yticks(range(len(note_names)), note_names)

plt.plot(times, pitches_indices, '.')

plt.xlabel("Время (с)")

plt.ylabel("Высота ноты (MIDI)")

plt.show()

1 https://yandex.ru/video/preview/12133349340264621993

2 https://dzen.ru/video/watch/61c5c7efad72c676c1a6f34a?f=d2d

3 https://yandex.ru/video/preview/6481145064899628511