+1115203506143 :)

blog

Yamaha AN200, MU128 S/PDIF mod (updated 21.03.2016)

17 марта 2016, 13:00

Известно, что последние ямаховские модули MU-серии не сильно-то отличаются друг от друга. Например, MU2000 отличается от MU1000 всего лишь наличием сэмплера/секвенсора и SM ридера. В свою очередь, MU1000 отличается от MU128, по существу, лишь наличием оптического выхода. Незначительное увеличение количества семплов в расчет мы не берем :) Цена, однако, отличается почти в +100$ за версию с оптикой. Расходы же на эту схему составили всего около 5$.

Однажды мне попалась ссылка на мод MU10 (http://nfggames.com/forum2/index.php?topic=4063.0). Автор мода опирался на японскую разработку для Roland SC-88. В основе мода лежит чип TC9231N от Toshiba, который реализует цифровой аудиоинтерфейс по стандарту SPDIF/TOSLINK. Чип можно заказать на Ebay, стоит он в среднем 2.5$ за штуку; остальные детали продаются в любом радиомагазине. На стороне Ямахи стоит 18-битный D/A NEC D63200, который в 90-е годы широко использовался во многих звуковых картах, модулях и приставках, поэтому TC9231 не совсем подходит (мы теряем 2 бита и получаем хрипы на входе).

После долгих экспериментов с DIT 4192, TC9231N и другими, я наконец нашел трансивер, работающий с 18-битным потоком - AKM 4103AVF. Схема заработала сразу же. В разных моделях Yamaha используются разные версии тон-генератора AWM2, поэтому смотрите сервисную документацию синтезатора, чтобы найти master clock (SYSCLK). Благодаря внутренним pull-up и pull-down резисторам, можно обойтись минимумом деталей.

Прилагаемая схема точно работает на Yamaha AN200 с кварцем 16.9344 MHz (384fs*44100), на Yamaha MU128 насколько я помню кристалл другой, соответственно может понадобится другая настройка CKS1-CKS0 пинов, скорее всего на 256fs. Upd: Подтверждено, для MU128 требуется 256fs, по даташиту это эта конфигурация резисторов "по умолчанию", т.е. пины 15 и 16 можно оставить открытыми.

Выход обвязан по даташиту как бытовой (consumer) S/PDIF. Если нужен XLR AES3 (AES/EBU), смотрите даташит AK4103, а также там нужны другая конфигурация на FS0-FS3 пинах.

Update2: Замечено, что если схема включается одновременно с модулем, AK4103 не подхватывает частоту и выход "молчит". Решения для этого ровно два: либо выводить на корпус кнопку "spdif reset" (на схеме показана), либо в схему питания включать задержку подачи питания, например, на таймере NE555. Опытным путем замечено, что частота ловится после инициализации модуля, время задержки питания нужно вычислять в зависимости от количества PLG-карт в MU128, а в AN200 инит очень долгий в принципе.

Схема:

Типичная схема DAC у Yamaha:

Tags: Yamaha

  • Adding Famiclone DB15 joystick support to original Famicom

    15 ноября 2015, 16:07

    Recently i've received original Japan NTSC Famicom board. The case was so dirty so i used a new famiclone case from Simba. Lucky it still clones everything original, but there was additional DB15M because the clone have pluggable external controllers. So i did the connector from motherboard which fits the new case. The pic scheme included.

  • When your PLG150-AN is not working with your AN200 host

    22 сентября 2014, 23:08

    This is true. Not all PLG150-AN cards will work in AN200 host unit. I just have two AN cards, let's say, "old" and "new". Old is equipped with 8Mbit XW715A0 flash ROM (IC2), copyrighted (c) 1999. This card will not work in AN200.

    The "new" card don't have IC2, but have IC3 Mask ROM which is copyrighted by (c) 2001 and marked as XZ970A0. This version will work with AN200. The boards visually have only one different mark B on "old" and C on "new", i think it's board revision. AN200 was produced in 2001 and may be there was update of ROM firmware which makes B revision unable to work with host.

    As for other PLG-series, i found that PLG150-DX exists in A revision, and older PLG100-DX in A and B revision. PLG150-VL exists in A and B revisions. Since i have seen photo of PLG150-DX A in DX200 unit, i assume that there is no such problem with DX200.

    Photo provided. Also you can see big photos of "old" and "new" cards here.

    Tags: Yamaha , synthesis

  • Converting your 110v Roland SC-88 Pro into 220v European version :)

    28 января 2014, 11:41

    Hey, you just need to resolder one black wire on your power transformer from 100v to 230v pin. Photo included.

    Tags: Roland

  • Yamaha PLG sample cards

    24 января 2014, 13:41

    Tags: synthesis

  • Building MB6582 8xSID synthesizer part 1 (base board)

    23 октября 2013, 15:31

    After first experience with building Midibox SID v3 i started to search if i can find ways to build 8x more powerful SID synth based on same PIC Core board. Luck! I found Midibox shop where i bought MB-6582 board set (Base and CS PCBs). Here some instagrams and fotos i made during the building.

    Tags: mb6582 , midibox , synthesis

  • Building Midibox SID v3

    19 июня 2013, 07:46

    Midibox SID is a custom DIY synthesizer based on famous C64 MOS SID chip (6581 or 8580), the first computer chip with envelope generator. All thanks goes to Thorsten Klose, owner and developer of this project.

    I wanted to build SammichSID version but unfortunately, the project was closed. So i decided to build modular version which consists of Core board based on Microchip PIC18F microcontroller, SID board (6581 or 8580 - the difference only in chip power supply 12v or 9v), and DINX/DOUTX serial shift register boards which controls LED's and input buttons/encoders. Of course LED display is supported. All boards were soldered in a week. The hardest part was to design and construct Control Panel with all this LEDs and buttons. Also there is a lack of encoders in my city radio shops, so i ordered all i need from an online shop.

    Remember that the project is non-commercial and don't allow you to sell your Midibox for profit. You can only sell your little box for the cost of all parts you have bought. If you agree with these terms, go www.ucapps.de and learn what you have to do to start your own Midibox project.

    I have instagrammed some stages of building my own box, here they are:













    Tags: midibox , synthesis

  • Реальный IP в логах бэка Apache 1.3.x за фронтом Nginx

    12 октября 2011, 13:54

    Проблема известна и давно решена. Просто для себя.

    С версией 2.0 mod_realip-2.0 все стало намного проще.

    nginx.conf
    :
    http {
    proxy_set_header Host  $host;
    proxy_set_header   X-Real-IP  $remote_addr;

    }

    httpd.conf
    :
    <IfModule mod_realip.c>
        RealIP on
    </IfModule>

    Tags: apache , nginx

    [a-zA-Z0-9]+ wordlist

    22 апреля 2011, 14:31

    Сборка из 30 различных wordlists, отсортированная в базе данных и отфильтрованная на уникальность.

    Tags: hackchallenges

    Perl routines

    10 марта 2011, 22:16

    Краткий листинг часто используемых функций для hackchallenges - включая работу с ASCII последовательностью длинных строковых бинарных. Будет пополняться.

    #!/usr/bin/perl

    sub bin2dec {return unpack("N", pack("B32", substr("0" x 32 . shift, -32)));}
    sub bin2hex {return sprintf("0x%x", bin2dec(shift));}
    sub dec2hex {return sprintf("%x", shift);}
    sub dec2bin {return unpack("B32", pack("N", shift));}
    sub dec2bin16 {return substr(dec2bin(shift),24,8);}
    sub hex2dec($) {return hex $_[0];}

    sub XOR {my ($s1,$s2)=@_; $l=length($s1); my @s1=split//,$s1; my @s2=split//,$s2; $cnt=0; my $res=""; foreach my $t(@s1) {if ($t eq "0" and $s2[$cnt] eq "0") {$r="0";} elsif ($t eq "1" and $s2[$cnt] eq "1") {$r="0";} else {$r="1";} $res.=$r; $cnt++;} return $res;}

    sub AND {my ($s1,$s2)=@_; $l=length($s1); my @s1=split//,$s1; my @s2=split//,$s2; $cnt=0; my $res=""; foreach my $t(@s1) {if ($t eq "1" and $s2[$cnt] eq "1") {$r="1";} else {$r="0";} $res.=$r; $cnt++;} return $res;}

    sub  OR {my ($s1,$s2)=@_; $l=length($s1); my @s1=split//,$s1; my @s2=split//,$s2; $cnt=0; my $res=""; foreach my $t(@s1) {if ($t eq "0" and $s2[$cnt] eq "0") {$r="0";} else {$r="1";} $res.=$r; $cnt++;} return $res;}

    sub NOT {my ($s1,$s2)=@_; $l=length($s1); my @s1=split//,$s1; my @s2=split//,$s2; $cnt=0; my $res=""; foreach my $t(@s1) {if ($t eq "0" and $s2[$cnt] eq "0") {$r="0";} elsif ($t eq "1" or  $s2[$cnt] eq "1") {$r="1";} $res.=$r; $cnt++;}return $res;}

    sub INV {my ($s1)=@_; $l=length($s1); my @s1=split//,$s1; $cnt=0; my $res=""; foreach my $t(@s1) {if ($t eq "0") {$r="1";} else {$r="0";} $res.=$r; $cnt++;}return $res;}

    sub REV {my ($s1)=@_; $l=length($s1); my @s1=split//,$s1; $cnt=0; my $res=""; foreach my $t(reverse @s1) {$res.=$t;} return $res;}

    sub REV2 {return reverse(shift);} # :))

    #-------------------------
    $file=$ARGV[0] || "_out.0"; $l=-s $file;
    open (F,"<$file"); binmode(F); $bin='';  seek(F,0,1); read(F, $bin, $l); close (F);
    #-------------------------
    use Math::BigInt;
    $x = Math::BigInt->new(0);
    $x->badd($y)
    #-------------------------



    Tags: hackchallenges , perl

    Прозрачное проксирование локального FTP-сервера

    13 июля 2010, 08:42

    Дано: роутер FreeBSD с NAT и внешними ip, nginx проксирует некий веб-ресурс на локальный веб-сервер. Задача - организовать FTP доступ к локальному веб-серверу извне.

    Задача усложняется тем, что на роутере тоже есть свои FTP ресурсы, но наличие дополнительного внешнего ip решает проблему.

    Итак: xx.xx.xx.xx - внешний ip, yy.yy.yy.yy - локальный сервер, ftpuser - аккаунт, который нужно проксировать, abcde.ru - домен веб-ресурса.

    Решение: jftpgw. Конфиг:

    <global>
    serverport 21
    defaultmode passive
    debuglevel 6
    dropprivileges startsetup
    runasuser nobody
    runasgroup nogroup
    loginstyle 0
    logintime user
    transparent-proxy on
    welcomeline Alert will come in need
    allowreservedports no
    allowforeignaddress yes
    passiveportrange 44000:44999
    </global>
    <servertype standalone>
    listen xx.xx.xx.xx:21
    logstyle files
    logfile /var/log/jftpgw.log
    pidfile /var/run/jftpgw.pid
    </servertype>

    <servertype inetd>
    logstyle syslog
    </servertype>
    <from 0.0.0.0/0>
    access allow
    <user ftpuser>
    <to abcde.ru>
    forward yy.yy.yy.yy:21
    </to>
    </user>

    </from>
    <from yy.yy.yy.0/24>
    access allow
    </from>


    P.S. NAT на этом внешнем ip не дивертит. На всякий случай.

    Tags: ftp , jftpgw

    Исчезновение WinXP хостов из сетевого окружения, рабочая группа Samba

    22 октября 2009, 16:14

    Проблема: периодически из сетевого окружения исчезают машины на WinXP. Выставление OS level > 65 не помогает.

    Решение: прописываем в крон перевыборы каждые полчаса. Samba будет выигрывать. OS level конечно же лучше выставить побольше, и не забыть wins support = yes

    */30 * * * * /usr/local/samba/bin/smbcontrol nmbd force-election > /dev/null

    Tags: samba

    Организация облака тегов и вывод одним запросом

    19 мая 2009, 20:17

    Для начала заведем таблицу с именами и id самих тегов:

    Table news_tags

    1. id serial
    2. tag character varying(128)

    А затем и табличку со связями тегов и записей (блога, новостной ленты, всего-что-угодно)

    Table news_taglink

    1. news_id integer
    2. tag_id integer

    Ну и будем считать, что у нас уже есть:

    1. новостная таблица news, где мы храним сами записи (нужное нам поле - id)
    2. таблица рубрик(разделов) chapter (нужное нам поле - id)
    3. таблица связей записей и рубрик news_link, которая организована точно также, как news_taglink, только с полями news_id  и chapter_id
    В таблицах news_link и news_taglink поля не уникальны, чтобы поддержать множественность связей записи и тегов, но в табличке news_tags для удобства поле id мы сделаем автоинкрементным, чтобы брать значение id из currval sequence для вставки новых тегов.

    Запрос, вызывающий все теги и подсчет их использования заданного в переменной $cid раздела:

    SELECT DISTINCT tag,count(tag_id),id,chapter_id FROM news_tags INNER JOIN news_taglink ON (id=tag_id) INNER JOIN news_link ON (news_taglink.news_id=news_link.news_id) WHERE  chapter_id=$cid GROUP BY tag,id,chapter_id;

    Не уверен, что запрос сработает в mysql, но в postgres все работает очень хорошо.

    Если не нужно ограничение вывода тегов конкретным разделом, можно воспользоваться упрощенным запросом:

    SELECT tag,count(tag_id),id FROM news_tags INNER JOIN news_taglink ON (id=tag_id) GROUP BY tag,id; 

    Как поддерживать теги в актуальном состоянии?

    Допустим, при редактировании мы получаем теги в строке, разделенной запятыми:

    $id=827; #это номер редактируемой записи
    $tags="postgresql,perl";

    #образуем из строки массив:
    @tags=split/,/,$tags;

    #удаляем старые теги для редактируемой записи:
    $result=$db->do("DELETE FROM news_taglink WHERE news_id='$id';");

    #и обрабатываем новый список тегов: foreach $tag(@tags) {

    #для начала проверяем теги на присутствие
    $result=$db->prepare("SELECT id AS tag_id FROM news_tags WHERE tag='$tag';"); $result->execute();

    #если такой тег уже есть, берем его id
    if ($row=$result->fetchrow_hashref()) {$tag_id=$row->{"tag_id"};}

    #а если нет - вставляем его в таблицу и берем текущее значение id
    else {
    $result=$db->do("INSERT INTO news_tags (tag) VALUES ('$tag');");
    $tag_id="currval('news_tags_id_seq')";
    }

    #в итоге заводим новые связи тегов и записей.
    $result=$db->do("INSERT INTO news_taglink (news_id,tag_id) VALUES ('$id',$tag_id);");

    }

    Еще один вариант хранения тегов можно использовать только в PostgreSQL.

    Используя встроенные с версии 8.3 возможности полнотекстового поиска, можно завести поле tags ключевых слов (тип tsvector) и вставлять теги туда. Поиск по тегам в таком случае сведется к запросу вида

    select to_tsquery('тег') @@ tags 

    Tags: perl , postgresql

    Быстро и без модулей читаем ID3v1 теги из mp3

    29 апреля 2009, 22:55

    Согласно спецификации, на ID3v1 отведено всего 128 байт в конце файла, так что можно легко определить наличие тегов в mp3 файле:

    open(TEMP,"$file.mp3"); binmode(TEMP); $bin=''; seek(TEMP,-128,2); read(TEMP, $bin,128); close(TEMP);
    if ($bin=~ /^TAG/i) {
    ($title,$artist,$album,$year,$comments)=$bin=~/^TAG(.{30})(.{30})(.{30})(.{4})(.{28})/;
    print "$title,$artist,$album,$year,$comments";
    }

    Особо внимательные заметили, что мы прочитали 128 байт, а использовали 125.  В конце осталось 3 байта - это один байт hex 00 , один байт с номером трека (тоже hex), и байт-указатель стиля. Но это уже не так важно, кому надо - допишет сам :) А еще неиспользуемая длина добивается нулями hex 00, т.е. если что - можно еще регуляркой пройтись и вырезать.

    PS. На всякий случай:

    SignLength
    (bytes)
    Position
    (bytes)
    Description
    A3(0-2)Tag identification. Must contain 'TAG' if tag exists and is correct.
    B30(3-32)Title
    C30(33-62)Artist
    D30(63-92)Album
    E4(93-96)Year
    F30(97-126)Comment
    G1(127)Genre

    В структуре ID3v1.1 есть маленький нюанс.  Последний байт поля Comment может быть использован как номер трека в альбоме. Если номер неизвестен, то должен содержать hex 00.

    Tags: perl

    ./configure mysql 4.1.xx

    28 апреля 2009, 12:24

    типовая строчка с локалью cp1251

    ./configure --prefix=/usr/local/mysql --enable-thread-safe-client --enable-assembler --enable-local-infile --with-charset=cp1251 --with-extra-charsets=complex --with-collation=cp1251_general_ci --with-pthread

    Tags: mysql