Wave Table Synthesizer(Occilator only). I will make Envelope Generator and MML for play music.

Dependencies:   mbed

Project: Synthesizer. It is using embed to Chip Tune Synthesizer for NXP LPC1768.

At First

Prepare an amplifier with volume wheel. The amplifier wire at pin1 to pin18(D/A converter) from IC Clip or Breedboard.

Play

Check out this project and deploy your mbed. And then push the reset key.

You hear a sound from amplifier.

Modify

First step, you can see main.cpp. This source file plays an occilator with "wait()". Modify frequency at

#define ADD 0x2000000

on the top of source.

Occilator select 7 waveforms.

  • OCC_NONE,
  • OCC_SQUARE,
  • OCC_SINE,
  • OCC_SAW,
  • OCC_WT,
  • OCC_NOISE,
  • OCC_TRIANGLE,

WT means WaveTable Synthesizer.Use "setWave()" function at first.Wavetable will copy in instance.

Change there for waveform.

    gOccilator[0]=Occilator::getInstance(OCC_SAW,INTERRUPT_TIME_US);

INTERRUPT_TIME_US depends sampling rate. Don't change.

Total volume of D/A converter is setting this place.

        gOccilator[0]->setVolume(volume);

By the way, this sample output 0 to 1V(not3.3V) for deforming distortion.

ToDo

  • Envelope generator and LFO(with delay)
  • MML(Music Macro Language)
  • Sample Song(I will make a Japanese Anime music,perhaps)

Project Goal Date

I will make for Comic Market 90(2016.Aug. in Tokyo).And these thing will be written in a Doujinshi.

Committer:
117Florian
Date:
Tue Feb 09 02:57:27 2016 +0000
Revision:
7:a478d5cc411e
Parent:
5:3a753cf68fac
Child:
8:dd2da7c0c4c7
WaveTable???????WT???sin?

Who changed what in which revision?

