Делаем MIDI-клавиатуру из старого детского синтезатора

    image

    В один из дней, возвращаясь домой, возле мусоропровода в подъезде я увидел старую детскую игрушку-синтезатор. Прошел мимо, так как брать с мусорки «грешно», но в душе захотелось утащить ее оттуда. Уже поздно ночью, где-то часа в 2 я решил посмотреть, не стоит ли она все еще там. И да, она все еще была там! С виду она был вполне целой и чистой, так что никакой брезгливости, чтобы не забирать ее не было. Так что да, я ее забрал.

    Давно хотел себе пианино, я не профессиональный музыкант, но просто побаловаться — почему нет? Покупать что-то «ради побаловаться» меня «душила жаба», а тут — халявная игрушка. Когда я ее забирал с мусорки, то даже мысли не было пользоваться ей как детской игрушкой, была сразу мысль: «О-о-о…, хорошая база, чтобы попробовать сделать MIDI-клавиатуру».
    Так как у меня уже есть некоторый опыт общения с профессиональными клавишными инструментами и MIDI-клавиатурами, то я сразу понимал все минусы моей идеи. То есть игрушка по факту так игрушкой и останется. На базе нее невозможно будет реализовать силу нажатия клавиш. Сами «легкие» пластиковые клавиши, которые к тому же еще и неполноразмерные не дадут возможности что-то на ней достойно исполнять.

    В первую очередь синтезатор-игрушка была разобрана «до винтика», хорошо вымыт с мылом весь пластик. Также почищены платы и контактные группы клавиш.

    После разборки пришло понимание, почему люди ее выкинули. У игрушки (не знаю от чего: от времени, от китайского качества комплектующих или жесткой эксплуатации) во-первых: развалились встроенные динамики, а во-вторых: в разъеме наушников торчал отломанный разъем от них, так что вытащить его не было практически никакой возможности. Наверное, после того как игрушка перестала играть встроенными динамиками, ей пользовались с наушниками, а потом после того как и там сломали разъем – просто выкинули.

    Внутри игрушка-синтезатор состояла из трех плат, которые между собой были спаяны шлейфом проводов. Центральная плата, которая отвечала за генерацию звука и прочего, была сразу же отпаяна от двух других плат и отложена в сторону. На двух других платах находились контакты для кнопок на лицевой панели игрушки и непосредственно самих клавиш пианино. К ним я припаял разъемы PBS, тем более что шаг отверстий на платах как раз был 2.54 мм.





    После этого я потратил пару часов на составление схем этих плат с клавишами. Как выяснилось, схема представляет простую матричную клавиатуру.



    На картинке в желтых кружочках цифры – это номера контактов «горизонталей», а цифры на клавишах – номера контактов «вертикалей» в разъеме PBS-13 на плате клавиатуры.







    После этого все это было закинуто в угол и пылилось целый год. И тут наступил период самоизоляции… Стало скучно и захотелось что-то поделать своими руками, тем более что ходить некуда, да и нельзя…

    В итоге решил все-таки попробовать хоть немного доделать эту игрушку. В качестве основы для контроллера взята плата Arduino, а так как количество цепей клавиш больше, чем количество выводов Arduino UNO, то решил использовать сдвиговые регистры 74HC595 и 74HC165. В итоге получилась вот такая схема.



    Схема была изначально собрана на беспаечной макетной плате. Для проверки работоспособности схемы (что нигде нет ошибок в соединениях) разработана тестовая программа, которая показала, что вроде как все работает. Алгоритм тестовой программы был простой: включается один из выходов микросхемы сдвигового вывода и считываются в цикле значения с микросхемы сдвигового ввода, нажимая при этом клавиши. На первый взгляд ничего не предвещало беды… и вроде бы все прекрасно работало…



    Следующие несколько дней я не спеша занимался «домашним творчеством», а именно, аккуратно распаивал все компоненты платы на макетную плату. Собирал это все из того, что было у меня дома. В качестве управляющей платы взял Arduino NANO.



    Такой «бутерброд» из плат обусловлен тем, что две платы игрушки (одна с кнопками, а вторая с клавиатурой) расположены на разном уровне и я, прежде чем паять все это подумал: «а нельзя ли это как-то соединить между собой, используя те компоненты, которые есть у меня дома, чтобы выглядело более или менее хорошо»? Так и получилась эта конструкция из двух плат, соединенных между собой разъемами. С моей точки зрения для домашнего варианта, когда сидим в самоизоляции, получилось достаточно хорошо. Пришлось только обрезать макетную плату и чуть-чуть доработать корпус игрушки, чтобы можно было подключать кабель USB в плату Arduino.



    Осознание что устройство работает не совсем так, как я хотел, пришло тогда, когда доработал тестовую программу. Алгоритм был простой: по очереди включить каждый выход микросхемы 74HC595, считав при этом состояние входов у микросхемы 74HC165, и записать результат в отдельные переменные. Всего на клавиатуру подключено 5 выходов 74HC595, поэтому в итоге я получил 40 бит (5*8) данных после этого опроса. Строка из 40 бит выводилась в консоль, и нажимались клавиши, чтобы посмотреть, как устройство обрабатывает одновременные нажатия нескольких клавиш.



    Тут-то и всплыла проблема: если нажимать по одной клавише, то все было отлично, но при попытке нажать более 2-х клавиш одновременно возникала ситуация, когда невозможно было предугадать, что будет прочитано. Результат мог быть правильным при одном сочетании, а при другом мог быть совсем непредсказуем. Проблема была в том, что не была учтена особенность данной схемы. При нажатии нескольких клавиш одновременно происходит замыкание не только нескольких вертикалей сканирования клавиатуры (это допустимо), но и могут быть замкнуты через клавиши несколько горизонталей (что никак не допустимо). Более подробно об этой проблеме и о способах ее решения можно почитать вот здесь.

    Я выбрал «кардинальное решение» проблемы, а именно: решил, что на каждую клавишу в клавиатуре будет поставлено по диоду.

    В голове я уже мысленно начал думать, как мне придется перерезать дорожки на плате и ставить в разрыв диод в SMD корпусе. Залез в свои запасники и увидел, что диодов в SMD корпусе в таком количестве у меня просто нет (не забываем, что все мы сидим на самоизоляции и поход в магазин за радиодеталями не очень возможен – так как это точно не предметы первой необходимости). Немного расстроившись, решил более внимательно посмотреть на плату: может быть есть возможность поставить на часть дорожек выводные диоды (их тоже какое-то количество у меня было). И тут я увидел, что у каждой клавиши, есть перемычка (плата односторонняя) и схема сделана так, что вместо этой перемычки можно поставить по диоду. Сразу же подумалось – даже и ничего резать не надо, надо только везде поставить вместо перемычек выводные диоды. Такого количества выводных диодов у меня тоже не было. В голове мелькнула мысль: «а может быть поставить светодиоды»? Работа схемы идет на уровне +5V и если поставить красные светодиоды, у которых минимальное падение напряжения (среди светодиодов), то в итоге должно хватать логического уровня для правильного определения: нажата клавиша или нет.



    С этой мыслью я снова полез в свои запасы и выгреб откуда только можно было красных светодиодов. Их оказалось ровно столько, сколько клавиш на клавиатуре! Это знак, подумал я, и впаял для пробы несколько светодиодов вместо перемычек. Результаты тестирования показали, что решение рабочее. После этого запаял остальные светодиоды вместо перемычек. Тестовая программа показала, что можно нажать хоть все клавиши одновременно, и они все считываются правильно.



    На дополнительные кнопки, которые есть на игрушке, решил не ставить диоды, потому что вряд ли их будут нажимать сразу несколько штук одновременно. Тем более что в программе у меня пока нет обработки нажатий на эти кнопки. Ну и я банально пока не придумал, как их использовать.

    Настало время разобраться с тем, как сделать, чтобы это устройство виделось в компьютере как MIDI-клавиатура и в каком формате нужно отправлять данные.

    Информация, найденная в интернете, говорила мне о том, что можно из Arduino сделать MIDI-клавиатуру очень легко и просто, если залить в нее прошивку, которая заставит компьютер видеть ее не как COM-порт, а именно как MIDI-клавиатуру. Изначально я на это решение и ориентировался, особо не вдаваясь в то, как оно реализовано.

    Теперь, когда я добрался до него и внимательно прочитал, то понял, что моя плата Arduino NANO не подойдет для этого решения, так как у нее COM порт был реализован на базе микросхемы CH340. Для использования прошивки по ссылке выше подойдут только те платы, где USB-порт уже есть на контроллере (например: AtMega32u4) или же общение по COM-порту сделано не на микросхемах преобразования типа FT232RL и им подобным, а на микроконтроллерах AtMega. Поэтому прошивка в плате должна отдать данные в формате MIDI в COM порт, а на компьютере придется установить и настроить программное обеспечение, которое будет эти данные перехватывать и передавать в виртуальный MIDI-порт.
    Алгоритм считывания клавиш и формирования MIDI-команд у меня получился следующий:



    Программа для контроллера Arduino NANO выглядит сейчас так.
    // микросхема для выдачи +5V
    //Пин подключен к ST_CP входу 74HC595
    #define latchPin      11
    //Пин подключен к SH_CP входу 74HC595
    #define clockPin      13
    //Пин подключен к DS входу 74HC595
    #define dataPin       12
    
    // микросхема для считывания напряжения +5V
    #define latchPin_IN   9
    #define clockPin_IN   10
    #define dataPin_IN    8
    
    // контакты, к которым подключены оставшиеся выводы разъема 1-16 с кнопками и светодиодами
    #define BUT_OUT0      7
    #define BUT_OUT1      6
    #define BUT_OUT2      5
    #define BUT_OUT3      4
    
    byte but_out[4] = {BUT_OUT0, BUT_OUT1, BUT_OUT2, BUT_OUT3};
    // здесь будут храниться данные после опроса клавиатуры
    byte kbd_in[5] = {0, 0, 0, 0, 0};
    byte kbd_in_new[5] = {0, 0, 0, 0, 0};
    
    // здесь будут храниться данные после опроса кнопок
    byte btn_in[4] = {0, 0, 0, 0};
    byte btn_in_new[4] = {0, 0, 0, 0};
    
    // первые 3 бита - это светодиоды (1 - включено, 0 - выключено)
    byte kbd_out = 0b11100000;
    
    // инициализация портов
    void init_electronics() {
      // для микросхемы, которая генерирует +5V
      //устанавливаем режим OUTPUT
      pinMode(latchPin, OUTPUT);
      pinMode(clockPin, OUTPUT);
      pinMode(dataPin, OUTPUT);
    
      // для микросхемы, которая читает +5V
      pinMode(latchPin_IN, OUTPUT);
      pinMode(clockPin_IN, OUTPUT);
      pinMode(dataPin_IN, INPUT);
    
      // инициализация портов к которым подключены оставшиеся выводы разъемы с кнопками
      for (byte i = 0; i < 4; i++) pinMode(but_out[i], OUTPUT);
    }
    
    // записать данные в микросхему сдвига 74HC595
    void write_5V(byte a) {
        digitalWrite(latchPin, LOW);
        // передаем последовательно на dataPin
        shiftOut(dataPin, clockPin, MSBFIRST, a); 
         //"защелкиваем" регистр, тем самым устанавливая значения на выходах
        digitalWrite(latchPin, HIGH); 
    }
    
    void read_5V(byte *btn, byte *kbd) {
      digitalWrite(clockPin_IN, HIGH);
      digitalWrite(latchPin_IN, LOW);
      digitalWrite(latchPin_IN, HIGH);
      
      // читаем первый байт - в нем состояние кнопок
      *btn = shiftIn(dataPin_IN, clockPin_IN, LSBFIRST);
      
      // читаем второй байт - в нем состояние клавиатуры
      *kbd = shiftIn(dataPin_IN, clockPin_IN, LSBFIRST);
    }
    
    void setup() {
      init_electronics();
      write_5V(kbd_out);
      Serial.begin(115200);
    }
    
    // прочитать состояния клавиатуры и кнопок в массивы, переданные по указателям
    void read_kbd_and_btn_state(byte *btn, byte *kbd) {
     byte tmp;
      for (byte i = 0; i < 5; i++) {
        write_5V(kbd_out | (1 << i));
        read_5V(&tmp, &kbd[i]);
      }
    }
    
    void noteOn(int cmd, int pitch, int velocity) {
      Serial.write(cmd);
      Serial.write(pitch);
      Serial.write(velocity);
    }
    
    // проверка одного бита  num в переменной, возврат следующих значений
    // 0 - было 0, стало 0
    // 1 - было 0, стало 1
    // 2 - было 1, стало 1
    // 3 - было 1, стало 0
    byte compare_bit(byte old_state, byte new_state, byte num) {
      byte tmp_old, tmp_new;
      tmp_old = (old_state >> num) & 1;
      tmp_new = (new_state >> num) & 1;
      if ((tmp_old == 0) && (tmp_new == 0)) return 0;
      if ((tmp_old == 0) && (tmp_new == 1)) return 1;
      if ((tmp_old == 1) && (tmp_new == 1)) return 2; 
      if ((tmp_old == 1) && (tmp_new == 0)) return 3;  
    }
    
    void loop() {
      read_kbd_and_btn_state(btn_in_new, kbd_in_new);
      for (byte i = 0; i < 5; i++) {
        for (byte j = 0; j < 8; j++) {
          switch (compare_bit(kbd_in[i], kbd_in_new[i], 7 - j)) {
            // ноту нажали
            case 1: noteOn(0x90, 0x1D + (8 * i + j), 0x7F);
                    break;
            // нота удерживается
            case 2: //noteOn(0x00, 0x1D + (8 * i + j), 0x7F);
                    break;
            // ноту отпустили
            case 3: noteOn(0x90, 0x1D + (8 * i + j), 0x00);
                    break;
          }
        }
        kbd_in[i] = kbd_in_new[i];
      }
    } 
    


    Нет смысла расписывать подробно, как работать с MIDI данными, потому что это можно прочитать здесь.

    Остановлюсь чуть более подробно на программном обеспечении для компьютера и тех проблемах, с которыми я столкнулся. Проблемы возникли, просто из-за отсутствия нормальной документации на это программное обеспечение. Итак, для того, чтобы компьютер успешно мог принимать MIDI-данные с такого устройства как у меня, понадобится две программы: loopMIDI и Serial-Midi Converter. Для программы Serial-MIDI Converter дополнительно нужно установить Java, если на компьютере она не установлена.

    Запускаем программу loopMIDI и создаем два виртуальных порта. Я назвал их «Arduino IN» и «Arduino OUT». Эта программа как раз и будет виртуальным MIDI-устройством.



    Далее запускаем Serial-MIDI Converter и при запуске проходим процесс ее настройки. К сожалению, это приходиться делать каждый раз при запуске, но это не очень страшно, делается буквально в четыре нажатия на клавиатуре. Номер COM-порта может быть другой, он появляется на компьютере при подключении платы Arduino NANO. Скорость порта задается в прошивке Arduino NANO. Красными стрелками обозначены мои параметры, при которых у меня все работало.



    Собственно на этом процесс настройки завершен и можно уже использовать какое-либо программное обеспечение, которое будет воспроизводить звуки, принимая нажатия клавиш от устройства. В настройках программного обеспечения необходимо выбрать в качестве входа «Arduino_OUT». На картинке ниже пример настройки Kontakt Player.



    Работает в конечном итоге это вот так:


    Что дальше? А дальше все произошло именно так, как я и ожидал – игрушка остается игрушкой ровно со всеми теми недостатками, о которых я упоминал в самом начале. Наверное, ребенку поиграть на таком будет в кайф, но вот взрослому человеку, после нормальных клавишных инструментов… Проще купить достаточно дешево любую MIDI-клавиатуру б/у и она будет на порядок лучше этой игрушки. Я решил оставить эту игрушку как она есть, но сделать некоторые модификации с ней:

    1. Оставить оригинальный корпус.
    2. Поставить исправные динамики и сделать усилитель для них.
    3. Сделать так, чтобы она работала в режиме «детской игрушки» без подключения к компьютеру, то есть, чтобы сама могла играть звуки.
    4. Сделать возможность подключения FootSwitch (та самая педаль на пианино внизу), чтобы можно было сделать удержание звука после отпускания клавиш, как на нормальном инструменте.
    5. Добавить в прошивке поддержку клавиш, которые сейчас не опрашиваются и не задействованы.
    6. Подключить в схему переменный резистор, который остался физически на панели игрушки-синтезатора, и добавить его функциональность в прошивку.



    Реализацию большинства пунктов, пока все мы дружно «сидим дома», сделать не могу, так как у меня дома просто нет всех требуемых компонентов для этого.

    Для реализации пункта 3 в интернете было найдено решение под названием SamplerBox. Суть проекта в том, что можно подключать любую MIDI-клавиатуру к плате Raspberry Pi, которая обрабатывает MIDI-команды с клавиатуры и воспроизводит звуки или переключает инструменты и т.д. Остается только поставить плату Raspberry Pi внутрь корпуса игрушки, без возможности замены SD-карты (не разбирая корпус), настроить кнопки на корпусе игрушки так, чтобы они переключали инструменты и этого будет достаточно, чтобы оставить этот проект в таком виде.

    Но все это будет уже после того, когда закончится период самоизоляции.

    Надеюсь, что кому-нибудь мой опыт окажется полезным.

    Средняя зарплата в IT

    111 000 ₽/мес.
    Средняя зарплата по всем IT-специализациям на основании 7 185 анкет, за 2-ое пол. 2020 года Узнать свою зарплату
    AdBlock похитил этот баннер, но баннеры не зубы — отрастут

    Подробнее
    Реклама

    Комментарии 28

      0

      Попробуйте использовать Hairless MIDI. У меня это работает: https://m.habr.com/ru/post/447652/

        0
        спасибо, попробовал. Да, это тоже работает и можно использовать вместо программы Serial-Midi Converter
        +1

        Можно в качестве синтезатора попробовать плату на базе VS1053B. А если что-то пойдет не так, то можно будет из нее сделать интернет-радио, подключив к ESP32. VS1053 воспроизводит звуки без задержек, (мне послышалось, что при подключении к компьютеру они есть). Данные на нее можно подавать по последовательному порту (не у всех плат эта ножка выведена) или по SPI.

          0
          предложенная плата VS1053B конечно хороша, но не нашел в документации: а есть ли у нее возможность одновременно проигрывать несколько файлов с SD-карты. Потому что сами по себе звуки General MIDI просто убогие. Не просто же так упомянул в статье про проект OpenSampler, там все это успешно реализовано и инструменты подгружаются с флешки, которыми играет MIDI-клавиатура.

          Задержек при игре с компьютера нет. Они были, когда я изначально пытался использовать Microsoft GS-синтезатор и прочие встроенные в Windows устройства для проигрывания и воспроизведения MIDI. Но я не просто так упомянул в статье Kontakt Player — когда поставил его, задержек не стало (ну или они есть, но я их не ощущаю). Проблема больше в другом — это же детская игрушка на резиновых кнопках (есть фотка в начале статьи), у разных клавиш чуть-чуть разный ход и срабатывают они чуть по разному, поэтому «мягко» играть не получается. Если продавливать нормально (кстати, именно эти звуки от пальцев на видео явно и слышно у меня), то все срабатывает четко без всяких задержек (на слух я их не слышу).
            0
            Я правильно понимаю, что MIDI в этой плате не wavetable? Я хочу доработать старую MIDI-клавиатуру, чтобы можно было использовать без компьютера, но не знаю, на чём собрать синтезатор.
              0
              посмотрите SamplerBox. Может быть вполне хватит этого Вам.
                0
                Спасибо. Правда, я хотел ограничиться чем-нибудь более легковесным. А на одноплатнике, наверное, можно и FluidSynth запустить с семплами в SF2, что мне будет удобнее — я сейчас делаю для себя небольшое приложение под Linux для отработки игры на клавишах. Но это уже не совсем «без компьютера».) Собственно, такой вариант я рассматривал для апгрейда дешёвого синтезатора, который я покупал, чтобы понять, а надо ли оно мне и детям.
                0
                Как-то наткнулся на этот проект:
                www.synthtopia.com/content/2019/10/21/worlds-smallest-midi-synth-puts-a-powerful-fm-synth-in-your-pocket
                mitxela.com/projects/flash_synth

                Автор обещал исходники, но не знаю, опубликовал ли. Возможно вас заинтересует.
                  0
                  Это как-то слишком мелко. Не уверен, что такой FM может сравниться с wavetable.
              +1

              Годный проект. Однако, не стоило ограничиваться ссылкой на формат передачи MIDI. Не настолько там много и сложно, чтобы не включить необходимый функционал в статью. Без нее статья становится не про MIDI, а про матричные клавиатуры.


              Но проект безусловно достойный и познавательный. Хотя выводы, безусловно, были очевидны даже до начала его реализации. Спасибо.

                0
                Большое спасибо за статью и ссылки!
                Тоже хочу сделать кое-что мидишное, но не прям сейчас.
                Интересно, а можно сделать что-то, чтобы загружать VST и обойтись без компьютера?
                SamplerBox я так понимаю воспроизводит только wavы.
                Какой-то компьютер все равно конечно нужен будет — имеется ввиду что-то минимальное на тех же ардуинках или малинках.
                  0
                  Были попытки сделать хардварные VST хосты. (v-machine, Muse Research MUSE BOX) Толком не взлетели так как очень много ограничений и совместимы они были с ограниченным списком плагинов.

                  VST — обыкновенные x86/x64 бинарники. По понятным причинам не взлетит ни на одной из перечисленных платформ. В лучшем случае на малине можно будет завести какой-нибудь самый простой vst плагин.
                    0
                    Ага. Ну наверное можно и мелкий комп собрать, но хочется чтобы устройство было под одну задачу с минимумом настроек. А с другой стороны — у самих же VST куча настроек обычно. Т.е. получается нужен ноут или планшет. Дома-то можно чем угодно заморочиться, а на концерте всё должно быть просто и надежно.
                  +3
                  >брать с мусорки «грешно»
                  это еще почему?
                    +7
                    О дааа. Чего там только нет. Помнится, проходя заметил фехтовальный костюм с рапирой! Но был с дамой. Не знаю, каким чудом мне удалось через тритысячичертей провернуть немедленную доставку рапиры домой, но с костюмом, увы, не вышло. Смалодушничал.
                    А по итогу что? Дама ушла, а костюм бы остался.
                      0

                      Замечу, что ни одна женщина не уйдет от мужчины в фехтовальной костюме и при рапире! Это же мечта с обложки!
                      Костюмчик жаль!))

                        0
                        А ещё в шляпе, при усах и с голосом Боярского.
                        За костюм не переживайте — наверняка пригодился другому д'Артаньяну.
                          0
                          а это уж как побежит…
                      0
                      На базе нее невозможно будет реализовать силу нажатия клавиш.
                      По моему, на дешёвых MIDI-клавиатурах анализируется не сила нажатия, а скорость.
                        0
                        А как можно определить, что там разпознаётся, сила или скорость? Параметр в MIDI-интерфейсе всё равно называется velocity.
                          0
                          Да, в MIDI интерфейсе — параметр velocity, который будет передавать громкость звучания ноты (зависит от силы нажатия). С технической точки зрения устройство, которое принимает MIDI-команды вообще никак не знает как там это реализовано на физическом уровне, то есть что там меряется скорость или сила и как это преобразуется в громкость звука.
                          0
                          Устройство клавиатуры
                          Вообще там стоит несколько кнопок нажатия. Когда клавишу нажимают, то измеряют скорость между срабатыванием этих кнопок, по ним измеряют громкость нажатия. По ссылке выше есть схемы разных устройств и разных видов клавиатур. Понятия «скорости нажатия» в музыке нет — есть «сила нажатия», потому что синтезаторы пришли из мира обычных клавишных инструментов, а там — чем сильнее клавишу нажмешь, тем сильнее молоточек по струне ударит, таким образом громче звук будет.

                          Скорость нажатия — это уже чисто электронная «придумка», как удешевить производство клавиатуры, а не ставить какие-нибудь хитрые и супер дорогие датчики, которые измерят именно силу удара (нажатия).
                            0

                            Достаточно одной кнопки-переключателя, и измерять время между размыканием 1-2 и замыканием 2-3.

                          0

                          Вот что с людьми не закрытый гештальт делает)
                          И ведь автор знал, что "асфальт не принесет плода, а результат труда" но все же продолжил сажать "алюминиевые огурцы на брезентовым поле" ))
                          Безумству храбрых проем мы славу!

                            0
                            Подобные синтезаторы многие не любят, потому что у них громкость кнопками регулируется в довольно узких пределах. На минимуме всё равно громко. Ставил в один из таких синтезаторов аналоговый регулятор, что дало возможность играть с комфортной громкостью.
                              0
                              судя по конструкции и надписи на панели тут громкость регулировалась как раз переменным резистором (движковый)
                                0
                                У того громкость регулировалась двумя кнопками. Там ещё контроллер был на вертикальной плате с ногами, которая впаяна в большую горизонтальную.
                                  0
                                  У меня как бы недетский синтезатор с полноразмерной чувствительной к касанию клавиатурой имеет подобную проблему, из-за чего пришлось купить наушники с регулировкой громкости. Так что это свойство не только игрушек.)

                            Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

                            Самое читаемое