Музыкальный синтезатор

 

Выполнил:

Горыня Антон

3097/1

Замечания:

 

 

СПб


Задание

Проектирование музыкального синтезатора с 7 клавишами.

При нажатии клавиши синтезируется и выводится на динамик тон, соответствующие одной из нот октавы .

До………... 261,63 Гц

Ре……….... 293,67 Гц

Ми………....329,63 Гц

Фа……….…349,23 Гц

Соль……….392,00 Гц

Ля………….440.00 Гц

Си………….493,88 Гц


Общие сведенья

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

 

В данном случае разрабатываем цифровой синтезатор .

Обычно цифровые синтезаторы включают в себя собственно цифровые синтезаторы, а также их вариации: виртуальные синтезаторы-плагины/standalone и интерактивные синтезаторы. Они реализуют разнообразные типы синтеза. Для генерации и обработки звука используются математические модели как реальных, так и абстрактных процессов, например, осциллирования, фильтрации, модуляции и т.д. Эти модели реализуются с помощью специализированных логических схем с фиксированным алгоритмом работы, с помощью цифровых сигнальных процессоров, либо с помощью центрального процессора, выполняющего определенную программу. Результат моделирования, представляющий собой числовую последовательность, попадает на цифро-аналоговый преобразователь, где преобразуется в электрический сигнал. Этот сигнал после усиления и воспроизведения через наушники или динамики и создает звук. По сути, цифровой синтезатор представляет собой узкоспециализированный компьютер.

Выбор микроконтроллера

Для начало работы первым делом нужно выбрать микроконтроллер.

Я выбрал ATMEGA 1280

Так как в нем большое количество внешних прерываний

И большое количество оперативной памяти необходимое для заполнения массива. Из-за того что выбранный микроконтроллер не обладает встроенным ЦАПом, пришлось подсоединить внешний


  Аналогично для кнопок 3,4,5,6
Блок схема алгоритма

  Аналогично для кнопок 3,4,5,6

Чертёж схемы


Полный листинг программы

This program was produced by the

CodeWizardAVR V2.03.4 Standard

Automatic Program Generator

© Copyright 1998-2008 Pavel Haiduc, HP InfoTech s.r.l.

http://www.hpinfotech.com

 

Project :

Version :

Date : 28.04.2013

Author :

Company :

Comments:

 

 

Chip type : ATmega1280

Program type : Application

Clock frequency : 8,000000 MHz

Memory model : Small

External RAM size : 0

Data Stack size : 2048

*****************************************************/

 

#include <delay.h>

#include <math.h>

#include <mega1280.h>

 

#define dt 125 // us дискретизация ( 8кГц )

#define speed_delay 5 // us скорость срабатывания ножек

 

 

#define F_1 261.63 // Hz

#define F_2 293.67 // Hz

#define F_3 329.63 // Hz

#define F_4 349.23 // Hz

#define F_5 392.00 // Hz

#define F_6 440.00 // Hz

#define F_7 493.88 // Hz

 

#define note_1 PIND.0

#define note_2 PIND.1

#define note_3 PIND.2

#define note_4 PIND.3

#define note_5 PINE.4

#define note_6 PINE.5

#define note_7 PINE.6

 

int intr=0;

 

// External Interrupt 0 service routine

interrupt [INT0] void ext_int0_isr(void)

{

intr=1;

 

}

 

// External Interrupt 1 service routine

interrupt [INT1] void ext_int1_isr(void)

{

intr=2;

}

 

// External Interrupt 2 service routine

interrupt [INT2] void ext_int2_isr(void)

{

intr=3;

 

}

 

// External Interrupt 3 service routine

interrupt [INT3] void ext_int3_isr(void)

{

intr=4;

 

}

 

// External Interrupt 4 service routine

interrupt [INT4] void ext_int4_isr(void)

{

intr=5;

 

}

 

// External Interrupt 5 service routine

interrupt [INT5] void ext_int5_isr(void)

{

intr=6;

}

 

// External Interrupt 6 service routine

interrupt [INT6] void ext_int6_isr(void)