UserRevisionLine numberNew contents of line
117Florian 3:32094530d55e 1 #include "mbed.h"
117Florian 3:32094530d55e 2 #include "global.h"
117Florian 3:32094530d55e 3 #include "Occilator.h"
117Florian 4:2febde858269 4 #include "Square.h"
117Florian 7:a478d5cc411e 5 #include "WT.h"
117Florian 3:32094530d55e 6
117Florian 3:32094530d55e 7 static long interrupt_us;
117Florian 3:32094530d55e 8 static int part_num=0;
117Florian 3:32094530d55e 9 static Occilator* part[OCCILATOR_PART_NUM];
117Florian 3:32094530d55e 10 static Ticker sTicker;
117Florian 3:32094530d55e 11 static long total_value_in_this_span;
117Florian 3:32094530d55e 12 static AnalogOut sAnalogOut(p18);
117Florian 5:3a753cf68fac 13 static long sMasterVolume=(1/3.3)*0x10000;
117Florian 3:32094530d55e 14
117Florian 3:32094530d55e 15 /* interrupt handler */
117Florian 3:32094530d55e 16 /*static void tick(uint32_t id);*/
117Florian 3:32094530d55e 17 static void tick();
117Florian 3:32094530d55e 18
117Florian 4:2febde858269 19 Occilator* Occilator::getInstance(Occilator_Type type,long interrupt_us)
117Florian 4:2febde858269 20 {
117Florian 4:2febde858269 21 switch(type)
117Florian 4:2febde858269 22 {
117Florian 4:2febde858269 23 case OCC_NONE:
117Florian 4:2febde858269 24 case OCC_SQUARE:
117Florian 4:2febde858269 25 return new Square(interrupt_us);
117Florian 4:2febde858269 26
117Florian 4:2febde858269 27 case OCC_SINE:
117Florian 4:2febde858269 28 case OCC_WT:
117Florian 4:2febde858269 29 case OCC_NOISE:
117Florian 5:3a753cf68fac 30 default:
117Florian 7:a478d5cc411e 31 return new WT(interrupt_us);
117Florian 4:2febde858269 32 }
117Florian 4:2febde858269 33 }
117Florian 4:2febde858269 34
117Florian 5:3a753cf68fac 35 void Occilator::setMasterVolume(long volume)
117Florian 5:3a753cf68fac 36 {
117Florian 5:3a753cf68fac 37 sMasterVolume=volume;
117Florian 5:3a753cf68fac 38 }
117Florian 5:3a753cf68fac 39
117Florian 3:32094530d55e 40 Occilator::Occilator(long interrupt_us)
117Florian 3:32094530d55e 41 {
117Florian 3:32094530d55e 42 myled1=1;
117Florian 3:32094530d55e 43 ::interrupt_us=interrupt_us;
117Florian 3:32094530d55e 44 if(part_num==0)
117Florian 3:32094530d55e 45 {
117Florian 3:32094530d55e 46 sTicker.attach_us(::tick,interrupt_us);
117Florian 3:32094530d55e 47 }
117Florian 3:32094530d55e 48 part_num++;
117Florian 3:32094530d55e 49 for(int i=0;i<OCCILATOR_PART_NUM;i++)
117Florian 3:32094530d55e 50 {
117Florian 3:32094530d55e 51 if(part[i]==NULL)
117Florian 3:32094530d55e 52 {
117Florian 3:32094530d55e 53 part[i]=this;
117Florian 3:32094530d55e 54 break;
117Florian 3:32094530d55e 55 }
117Florian 3:32094530d55e 56 }
117Florian 3:32094530d55e 57
117Florian 3:32094530d55e 58 m_Volume=0x10000;
117Florian 3:32094530d55e 59 }
117Florian 3:32094530d55e 60
117Florian 3:32094530d55e 61 Occilator::~Occilator()
117Florian 3:32094530d55e 62 {
117Florian 3:32094530d55e 63 part_num--;
117Florian 3:32094530d55e 64 for(int i=0;i<OCCILATOR_PART_NUM;i++)
117Florian 3:32094530d55e 65 {
117Florian 3:32094530d55e 66 if(part[i]==this)
117Florian 3:32094530d55e 67 {
117Florian 3:32094530d55e 68 part[i]=NULL;
117Florian 3:32094530d55e 69 break;
117Florian 3:32094530d55e 70 }
117Florian 3:32094530d55e 71 }
117Florian 3:32094530d55e 72 if(part_num<=0)
117Florian 3:32094530d55e 73 {
117Florian 3:32094530d55e 74 sTicker.detach();
117Florian 3:32094530d55e 75 }
117Florian 3:32094530d55e 76 }
117Florian 3:32094530d55e 77
117Florian 3:32094530d55e 78 void Occilator::setOmega(long speed)
117Florian 3:32094530d55e 79 {
117Florian 3:32094530d55e 80 m_Omega=speed;
117Florian 3:32094530d55e 81 myled2=1;
117Florian 3:32094530d55e 82 }
117Florian 3:32094530d55e 83
117Florian 3:32094530d55e 84 void Occilator::setVolume(int volume)
117Florian 3:32094530d55e 85 {
117Florian 3:32094530d55e 86 m_Volume=volume;
117Florian 3:32094530d55e 87 }
117Florian 3:32094530d55e 88
117Florian 3:32094530d55e 89 unsigned long Occilator::tick()
117Florian 3:32094530d55e 90 {
117Florian 3:32094530d55e 91 m_Angle+=m_Omega;
117Florian 5:3a753cf68fac 92 return 0L;
117Florian 3:32094530d55e 93 }
117Florian 3:32094530d55e 94
117Florian 3:32094530d55e 95 void ::tick()
117Florian 3:32094530d55e 96 {
117Florian 3:32094530d55e 97 long long value=0;
117Florian 3:32094530d55e 98
117Florian 3:32094530d55e 99 for (int i=0;i<OCCILATOR_PART_NUM;i++)
117Florian 3:32094530d55e 100 {
117Florian 3:32094530d55e 101 if (part[i]!=NULL)
117Florian 3:32094530d55e 102 {
117Florian 3:32094530d55e 103 value+=total_value_in_this_span + part[i]->tick();
117Florian 3:32094530d55e 104 }
117Florian 3:32094530d55e 105 }
117Florian 3:32094530d55e 106 value = value>=0x10000 ? 0xffff : value;
117Florian 5:3a753cf68fac 107 value = (sMasterVolume*value)>>16;
117Florian 3:32094530d55e 108 sAnalogOut.write_u16(value);
117Florian 3:32094530d55e 109 myled4=value > 0x80000000;
117Florian 3:32094530d55e 110 }