roboforum.ru

Технический форум по робототехнике.

Музыкальное MIDI устройство Monome = цифровой синт

Re: Музыкальное MIDI устройство Monome = цифровой синт

mtbiker » 11 мар 2010, 20:05

микросхемы синтезаторов говоришь?

Сейчас появились дешевые полифонические синтезаторы HOLTEK. Стоят от 40 центов (бескорпусные) до 2,5$ - корпусные навороченные (стерео, и т д). Обычные в дипе16 - 70 центов. Шести или шестнадцатиголосые, 16...48 инструментов (в том числе ударные) 16бит 48кГц ЦАП(ы) внутри.
Бывают двух видов:
HT38A2 (HT38A5) - с зашитыми 12ю мелодиями. От контроллера только приходят команды: играть X мелодию, остановить, громкость Y. Можно и без контроллера, привесить кнопку.
HT38A1 (HT38A3) - синтезатор, которому с микроконтроллера льются ноты (протокол - упрощённый MIDI). То есть - сами мелодии лежат в ОЗУ/ПЗУ/флеши микроконтроллера или отдельно, и контроллер периодически проверяет занятость синтезатора и пхает ему новую ноту / пачку нот. Документацию и конвертор мелодий (из MIDI) поставщик микросхем даёт (не помню, российская фирма какая-то), но он убогий. Свой писать - месяцев 5 ушло, но сделан мощный редактор.
Дешевый вариант (dip16, без кварца, моно) звучит так: http://www.gals.com.ua/files/all.mp3.


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

Re: Музыкальное MIDI устройство Monome = цифровой синт

Duhas » 12 мар 2010, 08:43

по идее лучше держать в памяти МК то что нужно выводить.. а с МК отдавать все это на нормальный ЦАП для звука предназначенный...

Re: Музыкальное MIDI устройство Monome = цифровой синт

vadinator » 12 мар 2010, 12:38

http://ru.wikipedia.org/wiki/%D0%9C%D0% ... 0%BE%D0%B2
я бы обратил внимание, на Ямаховские мелкосхемы с частотной модуляцией, на них делались популярные синтезаторы этой фирмы серии DX... на вроде таких:
http://ru.wikipedia.org/wiki/Yamaha_YM3812
http://ru.wikipedia.org/wiki/Yamaha_YM3526
http://ru.wikipedia.org/wiki/Yamaha_YMF262
http://ru.wikipedia.org/wiki/Yamaha_YM2413
ну и далее по списку, вероятно многие уже не выпускаются производителем... но китайцы делают наверняка.

Re: Музыкальное MIDI устройство Monome = цифровой синт

mtbiker » 13 мар 2010, 10:33

Duhas не совсем ясно, какие данные держать в памяти, не разъясните ?

vadinator спасибо за ссылки, щас будем изучать )

Кстати знает ли кто-нибудь новые микрухи которые выпускаются сейчас? конечно можно найти старую ямаху, но я думаю есть смысл поискать более современные ) хочется быть в курсе новинок =)
Последний раз редактировалось mtbiker 13 мар 2010, 12:12, всего редактировалось 1 раз.

Re: Музыкальное MIDI устройство Monome = цифровой синт

Duhas » 13 мар 2010, 11:49

ну тебе же синус нужно на выходе ? ) таблицу значений держать в памяти.. и выгружать в ЦАП...


вопрос в том что тебе нужно.. какие звуки. синус с переменной частотой или модулированный синус... чем модулирвоанный... хотя те ИМС для синтов вполне вариант наверное...

Re: Музыкальное MIDI устройство Monome = цифровой синт

mtbiker » 13 мар 2010, 12:19

Duhas не только синус, нет это конечно вариант, если не ошибаюсь у Белова в книге про авр, такой метод )
просто хочется в реальном времени менять эти параметры...
а этот вариант получится как дешёвая "самоиграйка" типо только предустановленные звуки...
но всё равно на первых порах и это не плохо )

