
[PWMDAC_Synth - PWM DAC synthesizer library for Arduino]

ver.20160611

Arduinoœ삷ȈՃVZTCUCułB

https://osdn.jp/users/kamide/pf/PWMDAC_Synth/wiki/FrontPage

 CAmiDion

  http://www.yk.rim.or.jp/~kamide/music/chordhelper/hardware/

̂Q@ȍ~ŎCûłB


ArduinoŊy낤ƂāAȖɂԂƂ͂܂񂩁H

EoȂ tone() 葁ǁAaoȂc

EanalogWrite()  PWM o͂ĂApXg̎g490Hz
  Ⴗ邩A1kHzỎȂď悹ȂAǂ悤c

ȖAAVR̃vXP[ij̐ݒς
pXg̎gőɂΈCɉB

̃CúAKő̎Ŕ^C}[荞݂ŁA
̏uԂ̔g̍ɉAPWM̃pX𖈉񃊃A^C
fXV邱ƂɂA`głȂFXȔg`̉o͂܂B

O`bvȂ Arduino {̂̂̂
VZTCỦƂɊpĂB


CXg[

WJ PWMDAC_Synth tH_L̃tH_
uŃCXg[ł܂B

	}ChLg\Arduino\libraries\

uAArduino IDE ̃j[ [t@C]  [XPb`̗] 
PWMDAC_Synth 邱ƂmFĂB


g

	// KvɉAPWMDAC_Synth.h CN[hO #define ŉLwł܂B
	//
	#define PWMDAC_OUTPUT_PIN  3 // PWMo̓sԍiȗFLQƁj
	#define PWMDAC_POLYPHONY   6 // iȗFLQƁj
	#define PWMDAC_NOTE_A_FREQUENCY 440  // Ã`[jOgiȗFftHg440Hzj

	#include <PWMDAC_Synth.h>
	//
	// g`e[uAKvȕ`܂B
	// isvȔg``Ȃ悤ɂ邱ƂŁAvÖ̐ߖɂȂ܂j
	//
	PWMDAC_CREATE_WAVETABLE(squareWavetable, PWMDAC_SQUARE_WAVE);      // `g
	PWMDAC_CREATE_WAVETABLE(triangleWavetable, PWMDAC_TRIANGLE_WAVE);  // Opg
	PWMDAC_CREATE_WAVETABLE(sineWavetable, PWMDAC_SINE_WAVE);          // g
	PWMDAC_CREATE_WAVETABLE(shepardToneSineWavetable, PWMDAC_SHEPARD_TONE);  // VFp[hg[iKj
	PWMDAC_CREATE_WAVETABLE(sawtoothWavetable, PWMDAC_SAWTOOTH_WAVE);  // ̂g
	//
	// g`ƃGx[vp[^iADSRj Instrument \̂ɑ˂
	// vÖɉFf[^𐶐܂B
	//  {} ɂADSR̒ltŎw肵܂il͈̔͂ɂĂ͌q́uFύXvQƁjB
	//
	PROGMEM const Instrument instrument = {sawtoothWavetable, {9, 0, 11, 4}};
	//
	// Fw肵PWMDAC_Synth̎́iCX^Xj𐶐܂B
	// MIDI`l1`16ׂẲFɏ܂B
	//
	PWMDAC_CREATE_INSTANCE(&instrument);

	setup() {
		PWMDACSynth::setup(); // iK{j
	}

	loop() {
		PWMDACSynth::update(); // ԍXViK{j
	}


