MP3 Sheld на VS1053 2 шелда на одну UNO

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

dim3740 пишет:

Можете дать ссылку об этом? Нужна ли доработка моего "красного шелда", где НЕТ МИДИ входа? Или это как раз и решает проблему чисто софтово? 

Ссылку наверняка можно получить по запросу типа "Arduino vs1053b realtime midi". 

Мне даже кажется, что коды плагина приведены и в какой-то документации от производителя vs1053, но наверняка можно найти и среди любительских проектов.

Лично я пользуюсь этим фрагментом:

   //Write to VS10xx register
   //SCI: Data transfers are always 16bit. When a new SCI operation comes in DREQ goes low. We then have to wait for DREQ to go high again.
   //XCS should be low for the full duration of operation.
void VSWriteRegister(unsigned char addressbyte, unsigned char highbyte, unsigned char lowbyte){
  while(!pinRead(VS_DREQ)) ; //Wait for DREQ to go high indicating IC is available
  SPI.beginTransaction (VS1053B_START);
  pinOutLow(VS_XCS); //Select control

  //SCI consists of instruction byte, address byte, and 16-bit data word.
  SPI.transfer(0x02); //Write instruction
  SPI.transfer(addressbyte);
  SPI.transfer(highbyte);
  SPI.transfer(lowbyte);
  while(!pinRead(VS_DREQ)) ; //Wait for DREQ to go high indicating command is complete
  pinOutHigh(VS_XCS); //Deselect Control
  SPI.endTransaction   ();
}

   // Plugin to put VS10XX into realtime MIDI mode
   // Originally from http://www.vlsi.fi/fileadmin/software/VS10XX/vs1053b-rtmidistart.zip
   // Permission to reproduce here granted by VLSI solution.
const PROGMEM unsigned short sVS1053b_Realtime_MIDI_Plugin[] = { /* [28] Compressed plugin */
  0x0007, 0x0001, 0x8050, 0x0006, 0x0014, 0x0030, 0x0715, 0xb080, /*    0 */
  0x3400, 0x0007, 0x9255, 0x3d00, 0x0024, 0x0030, 0x0295, 0x6890, /*    8 */
  0x3400, 0x0030, 0x0495, 0x3d00, 0x0024, 0x2908, 0x4d40, 0x0030, /*   10 */
  0x0200, 0x000a, 0x0001, 0x0050, 0x0003, 0x0001, 0xd800      // добавлена команда увел.частоты: d800->r3 (x4.5+1.5)
};              // 0x9800: x3.5+1.5,   0xa00: x4.0+0.0,   0xb800: x4.0+1.5,   0xc00: x4.5+0.0,   0xe00: x5.0+0.0

void VSLoadUserCode(void) {
  int i = 0;

  while (i<sizeof(sVS1053b_Realtime_MIDI_Plugin)/sizeof(sVS1053b_Realtime_MIDI_Plugin[0])) {
    unsigned short addr, n, val; // pgm_read_word_near(&glideStepArray[glide])
    addr = pgm_read_word_near(&sVS1053b_Realtime_MIDI_Plugin[i++]);
    n = pgm_read_word_near(&sVS1053b_Realtime_MIDI_Plugin[i++]);
    while (n--) {
      val = pgm_read_word_near(&sVS1053b_Realtime_MIDI_Plugin[i++]);
      VSWriteRegister(addr, val >> 8, val & 0xFF);
    }
  }
}

Кстати, в исходнике приведена и ссылка на то, что я брал за основу. 

Я, правда, чуть дополнил плагин - увеличил тактовую частоту процессора, т.к. он, вообще-то, в основном предназначался для MP3 и подобного. А СТЕРЕО - это, грубо говоря, полифония в 2 голоса. А когда нужно обеспечить, скажем, 64 голоса, то производительности при обычных 12 МГц уже явно не хватает. Пропускает ноты. Поэтому пришлось в несколько раз приподнять частоту.

Да, MIDI-вход на шилд не выведен. Если бы был выведен, то, насколько я понял документацию, можно было бы обойтись без плагина. А так - только через SPI. Но, отчасти, это и лучше - скорость SPI существенно выше. Вот только вместо одного байта всегда нужно передавать два (DSP 16-разрядный и что такое один байт он просто не знает).