{

intr=7;

}

 

// External Interrupt 7 service routine

interrupt [INT7] void ext_int7_isr(void)

{

// Place your code here

 

}

 

// Declare your global variables here

 

void main(void)

{

int i=0;

// Оперделяем размер массива

int N_1=(20*8000/F_1);

int N_2=(20*8000/F_2);

int N_3=(20*8000/F_3);

int N_4=(20*8000/F_4);

int N_5=(20*8000/F_5);

int N_6=(20*8000/F_6);

int N_7=(20*8000/F_7);

// Массивы сигналов

int signal_1[N_1];

int signal_2[N_2];

int signal_3[N_3];

int signal_4[N_4];

int signal_5[N_5];

int signal_6[N_6];

int signal_7[N_7];

 

// Crystal Oscillator division factor: 1

#pragma optsize-

CLKPR=0x80;

CLKPR=0x00;

#ifdef _OPTIMIZE_SIZE_

#pragma optsize+

#endif

 

// Input/Output Ports initialization

// Port A initialization

// Func7=Out Func6=Out Func5=Out Func4=Out Func3=Out Func2=Out Func1=Out Func0=Out

// State7=0 State6=0 State5=0 State4=0 State3=0 State2=0 State1=0 State0=0

PORTA=0x00;

DDRA=0xFF;

 

// Port B initialization

// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In

// State7=P State6=P State5=P State4=P State3=P State2=P State1=P State0=P

PORTB=0x00;

DDRB=0x00;

 

// Port C initialization

// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In

// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T

PORTC=0x00;

DDRC=0x00;

 

// Port D initialization

// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In

// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T

PORTD=0xFF;

DDRD=0x00;

 

// Port E initialization

// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In

// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T

PORTE=0xFF;

DDRE=0x00;

 

// Port F initialization

// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In

// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T

PORTF=0x00;

DDRF=0x00;

 

// Port G initialization

// Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In

// State5=T State4=T State3=T State2=T State1=T State0=T

PORTG=0x00;

DDRG=0x00;

 

// Port H initialization

// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In

// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T

PORTH=0x00;

DDRH=0x00;

 

// Port J initialization

// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In

// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T

PORTJ=0x00;

DDRJ=0x00;

 

// Port K initialization

// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In

// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T

PORTK=0x00;

DDRK=0x00;

 

// Port L initialization

// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In

// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T

PORTL=0x00;

DDRL=0x00;

 

// Timer/Counter 0 initialization

// Clock source: System Clock

// Clock value: Timer 0 Stopped

// Mode: Normal top=FFh

// OC0A output: Disconnected

// OC0B output: Disconnected

TCCR0A=0x00;

TCCR0B=0x00;

TCNT0=0x00;

OCR0A=0x00;

OCR0B=0x00;

 

// Timer/Counter 1 initialization

// Clock source: System Clock

// Clock value: Timer 1 Stopped

// Mode: Normal top=FFFFh

// OC1A output: Discon.

// OC1B output: Discon.

// OC1C output: Discon.

// Noise Canceler: Off

// Input Capture on Falling Edge

// Timer 1 Overflow Interrupt: Off

// Input Capture Interrupt: Off

// Compare A Match Interrupt: Off

// Compare B Match Interrupt: Off

// Compare C Match Interrupt: Off

TCCR1A=0x00;

TCCR1B=0x00;

TCNT1H=0x00;

TCNT1L=0x00;

ICR1H=0x00;

ICR1L=0x00;

OCR1AH=0x00;

OCR1AL=0x00;

OCR1BH=0x00;

OCR1BL=0x00;

OCR1CH=0x00;

OCR1CL=0x00;

 

// Timer/Counter 2 initialization

// Clock source: System Clock

// Clock value: Timer 2 Stopped

// Mode: Normal top=FFh

// OC2A output: Disconnected

// OC2B output: Disconnected

ASSR=0x00;

TCCR2A=0x00;

TCCR2B=0x00;

TCNT2=0x00;

OCR2A=0x00;

OCR2B=0x00;

 

// Timer/Counter 3 initialization

// Clock source: System Clock

// Clock value: Timer 3 Stopped

// Mode: Normal top=FFFFh

// Noise Canceler: Off

// Input Capture on Falling Edge

// OC3A output: Discon.

// OC3B output: Discon.

// OC3C output: Discon.

// Timer 3 Overflow Interrupt: Off

// Input Capture Interrupt: Off

// Compare A Match Interrupt: Off

// Compare B Match Interrupt: Off

// Compare C Match Interrupt: Off

TCCR3A=0x00;

TCCR3B=0x00;

TCNT3H=0x00;

TCNT3L=0x00;

ICR3H=0x00;

ICR3L=0x00;

OCR3AH=0x00;

OCR3AL=0x00;

OCR3BH=0x00;

OCR3BL=0x00;

OCR3CH=0x00;

OCR3CL=0x00;

 

// Timer/Counter 4 initialization

// Clock source: System Clock

// Clock value: Timer 4 Stopped

// Mode: Normal top=FFFFh

// OC4A output: Discon.

// OC4B output: Discon.

// OC4C output: Discon.

// Noise Canceler: Off

// Input Capture on Falling Edge

// Timer 4 Overflow Interrupt: Off

// Input Capture Interrupt: Off

// Compare A Match Interrupt: Off

// Compare B Match Interrupt: Off

// Compare C Match Interrupt: Off

TCCR4A=0x00;

TCCR4B=0x00;

TCNT4H=0x00;

TCNT4L=0x00;

ICR4H=0x00;

ICR4L=0x00;

OCR4AH=0x00;

OCR4AL=0x00;

OCR4BH=0x00;

OCR4BL=0x00;

OCR4CH=0x00;

OCR4CL=0x00;

 

// Timer/Counter 5 initialization

// Clock source: System Clock

// Clock value: Timer 5 Stopped

// Mode: Normal top=FFFFh

// OC5A output: Discon.

// OC5B output: Discon.

// OC5C output: Discon.

// Noise Canceler: Off

// Input Capture on Falling Edge

// Timer 5 Overflow Interrupt: Off

// Input Capture Interrupt: Off

// Compare A Match Interrupt: Off

// Compare B Match Interrupt: Off

// Compare C Match Interrupt: Off

TCCR5A=0x00;

TCCR5B=0x00;

TCNT5H=0x00;

TCNT5L=0x00;

ICR5H=0x00;

ICR5L=0x00;

OCR5AH=0x00;

OCR5AL=0x00;

OCR5BH=0x00;

OCR5BL=0x00;

OCR5CH=0x00;

OCR5CL=0x00;

 

// External Interrupt(s) initialization

// INT0: On

// INT0 Mode: Falling Edge

// INT1: On

// INT1 Mode: Falling Edge

// INT2: On

// INT2 Mode: Falling Edge

// INT3: On

// INT3 Mode: Falling Edge

// INT4: On

// INT4 Mode: Falling Edge

// INT5: On

// INT5 Mode: Falling Edge

// INT6: On

// INT6 Mode: Falling Edge

// INT7: On

// INT7 Mode: Falling Edge

EICRA=0xAA;

EICRB=0xAA;

EIMSK=0xFF;

EIFR=0xFF;

// PCINT0 interrupt: Off

// PCINT1 interrupt: Off

// PCINT2 interrupt: Off

// PCINT3 interrupt: Off

// PCINT4 interrupt: Off

// PCINT5 interrupt: Off

// PCINT6 interrupt: Off

// PCINT7 interrupt: Off

// PCINT8 interrupt: Off

// PCINT9 interrupt: Off

// PCINT10 interrupt: Off

// PCINT11 interrupt: Off

// PCINT12 interrupt: Off

// PCINT13 interrupt: Off

// PCINT14 interrupt: Off

// PCINT15 interrupt: Off

// PCINT16 interrupt: Off

// PCINT17 interrupt: Off

// PCINT18 interrupt: Off

// PCINT19 interrupt: Off

// PCINT20 interrupt: Off

// PCINT21 interrupt: Off

// PCINT22 interrupt: Off

// PCINT23 interrupt: Off

PCMSK0=0x00;

PCMSK1=0x00;

PCMSK2=0x00;

PCICR=0x00;

 

// Timer/Counter 0 Interrupt(s) initialization

TIMSK0=0x00;

// Timer/Counter 1 Interrupt(s) initialization

TIMSK1=0x00;

// Timer/Counter 2 Interrupt(s) initialization

TIMSK2=0x00;

// Timer/Counter 3 Interrupt(s) initialization

TIMSK3=0x00;

// Timer/Counter 4 Interrupt(s) initialization

TIMSK4=0x00;

// Timer/Counter 5 Interrupt(s) initialization

TIMSK5=0x00;

 

// Analog Comparator initialization

// Analog Comparator: Off

// Analog Comparator Input Capture by Timer/Counter 1: Off

ACSR=0x80;

ADCSRB=0x00;

 

 

// Формируем массивы сигналов

for(i=0;i<N_1;i++) signal_1[i]=125+125*sin((2*PI*i*dt*0.000001)*F_1);

for(i=0;i<N_2;i++) signal_2[i]=125+125*sin((2*PI*i*dt*0.000001)*F_2);

for(i=0;i<N_3;i++) signal_3[i]=125+125*sin((2*PI*i*dt*0.000001)*F_3);

for(i=0;i<N_4;i++) signal_4[i]=125+125*sin((2*PI*i*dt*0.000001)*F_4);

for(i=0;i<N_5;i++) signal_5[i]=125+125*sin((2*PI*i*dt*0.000001)*F_5);

for(i=0;i<N_6;i++) signal_6[i]=125+125*sin((2*PI*i*dt*0.000001)*F_6);

for(i=0;i<N_7;i++) signal_7[i]=125+125*sin((2*PI*i*dt*0.000001)*F_7);

//Разрешаем прервывания

#asm("sei")

// Основной цикл

while (1)

{

// note_1

if(intr==1)

{

while(note_1==0)

{

for(i=0;i<N_1;i++)

{

PORTA=signal_1[i];

delay_us(dt-speed_delay);

}

}

intr=0;

PORTA=0x00;

}

// note_2

if(intr==2)

{

while(note_2==0)

{

for(i=0;i<N_2;i++)

{

PORTA=signal_2[i];

delay_us(dt-speed_delay);

}

}

intr=0;

PORTA=0x00;

}

// note_3

if(intr==3)

{

while(note_3==0)

{

for(i=0;i<N_3;i++)

{

PORTA=signal_3[i];

delay_us(dt-speed_delay);

}

}

intr=0;

PORTA=0x00;

}

// note_4

if(intr==4)

{

while(note_4==0)

{

for(i=0;i<N_4;i++)

{

PORTA=signal_4[i];

delay_us(dt-speed_delay);

}

}

intr=0;

PORTA=0x00;

}

// note_1

if(intr==5)

{

while(note_5==0)

{

for(i=0;i<N_5;i++)

{

PORTA=signal_5[i];

delay_us(dt-speed_delay);

}

}

intr=0;

PORTA=0x00;

}

// note_6

if(intr==6)

{

while(note_6==0)

{

for(i=0;i<N_6;i++)

{

PORTA=signal_6[i];

delay_us(dt-speed_delay);

}

}

intr=0;

PORTA=0x00;

}

// note_7

if(intr==7)

{

while(note_7==0)

{

for(i=0;i<N_7;i++)

{

PORTA=signal_7[i];

delay_us(dt-speed_delay);

}

}

intr=0;

PORTA=0x00;

}

 

 

}

}


Результаты моделирования

До

Ре

 

Ми

Фа

Соль

Ля

 

Си

Заключение

Был разработан цифровой синтезатор.

На выходе которого мы получаем цифровую синусоиду различной частоты


Список литературы

1. Datasheet ATMEGA 1280

2. Datasheet DAC800

3. Бунтов В.Д., Макаров С.Б. Микропроцессорные системы