PWMDACSynth::update() ́AȂǂADSRGx[v`
݈ʒui߂AW[Vɂĕω鎞ԂƂ
gXV邽߂̊֐łBĂяopx͎ŃJE^
pӂȂǂ̕@ŃRg[ĂB

t̃TvXPb`iexamples/*.inojɎႪ܂B
dqy CAmiDion ȂǁAۂ PWMDAC_Synth gĂXPb`
QlɂĂB

̑Ag֐ɂĂ PWMDAC_Synth.h QƂĂB




	ftHg6dałB

	PWMDAC_POLYPHONY ɐlݒ肵ăRpCƂŁA
	𑝌邱Ƃł܂B

	𑝂₵ƁA̕A荞ݏɎԂ
	荞݈ȊȌs]TȂȂAɓ삵ȂȂ܂B


o̓s(PWM)

	PWMo͗pƂĎwłsԍ 3,9,10,11 ̂ꂩłB
	ftHg̃sԍ 3 łB

	3,11 Iꍇ TIMER2A9,10 Iꍇ TIMER1 g܂B

	ȂA5,6  PWM [qłĂwł܂B
	 TIMER0 p ISR()  Arduino  millis() Ȃǂ̂߂ɎgĂ
	Ē`łȂ߂łB

	PWM o̓śÂ܂ PC  LINE IN ȂǂɂȂłꉞ͕܂A
	[pXtB^ŉgʂ悤ɂƁA蕷₷Ȃ܂B


MIDI`l

	PWM_SYNTH ̃\bhŁA

		MIDI`lԍ(1`16)  MIDI`lւ̃|C^

	𑊌ݕϊł܂B

	MidiChannel *getChannel(char channel)
	char getChannel(MidiChannel *cp)

	MIDI`lւ̃|C^ă`lPʂɎ
	p[^𑀍ł܂B

	Am[gIAm[gItAsb`xhȂǂoĂ鉹
	ɔf邽߂ɂ́AMidiChannel ł͂Ȃ PWMDACSynth 
	o֐ĂяoKv܂B


MIDI֐

	PWM_SYNTH ÓIIuWFNgɂ́AMIDICu MIDI.setHandleXxxx() 
	ڎwł悤Ȁ^킹֐pӂĂ܂B

	AڑMIDIfoCXɂẮANOTE OFF ̑
	velocity=0  NOTE ON 𑗂Ă邱Ƃ̂ŁȀꍇ
	NOTE OFF ĂяoƂHvKvɂȂ܂B

	MIDI`lԍ́AMIDICuɍ킹 1`16 ͈̔͂
	w肷悤ɍĂ܂B


FύX

	g`ƃGx[vp[^iADSRj MidiChannel NX
	wavetable  env_param Ɏw肷邱ƂŁAFύXł܂B

	ADSR̐ݒ EnvelopeParam NXčs܂B
	RXgN^Ŏ̒lw肵ďł܂B

	Eattack_time - A^bNԁi傫قǃm[gI̗オ肪j
	Edecay_time - fBPCԁi傫قǃm[gǏj
	Esustain_level - TXeBxi~܂ƈێ鉹ʁj
	Erelease_time - [Xԁi傫قǃm[gIťj

	l͈̔͂ sustain_level  0`255AȊO 0`15 łB
	Ԃ loop()  update() Ăяopxɂĕς܂B

	eADSRp[^lւ̃|C^ getParam() \bhŎ擾ł܂B

	g`e[úAvf256byte^PROGMEMzƂĐ܂B
	 wavetable Ɏw肷邱ƂŁAg`؂ւ邱Ƃł܂B

	g`e[uz̐́APWMDAC_Synth.h Œ`ꂽ
	}NgAKvȔg`e[u𐶐ĂB

	̃}ŃAĂMx255𒴂ĉꂹA
	ő剹ʂ̏o悤ȌvZɂȂĂ܂B
	ɏKĎŔg``΁Aw肵
	Ǝ̉F𐶂ݏoƂ\łB

	vÖ Instrument \̒萔āA
	w肷邱ƂŉFύX邱Ƃł܂B
	MIDĨvO`FW̎ɂ͂̕@߂łB
	݂̃o[Wł́AvO`FWΉɔA
	Gx[v̏ Instrument \̒萔gC^[tF[X
	RAMւ̓WJŏɗ}悤ɂ܂B


[eBeB
	byte musicalMod7(char x)
	byte musicalMod12(char x)
		ꂼ7Ŋ]A12Ŋ]Ԃ܂B
		% ZqƈႢA^ĂŕԂ܂B
		Iɂ̓rbgZƉZōɌvZ܂B
		ǨvZɕ֗łB

	byte log2(unsigned int x)
		QƂΐA_ȉ؎̂ĂŕԂ܂B
		y = log2(x)  x = 1 << y ͋t֐̊֌WɂȂ܂B

	int musicalConstrain12(int note, int min_note, int max_note)
		Arduino  constrain() KpɎ֐B
		note  min_note ` max_note ̉ɂ
		note ̂܂ܕԂ܂B͂ݏoĂꍇA
		KςɃIN^[uʒuς邱ƂɂA
		͈͂Ɏ܂悤܂B


ҁF悵 - Akiyoshi Kamide
	http://www.yk.rim.or.jp/~kamide/