Собственно, сама команда посылается так:

   //Sends a MIDI command/data. Doesn't check to see that cmd is greater than 127, or that data values are less than 127
void talkMIDI(byte cmd, byte data1, byte data2) {

  while (!pinRead(VS_DREQ));  // Wait for chip to be ready (Unlikely to be an issue with real time MIDI)
  SPI.beginTransaction (VS1053B_HiFreq);
  pinOutLow(VS_XDCS);
  SPI.transfer(0);
  SPI.transfer(cmd);
//  sendMIDI(cmd);
  //Some commands only have one data byte. All cmds less than 0xBn have 2 data bytes 
  //(sort of: http://253.ccarh.org/handout/midiprotocol/)
  if( (cmd & 0xF0) <= 0xB0 || (cmd & 0xF0) >= 0xE0) {
    SPI.transfer(0);
    SPI.transfer(data1);
    SPI.transfer(0);
    SPI.transfer(data2);
  } else {
    SPI.transfer(0);
    SPI.transfer(data1);
  }
  pinOutHigh(VS_XDCS);
  SPI.endTransaction ();
}

 

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

dim3740 пишет:

Я понял. Перечитал вчера и весь пост... Вы смотрите вперед более чем я....  Ок. МИДИ ведь вы же запустили от клавы? Гугл выдает ссылки на realTime MIDI путем софта, но везде требуется GPIO. У Вас точно была такая же плата как у меня? GPIO портов нет и МИДИ входа нет? Если другая, - я не стану даже "копать"  вопрос, просто куплю на ЕБЕЕ другую. Но ... 

К сожалению во всех трех местах, где я заказывал, товар уже закончился, поэтому точных ссылок на продавца дать не могу. Но выглядит так:

и так:

MIDI порта нет, передавал через SPI.

dim3740
dim3740 аватар
Offline
Зарегистрирован: 25.03.2015

Я Вам очень признателен:)) . Меня смутило отсутствие GPIO в красной плате, а в синей он вроде есть. Разберусь))) У меня успехи, не сглазить бы...  2 шелда + 2 ардуино. На обоих СД по одному MP3, аудио и клик, записанным синхронно. И также синхронно все играет! Задержка не потребовалась (пока)...  Файлы меняю, пишу новые - задержка одна и та же. Буду пробовать на разных СД, и разное количество файлов.... посмотрим время на чтение/поиск секторов... А с МИДИ - проблемы.... Шелд воспроизводит МИДИ совершенно с иным темпом, относительно исходного. 

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

dim3740 пишет:

А с МИДИ - проблемы.... Шелд воспроизводит МИДИ совершенно с иным темпом, относительно исходного. 

Ту я подсказать не могу - даже не пытался проигрывать MIDI-файлы при помощи шилда. Только MP3 файлы - для проверки, а в остальных случаях - исключительно realtime MIDI. То есть даже если мне нужно было проиграть что-то записанное, за темпом следила Ардуина, а не шилд.

dim3740
dim3740 аватар
Offline
Зарегистрирован: 25.03.2015

 

