как узнать bmp трека
Популярность BPM в разных жанрах музыки. Python: анализ скорости исполнения 500 лучших песен
Несколько лет назад, занимался изучением теории музыки, продавал и писал аудио-инструментал для аренды или заказов. Изначально, процесс явно творческий, но вскоре, мой интерес к коммерческой части превысил и возник вопрос: «В каком же темпе создавать ритм музыки?».
BPM [в музыке] — показатель, для определения скорости исполнения композиции, путём измерения количества тактовых долей в минуту.
1: Пролог
Устанавливаем «Matplotlib» и «Pandas» с необходимыми зависимостями через pip-менеджер в консоли/терминале.
Создаём директорию, а потом виртуальное окружение для проекта. После, подключаем библиотеки в IDE [в моём случае: PyCharm].
File — Settings — Project: [. ] — Python Interpreter
2: BPM
BPM будем вычислять через функцию «Detect tempo» в FL Studio и через сайт tunebat.com
ПКМ по верхней левой иконке на звуковой дорожке — Detect tempo — Выбрать диапазон
3: DataSet
Начинаем создание DataSet’а [выборки-коллекции данных] в Excel, для каждого жанра. Экспортируем в CSV-формат с настройками разделителя — запятой. Следующие CSV-файлы создавал в IDE, так удобнее. Выборки перемещаем в директорию, где находится файл самой программы.
В первой строке CSV-файлов указываются параметры, которые разделяются запятыми. Следующие строки содержат уже значения этих параметров. При окончательной проверке, DataSet должен последовательно содержать данные: названия трека, BPM и год выхода композиции. Будем использовать информацию выборки в сто песен, для каждого жанра из выбранных пяти.
Параметры: «name» — название трека; «bpm» — темп; «year» — год релиза
4: Rap — построение точечной диаграммы и гистограммы
На основе информации DataSet’а, создаём точечную диаграмму [Scatter Plots] для изучения взаимосвязи между BPM и годом выпуска, а также для отображения концентраций при ранжировании данных.
Видно, что с 1980 по 2005 гг. основным темпом был диапазон в 90-105 BPM «Код точечной диаграммы с комментариями»
Если диаграмма отражает точечное положение трека в зависимости двух переменных, — BPM и года релиза, — то гистограмма покажет частоту-количество попаданий значения BPM для каждого диапазона на шкале. Таким образом, определится популярность определенного темпа.
Самый популярный диапазон: 80-100 BPM «Код гистограммы без комментариев»
5: Рок
Однозначности пока что нет, — особенность жанра. — поэтому, второй график построен при округлении параметра «year/год выхода композиции».
«Код точечной диаграммы с комментариями»
6: Блюз
Видно высокую концентрацию использования темпа около 100 BPM в 90-х «Код точечной диаграммы с комментариями»
7: Chillout
Много наложений точек друг на друга. К сожалению, не знаю, как это исправить. Пришлось сделать точки более прозрачными, с помощью аргумента «alpha» функции «.scatter».
«Код точечной диаграммы с комментариями»
8: EDM
Здесь также для наглядности пришлось сделать точки ещё более прозрачными. Если кто-то знает, как исправить дефект наложения, прошу написать в комментариях.
Довольно однозначно вышло. «Код точечной диаграммы с комментариями»
9: Заключение
Самым простым графиком сравним количество попаданий в каждый диапазон, композиций, из всех проанализированных ранее жанров*.
* такие жанры как ethnic, ambient, folk, dubstep, reggae и др, не удалось к сожалению разобрать из-за отсутствия качественной выборки.
Работа с файлами в формате BMP
Как уже говорилось, в рамках данного курса обработка изображений будет проводиться средствами библиотеки IPL. При этом, в качестве формата графических файлов для хранения исходных изображений, предназначенных для проведения дальнейшей обработки, предлагается использовать BMP. Причинами такого выбора является возможность хранений полноцветных изображений без потерь и хорошо известная, простая структура. К сожалению, библиотека IPL не располагает возможностями по работе с какими бы то ни было графическими файлами. Поэтому, прежде чем переходить к рассмотрению процедур обработки изображения, рассмотрим структуру формата BMP, и приведем пример чтения графического файла в этом формате.
Структура данных файла в формате BMP имеет следующий вид:
В начале идет структура заголовка файла ( BITMAPFILEHEADER ), имеющая следующий вид:
typedef struct tagBITMAPFILEHEADER
<
WORD bfType;
DWORD bfSize;
WORD bfReserved1;
WORD bfReserved2;
DWORD bfOffBits;
> BITMAPFILEHEADER, *PBITMAPFILEHEADER;
bfType Тип файла. Должен быть «BM». bfSize Размер файла в байтах. bfReserved1, bfReserved2 Зарезервированные поля. bfOffBits Смещение битового массива относительно начала файла.
Далее следует структура информационного заголовка ( BITMAPINFOHEADER ), имеющая следующий вид:
typedef struct tagBITMAPINFOHEADER
<
DWORD biSize;
LONG biWidth;
LONG biHeight;
WORD biPlanes;
WORD biBitCount;
DWORD biCompression;
DWORD biSizeImage;
LONG biXPelsPerMeter;
LONG biYPelsPerMeter;
DWORD biClrUsed;
DWORD biClrImportant;
> BITMAPINFOHEADER, *PBITMAPINFOHEADER;
За информационным заголовком следует таблица цветов, представляющая собой массив структур RGBQUAD (4-байтовых полей). Каждое поле соответствует своему цвету в палитре, а три байта из четырех – синей, зеленой и красной компонентам этого цвета. Последний байт каждого поля зарезервирован и должен быть равен 0.
После таблицы цветов находятся данные изображения, которое по строкам растра записано снизу вверх, а внутри строки – слева направо. Длина каждой строки выровнена на границу в 4 байта (при длине строки, некратной четырем, она дополняется нулями).
Теперь рассмотрим пример реализации чтения графических файлов в формате BMP приложением, построенным на основе MFC с использованием библиотеки IPL:
// Чтение файла в формате BMP
BITMAPINFOHEADER* ipLoad( const char * fname)
<
if(!fname)
return NULL;
BITMAPINFOHEADER* infohdr = NULL;
ifstream fsrc;
if (bmphdr)
< m_img = iplCreateImageHeader(3, 0, IPL_DEPTH_8U,
IPL_DATA_ORDER_PIXEL, IPL_ORIGIN_BL,
bmphdr->biHeight, NULL, NULL, NULL,
iplConvertFromDIB(bmphdr, m_img);
UpdateAllViews(NULL);
>
else
<
TRACE0(«Ошибка при чтении файла BMP»);
>
>
>
6 ответов
1. Если есть возможность использовать GDI+, то задача решается совсем просто. Там есть класс Bitmap, а в нём функции FromFile() и GetPixel().
2. В .NET есть свой класс Bitmap. Решение будет таким же простым. К тому же, он понимает не только BMP, но и некоторые другие форматы.
3. Если нет возможности воспользоваться предыдущими решениями, могу дать примитивнейший тест для чтения BMP. Но только он даже не все форматы BMP сможет прочитать, не говоря уже о других. Дать?
Спасибо за помощь!
Я уже сам роздуплился.
FILE *filePtr;
BITMAPFILEHEADER bitmapFileHeader;
unsigned char *bitmapImage;
unsigned char tempRGB;
int imageIdx=0;
//открываем файл для чтения
filePtr = fopen(filename,»rb»);
if (filePtr == NULL)
return NULL;
//читаем заголовок информации растра
fread(bitmapInfoHeader, sizeof(BITMAPINFOHEADER),1,filePtr);
//выделение объёма памяти, достаточно для чтения файла
bitmapImage = (unsigned char*)malloc(bitmapInfoHeader->biSizeImage);
//проверка выделеной памяти
if (!bitmapImage)
<
free(bitmapImage);
fclose(filePtr);
return NULL;
>
//проверяем считались ли данные
if (bitmapImage == NULL)
<
fclose(filePtr);
return NULL;
>
//меняем местами r и b чтобы получить RGB вместо BGR
for (imageIdx = 0,imageIdx biSizeImage;imageIdx+=3)
<
tempRGB = bitmapImage[imageIdx];
bitmapImage[imageIdx] = bitmapImage[imageIdx + 2];
bitmapImage[imageIdx + 2] = tempRGB;
>
Как узнать bmp трека
В предыдущей статье я совершенно проигнорировал тот факт, что формат BMP имеет множество версий (целых 7), что там присутствует компрессия, разное количество битов на пиксель и цветовые маски. Также, C++ там был только в названии статьи, код был написан на чистом C.
Здесь я постарался добавить поддержку большего количества форматов (конечно не все, но самые популярные) и использовать известные мне возможности C++.
Задача
Из bmp изображения записать в двумерный массив информацию о цвете каждого пикселя, с использованием только стандартных библиотек.
Немного о формате
Представленный ниже код несколько отличается от итогового. Сделано это для того, чтобы читателю было проще понять алгоритм работы программы.
Шапка
В первых 14 байтах располагается «шапка» файла. Перед любыми действиями, следует сверить формат открытого файла с необходимым нам, для этого нужно прочитать первые 2 байта и сравнить их с 0x4D42. Больше информация из «шапки» нам не понадобится.
Заголовок
После «шапки» идёт заголовок с информацией о bitmap файле. В первых 2 байтах находятся данные о длине этого заголовка, эту информацию также можно использовать для определения версии формата. Также нам понадобится информация о высоте и ширине изображения, количестве бит на один пиксель и цветовые маски.
Чтение файла
Читать файл нужно последовательно и побайтово. Для удобного осуществления этого подойдёт следующая шаблонная функция:
Секреты диджеинга от DJ JM
вот сводил транс сегодня!на 133bmp и вдруг заметил что 2-3 трек 89,79bmp а остальные в приделах 135 ну и как ихх свести?
Скорее всего программа неправильно вычислила bpm. Если говорить о Тракторе, то там есть кнопка Тар, позволяющая «настукать» скорость вручную.
Скорее всего программа неправильно вычислила bmp. Если говорить о Тракторе, то там есть кнопка Тар, позволяющая «настукать» скорость вручную.
Также в Интернете есть куча онлайн-счетчиков вроде этого:
а если действительно трэки с большим различием бпм, то обрати внимание на то, что обычно не советуют изменять питч более, чем на
3%
чем больше этот процент, тем больше искажения. хотя некоторые трэки нормально звучат и после 3% =)
спс всем но как этой штукой пользоваться?
http://www.b-boys.com/classic/beatcounter.html
Нужно кликать мышкой на странице в бит музыке.
да уже ненужно это лаг трактора на виртуале все норм!
слышу только музыку
0.8% от чего? Поясни, не вижу связи.
слышу только музыку
не легче второй просто больше поставить )
Если к примеру играет трэк со скоростью 130 бпм, то. получаем вывод, что в даной ситуации можно поставить следующий трек со скоростью бпм не меньше 126,8 и не более 133,2. Я так понимаю?
Ага. При этом новый трек будет подогнан под старый, и его фактический BPM тоже составит 130. Но т.к. его питч не выйдет за пределы 4%, то он еще будет звучать пристойно.
Вообще, треки одного стиля держатся в довольно плотном диапазоне BPM, так что необходимость выходить за пределы пресловутых 4% при битмэтчинге возникает редко.
Вообще, треки одного стиля держатся в довольно плотном диапазоне BPM, так что необходимость выходить за пределы пресловутых 4% при битмэтчинге возникает редко.
Хаус тоже очень разноплановый Наверное, я просто обычно играю в довольно узкой стилевой нише.
Хаус тоже очень разноплановый Наверное, я просто обычно играю в довольно узкой стилевой нише.
2. ПРИМЕР! Играет трек. мы копаемся в портфеле с дисками и находим трек, который хотелось бы поставить. Но мы не знаем его бпм! С битмэтчингом все лады, НО! если мы поставим этот трэк и он по бпм будет отличатся от трека который играет больше чем на преславутых 4% и трек будет искажен до неузнаваемости Как с этим бороться, кроме как писать скорость бпм на трек-листе к диску?