- •Раздел 1. Обзор источников научно-технической информации по теме исследования 5
- •Раздел 2. Описание процедуры проведенного научного исследования 7
- •Введение
- •Раздел 1. Обзор источников научно-технической информации по теме исследования
- •Раздел 2. Описание процедуры проведенного научного исследования
- •Этап 3. Интерпретация полученных в исследовании результатов
- •Заключение
- •Список используемых источников
- •Приложение а
Приложение а
Листинг 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