Пытаюсь подключить VS1053 Shield к такому дифусилителю. Входы "в воздухе" отлично усиливаются, т.е. тракты работают. Земля и питания LM358,  Арудиино и Шелда общие. (Про петли и помехи не говорим).  На гнезде шелда при прослушивании на наушник 30 ом тоже все нормально. Теперь каждый выход гнезда 3,5 мм подсоединяю к соответ. входам ... к 10 коМ где. Общий провод гнезда НЕ трогаю. Никакого звука через LM не наблюдаю((((  

М.б. я схему зря "урезал" при сборке? Ссылку потерял((( И там наверху что-то важное было? Стабил справа вверху явно не обязателен. Искусственных земель нет. 

А так проект (1 стадия) почти закончена. LСD индикатор, энкодер, выбор трека по префиксу, синхронизация 2-х шелдов... все отлично! 

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

А почему Вы решили, что это дифусилитель?

Я бы неинвертирующие входы посадил на общий vs1053 (тот, что нельзя соединять с землей).

Тем более, что делитель пополам напряжения питания для 358 - не оптимальный вариант: это специфический несимметричный усилитель, у которого допустимые напряжения входа и выхода с одной стороны почти вплотную подходят к минусу питания (в пределах десятков мВ), а с другой - на 1.5 В отстоят от  плюса питания. Так что там оптимально устанавливать не 2.5, а где-то 1.7-1.8 В.

Ну а вообще - надо смотреть осциллографом, что происходит на входе и на выходе.

И разделительный конденсатор в 100 нФ для такой схемы маловато, нужно - на порядок больше.

dim3740
dim3740 аватар
Offline
Зарегистрирован: 25.03.2015

andriano пишет:

Единственная замеченная неприятность, что сигнал нельзя снимать между звуковыми выходами и землей. Вместо земли допустимо использовать исключительно специальный общий контакт, который и выведен на гнездо. Соединять этот контакт общий с землей недопустимо.

Схему полную нашел. Конечно - она не панацея... Боюсь, что кучу времени уйдет на запуск еще и унч...   И ничего не понял про 1,7...2,5 в(((

Итак, задача "подключить балансный выход к небалансному входу". Это так гуглить? Или это некое "мостовое включение"? Осциллографом смотрю сигнал на выходе шелда: и относительно "третьей точки" гнезда и относительно общего (земли) шелда  - сигнал присутствует (шум пока не важен). Вывод: "Можно просто брать сигнал как обычно". Но - не работает.. Далее: вход "в воздухе" прослушивается вроде как 50 гц, но если второй рукой взять общий LM358 сигнал пропадет... через 2 сек. Т.е. якобы это самовозбуждение, а не наводка, и уповать что схема "усиливает" не стоит. Что еще предпринять? 

Через 5 часов... Пробовал и с отдельным питанием и разные включения и земли ...  В итоге: Вы уверены, что стерео аудио выход надо обязательно брать с 3,5 гнезда, где есть "третья точка"?

У меня тот же звук, если беру относительно общего самомо шелда. Что, видимо, и хотел сказать автор той схемы. Если Вы, andriano, понимаете, ( я не очень), то мб. вообще не нужен никакой доп.каскад, а просто вывести новый джек на корпус, но землю взять общую? (Вопрос отсутствия буфера для длинного провода, кз, наводок и прочего пока не рассматриваем). 

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

dim3740 пишет:

 

И ничего не понял про 1,7...2,5 в(((

Видимо, я плохо объясняю. Почитайте дэйташит на LM358. Надеюсь, там написано вразумительнее.

Цитата:

Осциллографом смотрю сигнал на выходе шелда: и относительно "третьей точки" гнезда и относительно общего (земли) шелда  - сигнал присутствует (шум пока не важен). Вывод: "Можно просто брать сигнал как обычно". Но - не работает..

Странно это.

Мне всегда казалось, что при наличии осциллографа всегдла можно найти проблему: вот здесь сигнал еще есть, а здесь - его уже нет. Значит, проблема между этими двумя точками.

Цитата:

Через 5 часов... Пробовал и с отдельным питанием и разные включения и земли ...  В итоге: Вы уверены, что стерео аудио выход надо обязательно брать с 3,5 гнезда, где есть "третья точка"?

Я уверен, что так работает. А также уверен в том, что потенциалы земли и общего контакта выхода отличаются. Но, вполне вероятно, что можно снимать сигнал и относительно земли, если использовать разделительные конденсаторы.

Цитата:

мб. вообще не нужен никакой доп.каскад, а просто вывести новый джек на корпус, но землю взять общую?

Попробуйте, но не забудьте про разделительные конденсаторы.

dim3740
dim3740 аватар
Offline
Зарегистрирован: 25.03.2015

Без Вашей помощи я бы его не сделал, или делал еще дольше)))) МИДИ часть будет в виде пикового детектора, обработке аудио кликов по прерыванию (потянет ли проц? Там непростые алгоритмы, скажем измерения периода по эталонному таймеру. А процу еще и аудио выводить:((,)  вывода МИДИ ссобщений на разъем DIN5. Он так же может работать как вход для задач синтезатора (перспектива).