щас вот ардуино жду, как приедет буду делать,вот это
http://www.youtube.com/watch?v=IwV-SKpQAak
http://www.youtube.com/watch?v=q9tmbrG7D-o&feature=fvst ))

Re: Музыкальное MIDI устройство Monome = цифровой синт

vadinator » 13 мар 2010, 13:06

Ну управлять частотой сэмпла, относительно не сложно...надо в подпрограмму обработки прерывания, добавить сумматор с большим количеством разрядов (24-32 бит) и выводить на ЦАП - данные из таблицы используя старшие (7-8 бит) в качестве адреса... реализовать управление громкостью, можно либо побитным сдвигом данных (в сторону младших разрядов), перед выводом в цап...или использовать, разные волновые формы (в сложных звуках, форма волны зависит от амплитуды)

Re: Музыкальное MIDI устройство Monome = цифровой синт

mtbiker » 14 мар 2010, 12:26

собран синт
Вложения
IMG_1824.JPG

Re: Музыкальное MIDI устройство Monome = цифровой синт

vadinator » 14 мар 2010, 14:12

Звучит?

цифровой синт на AVR, поддержка MIDI

mtbiker » 14 мар 2010, 16:30

дааа ) причем довольно не плохо )
Хочу клавиатуру подключить к нему...
Кто может подсказать как подрубить к нему моном (то что в первом посте) или как припаять миди i/o (это вроде на аурдуино.сс где-то было)
Код: Выделить всёРазвернуть
#define PWM_PIN       3
#define PWM_VALUE     OCR2B
#define LED_PIN       13
#define LED_PORT      PORTB
#define LED_BIT       5
#define PWM_INTERRUPT TIMER2_OVF_vect
#endif

// Smooth logarithmic mapping
//
uint16_t antilogTable[] = {
  64830,64132,63441,62757,62081,61413,60751,60097,59449,58809,58176,57549,56929,56316,55709,55109,
  54515,53928,53347,52773,52204,51642,51085,50535,49991,49452,48920,48393,47871,47356,46846,46341,
  45842,45348,44859,44376,43898,43425,42958,42495,42037,41584,41136,40693,40255,39821,39392,38968,
  38548,38133,37722,37316,36914,36516,36123,35734,35349,34968,34591,34219,33850,33486,33125,32768
};
uint16_t mapPhaseInc(uint16_t input) {
  return (antilogTable[input & 0x3f]) >> (input >> 6);
}

// Stepped chromatic mapping
//
uint16_t midiTable[] = {
  17,18,19,20,22,23,24,26,27,29,31,32,34,36,38,41,43,46,48,51,54,58,61,65,69,73,
  77,82,86,92,97,103,109,115,122,129,137,145,154,163,173,183,194,206,218,231,
  244,259,274,291,308,326,346,366,388,411,435,461,489,518,549,581,616,652,691,
  732,776,822,871,923,978,1036,1097,1163,1232,1305,1383,1465,1552,1644,1742,
  1845,1955,2071,2195,2325,2463,2610,2765,2930,3104,3288,3484,3691,3910,4143,
  4389,4650,4927,5220,5530,5859,6207,6577,6968,7382,7821,8286,8779,9301,9854,
  10440,11060,11718,12415,13153,13935,14764,15642,16572,17557,18601,19708,20879,
  22121,23436,24830,26306
};
uint16_t mapMidi(uint16_t input) {
  return (midiTable[(1023-input) >> 3]);
}

// Stepped Pentatonic mapping
//
uint16_t pentatonicTable[54] = {
  0,19,22,26,29,32,38,43,51,58,65,77,86,103,115,129,154,173,206,231,259,308,346,
  411,461,518,616,691,822,923,1036,1232,1383,1644,1845,2071,2463,2765,3288,
  3691,4143,4927,5530,6577,7382,8286,9854,11060,13153,14764,16572,19708,22121,26306
};

