Spl что это такое
Standard PHP Library (SPL) — Часть 1: Структуры данных
Привет, Хабр! В данной статье речь пойдет про Standard PHP Library (SPL). На хабре до сих пор нет толкового мануала об этой библиотеке, которая уже стала частью ядра PHP (с версии 5.3). Данная библиотека содержит набор интерфейсов, классов структур данных, итераторов и функций, с помощью которых можно значительно упростить себе жизнь и повысить качество кода. В данной статье я рассматриваю такую часть библиотеки, как структуры данных. Также я покажу альтернативные решения поставленных задач и сравню скорость выполнения в обоих случаях.
Итак. Прежде всего хочу дать ссылку на официальную документацию: php.net/manual/en/book.spl.php
В библиотеке SPL содержатся такие структуры данных:
Рассмотри по порядку каждую из структур.
SplDoublyLinkedList
Двусвязный список (DLL) — это список узлов, связанных в обоих направлениях друг между другом. Как известно, есть два принципа извлечения значения из списка – FIFO (First In First Out – первый зашел, первый ушел) и LIFO (Last In First Out – последний зашел, первый ушел). С помощью SplDoublyLinkedList можно извлекать значения по любому из этих принципов. Следовательно, с его помощью можно легко организовать стек или очередь.
SplStack
Данный класс является наследником SplDoublyLinkedList и реализует стек, например:
Ранее для создания мы использовали процедурный способ, а именно использовали функции array_push – добавление элементов в конец массива и array_pop – извлечение последнего элемента. Теперь мы работаем с объектами.
Сравним быстродействие двух способов. Тестовые условия: PHP 5.3.18, Core 2 Duo P7350, Windows. Добавляем в стек число от 1 до n и извлекаем все из стека.
Количество push и pop | Использование функций | Использование SplStack | Отношение |
---|---|---|---|
1000 | 0.007686 | 0.008559 | 0,898002 |
100000 | 0.793184 | 0.884979 | 0,896274375 |
В данном тесте способ с использованием функций сработал быстрее примерно на 10-15%.
Ради интереса провел еще тест в PHP 5.4.8
Количество push и pop | Использование функций | Использование SplStack | Отношение |
---|---|---|---|
1000 | 0.008186 | 0.008735 | 0,937149399 |
100000 | 0.732347 | 0.771456 | 0,949304951 |
По этому тесту можно увидеть, что PHP 5.4.8 быстрее чем PHP 5.3.18 при работе со стеком примерно на 10% и также улучшена работа с объектами. Поэтому все последующие тесты я буду проводить на этой версии PHP.
Однако если добавлять в стек более сложные объекты, то разница между результатами уже на уровне погрешности.
В этом тесте мы добавляли и извлекали из стека следующий объект:
Количество push и pop | Использование функций | Использование SplStack | Отношение |
---|---|---|---|
1000 | 0.007974 | 0.008301 | 0,960607156 |
100000 | 0.818596 | 0.826363 | 0,990600983 |
В реальных приложениях объекты будут намного сложнее, поэтому смею предположить, что значительный перевес будет на стороне метода из SPL.
SplQueue
Данная структура используется для создания очередей. Все аналогично стеку, рассмотрим лишь небольшой пример:
SplHeap
Кучи являются древовидными структурами: каждый узел больше или равен своим потомкам, при этом для сравнения используется внедренный метод сравнения, который является общим для всей кучи. SplHeap реализует основную функциональность кучи и является абстрактным классом.
SplMaxHeap и SplMinHeap
От SplHeap наследуются два класса: SplMaxHeap – для сортировки массива по убыванию его значений, SplMinHeap – для сортировки массива по возрастанию.
SplPriorityQueue
Данная структура представляет собой очередь с приоритетами. Для каждого элемента можно задать его приоритет. Сортировка производится в зависимости от приоритета.
SplFixedArray
Структура представляет собой массив с фиксированным количеством элементов. SplFixedArray хранит данные в непрерывном виде, доступные через индексы, а обычные массивы реализованы в виде упорядоченных хэш-таблиц. Данный вид массива работает быстрее, чем обычные массивы, но существуют некоторые ограничении:
Данная структура хорошо подходит для нумерованных списков. Давайте рассмотрим пример и проведем тесты:
Количество push и pop | Обычный массив | Использование SplFixedArray | Отношение |
---|---|---|---|
100 | 8.2 х 10E-5 | 6.3 х 10E-5 | 1,301587301 |
10000 | 0.004953 | 0.003983 | 1,243535024 |
100000 | 0.053586 | 0.0385701 | 1,389314521 |
1000000 | 0.533003 | 0.384391 | 1,386616752 |
Тесты подтвердили, что при любом заранее известном количестве элементов массива лидирует SplFixedArray. Однако если в процессе размер массива изменяется, то преимущество становится менее существенным: (первоначально размер был задан 10000, потом расширен до 100000):
Количество push и pop | Обычный массив | Использование SplFixedArray | Отношение |
---|---|---|---|
1000000 | 0.051937 | 0.049462 | 1,050038413 |
SplObjectStorage
Данная структура представляет собой хранилище объектов. Объекты можно прикреплять к хранилищу, удалять, получать текущий объект. Рассмотрим несколько примеров с оффициального мануала:
На этом мы закончили изучать структуры данных SPL. Мы научились быстро создавать стек, очередь и списки. Мы теперь знаем о SplFixedArray, который работает быстрей чем обычный массив. Однако это очень маленькая часть применения данной библиотеки. В следующих статьях будут рассмотрены итераторы, интерфейсы, функции и обработка исключений.
990x.top
Простой компьютерный блог для души)
SPL — что это такое в автозвуке?
SPL (Sound Pressure Level) — соревнования по звуковому давлению. Задача — воспроизвести максимум звука/децибел (дБ, чувствительность) из автомобиля. Замеры количества дБ производятся специальным устройством — цифровым анализатором, используемом в конкретном формате. Качество, оформление, эргономика — не играет особой роли. Главное — громкость, децибелы.
Перевод Sound Pressure Level (SPL) — уровень звукового давления.
На соревнованиях SPL не редкость встретить дребезжащих машин от звука, шевелящиеся волосы участников, подпрыгивающие предметы в авто, звук вибрации дверей салона.
SPL — важные моменты
Помимо SPL существует обозначение SQ, которое предположительно расшифровывается Sound Quality — также вид состязаний, где ставка сделана на качество воспроизведения.
Значительные низкие частоты на высокой громкости — задача непростая. Необходимо подобрать правильные усилители/компоненты/нч-динамики, проверить их совместимость, поведение на пиковых нагрузках.
Например повышение звукового давления на 3 дБ требует увеличение мощности усилителя в 2 раза. Граница 150 дБ труднопреодолима, после которой каждый децибел будет на вес золота.
Превращение машины в SPL-систему для будущих состязаний. Требуется не только установить мощную аудиосистему, но и укрепить кузов/стыки дверей/капота для будущих вибраций низкочастотных динамиков. PS на фото выше кажется Лада Приора.
SQ и SPL — два разных лагеря
Важно понимать — SQ и SPL-системы будут разные по цене, а также по предназначению:
На соревнованиях по SQ оценивается:
Как видим — эстетика, внешний вид не на последнем месте.
В SPL-системах часто можно встретить:
Заключение
Звуковое давление и его уровни (spl)
В настоящее статье поговорим о том, что такое звуковое давление, рассмотрим понятие (импеданс) — удельное акустическое сопротивление среды. Также поговорим об уровнях звукового давления и интенсивности звука.
Чтобы лучше понимать о чём сегодня пойдёт речь, советую прочитать предыдущую статью по этой теме ( звуковые волны, виды, длина волны и скорость звука ).
Звуковое давление
Звуковая волна, как мы уже рассматривали в прошлой статье, распространяется в среде в виде волн сжатия и разряжения плотности.
В газах (в том числе и воздухе) плотность и давление связаны между собой:
p = RTp
А поскольку у волны имеются области сжатия и разряжения, то в первой области давление будут выше статического атмосферного. А в случае разряжения – ниже.
Вот как это выглядит:
Разность между мгновенным значением давления в данной точке среды и атмосферным давлением называется звуковым давлением.
Звуковое давление измеряется в паскалях (Па): 1 Па = 1 Н/м².
Наша слуховая система может определять очень большой диапазон разностей между мгновенным значением звукового давления и атмосферным.
На рисунке ниже представлено, различное звуковое давление от звуковых источников в децибелах (про децибелы подробнее читай далее):
Импеданс
Рассматривая звук, в прошлой статье ( читать ) мы выяснили, что звуковая волна зависит от частоты и амплитуды звукового давления. Если тело оказывает большое сопротивление приложенному звуковому давлению, то частицы приобретают малую скорость.
Поэтому импеданс – это удельное акустическое сопротивление среды. Представляет из себя отношение звукового давления к скорости колебаний частиц среды:
Z = p/v
Измеряется в (Па · с)/м или кг/(с · м²).
Удельное акустическое сопротивление для воздуха составляет (при температуре 20 С°) 413 кг/(с · м²). В металле, к примеру, оно составляет 47,7 × 10 кг/(с · м²). Так как в воздухе импеданс достаточно мал, то и излучаемая полезная энергия также мала.
Если рассматривать КПД (коэффициент полезного действия) музыкальных инструментов, голосового аппарата, громкоговорителей и т. п., то оно в воздухе находится в пределах 0,2-1%.
Энергетические параметры
Звуковая волна переносит энергию механических колебаний, значит она имеет энергетические параметры. Среди которых: акустическая энергия P (Дж); мощность W – энергия, переносимая в единицу времени (Вт); интенсивность I – количество энергии, проходящее в единицу времени через единицу площади, перпендикулярной к направлению распространения волны (Вт/м²); плотность – количество звуковой энергии в единице объёма (Дж/м²).
Уровни звукового давления (анг. SPL, sound pressure level)
Восприятие громкости человеком происходит не по линейному закону, пропорционально амплитуде колебаний, а по логарифмическому. Поэтому для определения параметров звука применяют логарифмические шкалы.
Человек различает огромный диапазон изменения звукового давления от тихого 2 × 10 ⁻⁵ Па до очень громкого 20 Па. Разница составляет 10⁶.
Использовать такую школу очень неудобно. Поэтому в измерительных приборах пользуются логарифмическими единицами – децибелами (дБ). Эта единица происходит от другой – бел, который равен десятикратному изменению интенсивности звука. Однако бел – единица крупная и неудобная для измерений. Поэтому применяется её десятая часть – децибел.
Уровень звукового давления определяется как:
L = 20 lg p/p₀
Например, если звуковое давление p = 2 Па, то уровень звукового давления равен: L = 20 lg (2 Па/(2 × 10 ⁻⁵) Па) = 20 lg (1 × 10⁺⁵) = 20 × 5 = 100 дБ.
Один децибел – примерно та наименьшая разница в громкости, которую человеческое ухо может почувствовать.
Полезно запомнить следующее. Изменение громкости в 3 дБ равно отношению 2:1. Поэтому если мы берем два одинаковых источника звука, т. е. удваиваем мощность, то громкость увеличиться на 3 дБ. Например, если к голосу присоединяется ещё один, равный по громкости, то уровень звука увеличится на 3 дБ. Если нужно ещё увеличить на 3 дБ, потребуется вдвое увеличить имеющийся состав.
Также можно обратиться к следующей таблице (в ней показано на сколько дБ нужно убавить, чтобы получить звучание в 2 раза тише, в 3 и т. д.):
1% | 10% | 25% | 33% | 50% | 100% |
1/100 (в 100 раз тише) | 1/10 (в 2 раза тише) | 1/1 | |||
-40дБ | -20дБ | -12 дБ | -10 дБ | — 6 дБ | 0 дБ |
Для определения суммарного уровня давления нескольких инструментов их никогда не складывают. Вначале необходимо рассчитать значение звукового давления каждого инструмента. Допустим играют две скрипки. Одна с уровнем 80 дБ, другая 86 дБ. У первой звуковое давление равно — 0,2 Па, второй — 0,4 Па.
Рассчитывается так: L = 20 lg p/p₀, значит 80 дБ = 20 lg p / (2 × 10 ⁻⁵), далее lg p / (2 × 10 ⁻⁵) = 4. Следовательно 10⁴ = p / (2 × 10 ⁻⁵), отсюда значение звукового давления будет p = 0,2 Па.
После этого определяется суммарное звуковое давление
В нашем случае суммарное давление равно p = 0, 447 Па. Затем определяется суммарный уровень звукового давления. Который равен 86,98 дБ.
Уровень интенсивности звука
Уровень интенсивности звука также измеряется в децибелах по формуле:
L₁ = 10 lg I/I₀
I₀ – нулевой уровень, равный 10⁻¹² Вт/м².
Мощность, напряжение, ток
Перечисленные электрические характеристики также часто приводятся в децибелах и имеют свои специальные обозначения. Приведём несколько примеров:
L dBm = 10 lg WВт/ 1мВт – уровень мощности отнесённый к 1 мВт
L dBv = 20 lg UB/1B – уровень напряжения, отнесённый к 1 В (Америка)
L dBv = 20 lg UB/0,775 B – уровень напряжения, отнесённый к 0,775 В (Европа)
Спасибо, что читаете New Style Sound ( подписаться на новости )
Зачем нужен регистр SPL
Так и тянет меня задать в заголовке статьи вопрос, что по здешним правилам не допускается. А ответ опять очевиден: регистр SPL вообще не нужен.
Я уже давно выступал с критикой системы команд AMD64, сейчас более известной как x86-64. Причем, задача специально анализировать появившиеся и исчезнувшие команды не стояла. Просто при переносе средств программирования с Win32 на Win64 возникал ряд проблем, вызывавших один и тот же вопрос: «почему же раньше все работало, а теперь нет?». Это касается некоторых выброшенных разработчиками архитектуры AMD64 команд, которые пришлось эмулировать, и, особенно, аппаратной поддержки контроля целочисленного переполнения с помощью инструкции INTO, которая вдруг стала недоступной.
Разумеется, я заменил отсутствующую команду INTO условным переходом по переполнению, но, как говорится, настроение было уже испорчено. Ведь эта команда была однобайтная, и раньше этот байт-константу можно было просто дописывать в конец кода команд, в которых может произойти целочисленное переполнение.
Но все-таки проблемы как-то разрешились, и пришло время не только бороться с недостатками системы команд AMD64, но и воспользоваться ее достоинствами. А основных достоинств, по сравнению с IA-32, напомню, два: восьмибайтная адресация, снимающая предел в 4 Гбайт, и увеличенное число регистров общего назначения в два раза.
В случае регистров размером в 2, 4 или 8 байт действительно все логично и естественно. Можно даже сказать, что число регистров увеличилось более чем в два раза, поскольку указатель стека и не используется в вычислениях как остальные. Поэтому в IA-32 у программиста реально было 7 регистров общего назначения, а в AMD64 их стало 15, т.е. RAX, RBX, RCX, RDX, RBP, RSI, RDI и R8-R15.
Но вот в случае регистров размером в байт не все так логично. Немного отвлекаясь, замечу, что объектам размером в байт вообще «не везет» в системах программирования. По сравнению с объектами больших размеров они выглядят какими-то ущербными.
Помнится, в «Турбо»-Паскале был всего один тип переменной размером в байт – это CHAR, т.е. символ. Но это еще ладно. А вот в стандарте Си CHAR – это вообще почему-то не символ, а целое число.
Мне это потому кажется странным, что в языке PL/1, который я использую, объекты размером в байт – это самые обычные объекты. Только маленькие. Есть целое знаковое число с атрибутами BINARY FIXED(7), есть строка бит BIT(8), есть строка символов CHAR(1). Да и логические данные с атрибутами BIT(1) при вычислениях все равно обычно занимают весь байтный регистр, поскольку так намного удобнее.
Я это все веду к тому, что регистры с размером в байт очень часто нужны и используются в самых разных задачах. Поэтому увеличение числа таких регистров можно только приветствовать. Тем более что разработчики системы команд AMD64 предложили неожиданный бонус: регистров стало не 16, как можно было предположить, а целых 20.
Так как к восьми имевшимся AL, AH, BL, BH, CL, CH, DL, DH добавлены R8L-R15L, а также еще SPL, BPL, SIL и DIL.
Но когда я приступил к доработкам транслятора в части распределения байтовых регистров, возникло чувство, которое иногда бывает при настойчивой рекламе «торговых скидок». Вроде и платишь меньше, а в конечном итоге как-то так получается, что столько же (а то и больше).
Первая ложка дегтя – появление регистра SPL, т.е. младшего байта указателя стека. Вопрос для чего он нужен, я и вынес в заголовок. Единственная, хоть какая-то полезная операция, которую я смог для него придумать – это проверка указателя стека на кратность 8 или 16. В самом деле, если проверять весь указатель стека RSP на кратность 8 потребуется команда в 7 байт:
А если использовать регистр SPL, то только 4:
Но это сущая мелочь. И, кстати, если использовать не RSP, а двухбайтный SP, команда станет лишь на байт длиннее:
И для выравнивания стека на 16, которое часто требуется для обращения к Win API, наличие регистра SPL вообще не дает преимуществ, сравните:
Безо всякого SPL можно выполнить такое же действие и командой такой же длины. Т.е. этот регистр бесполезен и просто занимает номер (№4) в системе кодов команд. Так что, реально можно использовать уже не 20 регистров, а 19.
Но хуже другое. Дополнительные «бонусные» регистры SPL, BPL, SIL и DIL используют те же коды, что AH, BH, CH, DH (т.е. 4, 5, 6, 7). Это приводит к тому, что «старые» регистры нельзя использовать вместе с «бонусными» в одной команде. Например, нельзя написать команду:
Потому, что процессор просто воспримет ее как:
Поскольку коды регистров AH и SPL одинаковые – 4.
А для задачи распределения регистров при компиляции очень важно, чтобы все регистры были «совместимы», т.е. чтобы их легко можно было присваивать друг другу. Потому что часто байтовый регистр нужно сохранить, а затем восстановить. Эффективнее всего запомнить его в другом байтовом регистре. Но, например, если нужно сохранить регистр AH, а свободны в этот момент R8L-R15L, нельзя это сделать командой:
а потом восстановить командой:
Вот и получается, что надо или вообще не использовать AH, BH, CH, DH и тогда байтовых регистров остается 15 (а если бы не делали «бонусные» регистры их реально было бы 16), или как-то эмулировать отсутствующие команды. Например, несуществующую команду:
Можно эмулировать тремя командами:
Но все это начинает убивать преимущества дополнительных байтовых регистров.
На мой взгляд, разработчики системы команд AMD64 в данном случае не использовали все возможности.
Обратите внимание, что новые по сравнению с IA-32 команды реализованы с помощью REX-префиксов. По сути это просто часть кода команды, вынесенная в отдельный байт. И вот в этом REX-байте только 4 бита несут информацию. Три – это старшие биты номеров регистров-операндов команды (что и дает формальное удвоение их числа), а четвертый – это признак «W», определяющий работу данной команды с 8 или 4 байтами.
Очевидно, что в случае однобайтных операндов и однобайтных регистров этот бит вообще не имеет смысла. Кстати, это легко проверить. Например, эти команды с разным кодом выполняются совершенно одинаково:
Этот неиспользуемый бит «W» и надо было бы тоже задействовать для указания типов байтовых регистров. Например, если бит сброшен, то считать, что по-прежнему используются «старые» восемь регистров AL, AH, BL, BH, CL, CH, DL, DH. Тогда бы и получилось 16 (а не 15 + ненужный SPL) нормальных полностью независимых и «совместимых» регистров, которые любым образом можно было бы использовать в одной команде.
Если же бит «W» установлен, то считать, что это дополнительные регистры. Хотя я бы ввел не BPL, SIL, DIL и уж тем более не бессмысленный SPL, а вторые байты регистров R8-R15, т.е. ввел бы дополнительные регистры R8H-R15H, которые и имели бы в этом случае коды 0-7.
Тогда бы получилось не 20, а даже 24 байтовых регистра, и можно было бы хранить по две независимые переменные (размером в байт) во всех регистрах RAX, RBX, RCX, RDX, R8-R15.
Правда, все равно «старые» и «бонусные» регистры в одной команде было бы использовать нельзя. Одного признака «W», увы, для возможности таких команд мало.
Т.е. можно было бы писать команды типа:
Поскольку нет способа указать, какой из двух операндов «старый», а какой – «бонусный» из AMD64.
Заключение
Разумеется, разработка системы команд это очень трудоемкое и ответственное дело. Наверняка при разработке системы команд AMD64 был проведен анализ реальных программ и обработана статистика использования регистров, что и привело к предложению ввести дополнительные регистры размером в байт.
Но, возможно, при этом рассматривались как раз системы программирования, где байтные объекты являются «пасынками» и поэтому просто не попалось программ «нормально» работающих с регистрами AH, BH, CH, DH, хотя это совершенно обычные регистры при манипулировании объектами размером в байт. Эти регистры также позволяют удобно хранить по две независимые переменные в одном физическом регистре и не тратить команды на распаковку.
В результате стройная система, идущая еще от 8-разрядных микропроцессоров, когда все байтные регистры равноправны и могут встречаться в одной команде, была (на мой взгляд, не совсем обоснованно) нарушена. К тому же появился просто бесполезный регистр SPL. Целесообразней вместо SPL было бы оставить AH.
Конечно, я обойдусь в своем компиляторе и без 24 однобайтных регистров, тем более что возможности по сравнению с IA-32 все равно значительно расширились. Однако, как показано выше, в случае однобайтных регистров можно было бы сравнительно легко повысить эффективность исполнения и увеличить ресурсы (число таких регистров) без существенных изменений системы команд и внутреннего устройства процессора.
Это виды соревнований по автозвуку.
SPL — Sound Pressure Level — уровень звукового давления.
SPL — соревнования на максимальное звуковое давление. В ходе соревнований судьи замеряют пиковое звуковое давление внутри салона автомобиля, либо в непосредственной близости от автомобиля, зависит это от моральной устойчивости судей. ))
Замеры осуществляются с помощью цифрового анализатора используемого в конкретном формате. Соревнования проводятся в нескольких классах. Разделение на классы преимущественно происходит по числу установленных в автомобиле сабвуферов, по размеру короба и т. д. В своем классе побеждают показавшие наиболее высокие результаты автомобили. Замеры традиционно производятся в децибелах.
Все это зародилось в Америке около двадцати лет назад и бысторо завоевало популярность за счет эффектной формы проведения и легкой возможности превращать соревнования в яркое шоу, что привлекает множество болельщиков и зрителей.
При этом, соревнования по SPL – не просто захватывающее зрелище. В них так же определяют правильность выбора усилителей и динамиков, проверяют запас их прочности и качество работы в экстремальных условиях.
Нужно учесть, что создание мощного баса в машине – непростая задача, для ее решения используют специальные комбинации из усилителей огромной мощности и набора самых больших сабвуферов, так же в SPL задействованы точные науки, в основном физика и математика, хотя немало задач решается с помощью геометрии и сопромата.
На самом простом примере, для повышения звукового давления даже на 3 дБ мощность усилителя нужно увеличить в два раза. Каждый новый децибел за гранью 150дБ достигается большим трудом – простым увеличением мощности усилителей уже не обойтись. Процесс расчета и сборки спортивной системы напоминает создание гоночных автомобилей «Формулы-1», в которых все решают самые мелкие моменты сборки.
Демонстрируется все это на соревнованиях различного формата.
Вид автозвуковых состязаний, на которых участник должен показать максимальное звуковое давление внутри транспортного средства.
Транспортное средство и установка участника должны соответствовать требованиям Правил данного формата.
В случаях, когда определенная система или установка будут выходить за рамки настоящих Правил, право принятия решения по данному участнику передается на рассмотрение Главному Судье для определения, соответствия установки духу и целям соревнований.
В качестве источника сигнала должно использоваться стандартное автомобильное устройство воспроизведения CD/DVD.
Звуковые генераторы, умножители частот и любые другие приборы и устройства, имитирующие реальный звуковой сигнал запрещены.
Весь звуковой материал должен воспроизводиться через громкоговорители.
Использование механических и/или иных устройств, для воспроизведения звука не допускается.
Все оборудование располагается внутри автомобиля
Питание аудиосистемы должно осуществляться от бортовой сети автомобиля участника.
Сквозные отверстия в полу (кузове) запрещены. Запрещено выводить наружу порты фазоинверторов.
Любое оборудование не должно выступать за проем передних дверей. Это правило относится как к корпусу сабвуфера, так и касается усилителей, конденсаторов, АКБ.
Запрещается выставлять одно и то же транспортное средство более, чем в одном классе (категории).
Участник имеет право соревноваться только в одном классе (категории).
Все правила трактуются в соответствии с их целями и духом.
В спорных случаях решения главного судьи являются окончательными.
Участник обязуется соблюдать настоящие правила и следовать решениям Главного Судьи.
Формат соревнований максимальной зрелищности!
На данных соревнованиях учавствуют машины с установками для низкого и очень низкого повседневного баса. Все это собирает многочисленные аудитории любителей флекса, хеиртрика и трескающихся лобовы