uint16_t mapPentatonic(uint16_t input) {
  uint8_t value = (1023-input) / (1024/53);
  return (pentatonicTable[value]);
}


void audioOn() {
#if defined(__AVR_ATmega8__)
  // ATmega8 has different registers
  TCCR2 = _BV(WGM20) | _BV(COM21) | _BV(CS20);
  TIMSK = _BV(TOIE2);
#elif defined(__AVR_ATmega1280__)
  TCCR3A = _BV(COM3C1) | _BV(WGM30);
  TCCR3B = _BV(CS30);
  TIMSK3 = _BV(TOIE3);
#else
  // Set up PWM to 31.25kHz, phase accurate
  TCCR2A = _BV(COM2B1) | _BV(WGM20);
  TCCR2B = _BV(CS20);
  TIMSK2 = _BV(TOIE2);
#endif
}


void setup() {
  pinMode(PWM_PIN,OUTPUT);
  audioOn();
  pinMode(LED_PIN,OUTPUT);
}

void loop() {
  // The loop is pretty simple - it just updates the parameters for the oscillators.
  //
  // Avoid using any functions that make extensive use of interrupts, or turn interrupts off.
  // They will cause clicks and poops in the audio.
 
  // Smooth frequency mapping
  //syncPhaseInc = mapPhaseInc(analogRead(SYNC_CONTROL)) / 4;
 
  // Stepped mapping to MIDI notes: C, Db, D, Eb, E, F...
  //syncPhaseInc = mapMidi(analogRead(SYNC_CONTROL));
 
  // Stepped pentatonic mapping: D, E, G, A, B
  syncPhaseInc = mapPentatonic(analogRead(SYNC_CONTROL));

  grainPhaseInc  = mapPhaseInc(analogRead(GRAIN_FREQ_CONTROL)) / 2;
  grainDecay     = analogRead(GRAIN_DECAY_CONTROL) / 8;
  grain2PhaseInc = mapPhaseInc(analogRead(GRAIN2_FREQ_CONTROL)) / 2;
  grain2Decay    = analogRead(GRAIN2_DECAY_CONTROL) / 4;
}

SIGNAL(PWM_INTERRUPT)
{
  uint8_t value;
  uint16_t output;

  syncPhaseAcc += syncPhaseInc;
  if (syncPhaseAcc < syncPhaseInc) {
    // Time to start the next grain
    grainPhaseAcc = 0;
    grainAmp = 0x7fff;
    grain2PhaseAcc = 0;
    grain2Amp = 0x7fff;
    LED_PORT ^= 1 << LED_BIT; // Faster than using digitalWrite
  }
 
  // Increment the phase of the grain oscillators
  grainPhaseAcc += grainPhaseInc;
  grain2PhaseAcc += grain2PhaseInc;

  // Convert phase into a triangle wave
  value = (grainPhaseAcc >> 7) & 0xff;
  if (grainPhaseAcc & 0x8000) value = ~value;
  // Multiply by current grain amplitude to get sample
  output = value * (grainAmp >> 8);

  // Repeat for second grain
  value = (grain2PhaseAcc >> 7) & 0xff;
  if (grain2PhaseAcc & 0x8000) value = ~value;
  output += value * (grain2Amp >> 8);

  // Make the grain amplitudes decay by a factor every sample (exponential decay)
  grainAmp -= (grainAmp >> 8) * grainDecay;
  grain2Amp -= (grain2Amp >> 8) * grain2Decay;

  // Scale output to the available range, clipping if necessary
  output >>= 9;
  if (output > 255) output = 255;

  // Output to PWM (this is faster than using analogWrite) 
  PWM_VALUE = output;
}
Вложения
app_enclosure.jpg
Последний раз редактировалось mtbiker 14 мар 2010, 17:11, всего редактировалось 2 раз(а).

Re: Музыкальное MIDI устройство Monome = цифровой синт

vadinator » 14 мар 2010, 22:21

Вероятно, надо заменить считывание данных с АЦП - считыванием данных с последовательного порта
Код: Выделить всёРазвернуть
  // Smooth frequency mapping
  //syncPhaseInc = mapPhaseInc(analogRead(SYNC_CONTROL)) / 4;
 
  // Stepped mapping to MIDI notes: C, Db, D, Eb, E, F...
  //syncPhaseInc = mapMidi(analogRead(SYNC_CONTROL));
 
  // Stepped pentatonic mapping: D, E, G, A, B
  syncPhaseInc = mapPentatonic(analogRead(SYNC_CONTROL));

  grainPhaseInc  = mapPhaseInc(analogRead(GRAIN_FREQ_CONTROL)) / 2;
  grainDecay     = analogRead(GRAIN_DECAY_CONTROL) / 8;
  grain2PhaseInc = mapPhaseInc(analogRead(GRAIN2_FREQ_CONTROL)) / 2;
  grain2Decay    = analogRead(GRAIN2_DECAY_CONTROL) / 4;


в общем, требуется понять, что передаёт клавиатура и как можно приняв эти данные, превратить её в ноту...бегло просмотрев программу синтезатора, предполагаю, что это что-то вроде секвенсера (воспроизводящее ноты по кругу)... нужно сделать так, что бы секвенсер играл только одну ноту...а её уровнем и частотой, надо управлять через последовательный порт...

Добавлено спустя 16 минут 9 секунд:
неи вроде не секвенсер, тогда в основном цикле "loop", нужно организовать приём данных из com-а...и записывать принятые данные в те переменные, которые отвечают за тон и амплитуду... понять это не сложно, покрутив резисторы в готовой конструкции...

Добавлено спустя 3 минуты 45 секунд:
вначале, лучше поэкспериментировать с передачей данных от ПК...а когда получится эмулировать моном... тогда и подключать реальную клаву...только не через USB, а тремя проводками между контроллерами ардуинок... :)

Добавлено спустя 1 час 48 минут 32 секунды:
Кстати, ещё один вариант подключения :oops: правда "детский какой-то" :) использовать ШИМ в мономе и через фильтр НЧ подавать его на нужный аналоговый вход синтезатора... такой вот вариант "аналогового" модуля :D

Добавлено спустя 1 минуту 30 секунд:
Вообще вариантов может получиться море...чистое творчество...ограниченное возможностями аппаратуры :ROFL:

Re: Музыкальное MIDI устройство Monome = цифровой синт

mtbiker » 15 мар 2010, 00:30

vadinator
записывать принятые данные в те переменные, которые отвечают за тон и амплитуду

это не очень ясно

нужно организовать приём данных из com-а

хм а зачем передачу из coma, а проще нельзя ?

и что за 3 проводка ? )

Re: Музыкальное MIDI устройство Monome = цифровой синт

vadinator » 15 мар 2010, 00:35

Переменные, в которые считываются значения на аналоговых входах (я их выделил в предыдущем посте)... учите Wiring... в любом случае, программы придется корректировать :D по любому...
Три провода, это
-земля или минус по питанию
-2 провода, которые соединяют приёмник первого с передатчиком второго...и наоборот... учите мат-часть :)

Re: Музыкальное MIDI устройство Monome = цифровой синт

vadinator » 16 мар 2010, 04:33

Если интересует 8-битовая музыка, то наткнулся на такой вариант:
http://www.hypersynth.com/hypersid.html
внизу страницы, предлагаются КИТ-ы для самостоятельной сборки... ну и собранный модуль, без корпуса...
там-же можно звук послушать...

Re: Музыкальное MIDI устройство Monome = цифровой синт

vadinator » 16 мар 2010, 04:45



Rambler\'s Top100 Mail.ru counter