-- file: music.jal
-- author: Surducan Vasile
-- playing "one litle violin" on pin_c2
-- compiler: up to jal04.24

include f877_04
include jpic
include jdelay



-- fr: real frequency
-- fc: calculated frequency
-- df: error
-- pr2: f877_pr2 register
-- prs: tmr2 prescaler

-- --------------------------------------------------------------------------
--          OCTAVE1                         OCTAVE2    
-- --------------------------------------------------------------------------
	fr[Hz]	fc[Hz]	df[Hz]	pr2/prs	 fr[Hz]	 fc[Hz]	 df[Hz]	 pr2/prs
-- --------------------------------------------------------------------------	
-- Do   261.63  261.5   -0.13   238/16   523.25  525.21  +1.94   118/16
-- Reb  277.18  277.5   +0.32   224/16   554.37  553.09  -1.27   112/16
-- Re   293.66  293.4   -0.26   212/16   587.33  589.62  +2.29   105/16
-- Mib  311.13  310.9   -0.23   200/16   622.25  625     +2.75   99 /16
-- Mi   329.63  328.9   -0.73   189/16   659.26  657.89  -1.36   94 /16
-- Fa   349.23  349.1   -0.13   178/16   698.46  702.24  +3.78   88 /16
-- Fad  369.99  369.8   -0.19   168/16   739.99  744.04  +4.05   83 /16
-- Sol  392     393     +1      158/16   783.99  781.25  -2.74   79 /16
-- Lab  415.3   416.6   +1.3    149/16   830.61  833.33  +2.72   74 /16
-- La   440     440.14  +0.24   141/16   880.0   880.2   +0.2    70 /16
-- Sib  466.16  466.4   +0.24   133/16   932.33  932.8   +0.47   66 /16
-- Si   493.88  492.1   -1.78   126/16   987.77  988     +0.23   254/ 4
-- --------------------------------------------------------------------------
--          OCTAVE3                         OCTAVE4    
-- --------------------------------------------------------------------------
--	fr[Hz]	fc[Hz]	df[Hz]	pr2/prs	 fr[Hz]	 fc[Hz]	 df[Hz]	 pr2/prs
-- --------------------------------------------------------------------------
-- Do   1046.5  1046.02 -0.47   238/4 
-- --------------------------------------------------------------------------


procedure frequency ( byte in period, byte in prescale ) is
asm movf  period, w
 bank_1
asm movwf f877_pr2
 bank_0
  f877_ccpr1l = period / 2       -- set duty cycle at approx 0.5
  pin_c2_direction = output

   if prescale == 16 then
     f877_t2con = 0b_0000_0110   -- tmr2 on, prescale=16
   elsif prescale == 4 then                            
     f877_t2con = 0b_0000_0101   -- tmr2 on, prescale=4
   elsif prescale == 1 then
     f877_t2con = 0b_0000_0100   -- tmr2 on, prescale=1
   end if

  f877_ccp1con = 0b_0000_1100    -- pwm mode on
end procedure

var byte tempo = 10
var byte measure

procedure l ( byte in time ) is -- lenght
 measure = tempo / time
 delay_100mS ( measure )
 f877_ccp1con = 0             -- PWM off
end procedure

procedure p ( byte in time ) is -- pause
 measure = tempo / time
 delay_100mS ( measure )
end procedure

procedure DO1  is frequency ( 238, 16 )  end procedure

procedure REb1 is frequency ( 224, 16 )  end procedure

procedure RE1  is frequency ( 212, 16 )  end procedure

procedure MIb1 is frequency ( 200, 16 )  end procedure

procedure MI1  is frequency ( 189, 16 )  end procedure

procedure FA1  is frequency ( 178, 16 )  end procedure

procedure FAd1 is frequency ( 168, 16 )  end procedure

procedure SOL1 is frequency ( 158, 16 )  end procedure

procedure LAb1 is frequency ( 149, 16 )  end procedure

procedure LA1  is frequency ( 141, 16 )  end procedure

procedure SIb1 is frequency ( 133, 16 )  end procedure

procedure SI1  is frequency ( 126, 16 )  end procedure

procedure DO2  is frequency ( 118, 16 )  end procedure

procedure REb2 is frequency ( 112, 16 )  end procedure

procedure RE2  is frequency ( 105, 16 )  end procedure

procedure MIb2 is frequency (  99, 16 )  end procedure

procedure MI2  is frequency (  94, 16 )  end procedure

procedure FA2  is frequency (  88, 16 )  end procedure

procedure FAd2 is frequency (  83, 16 )  end procedure

procedure SOL2 is frequency (  79, 16 )  end procedure

procedure LAb2 is frequency (  74, 16 )  end procedure

procedure LA2  is frequency (  70, 16 )  end procedure

procedure SIb2 is frequency (  66, 16 )  end procedure

procedure SI2  is frequency ( 252,  4 )  end procedure

procedure DO3  is frequency ( 238,  4 )  end procedure

procedure one_little_violin is
 for 2 loop
  do1 l(8) p(4) re1 l(8) p(4) mi1 l(8) p(4) fa1 l(8) p(4) 
  sol1 l(4) p(4) sol1 l(4) p(4) la1 l(4) p(4) la1 l(4) p(4)
  sol1 l(2) p(4)
 end loop
  fa1 l(4) p(4) fa1 l(4) p(4) mi1 l(4) p(4) mi1 l(4) p(4) re1 l(4) p(4) 
  re1 l(4) p(4) sol1 l(2) p(4)
  fa1 l(4) p(4) fa1 l(4) p(4) mi1 l(4) p(4) mi1 l(4) p(4) re1 l(4) p(4)
  re1 l(4) p(4) do1 l(2) p(4)
 for 2 loop
  do2 l(8) p(4) do2 l(8) p(4) si1 l(4) p(4) si1 l(4) p(4) la1 l(4) p(4)
  la1 l(4) p(4) sol1 l(2) p(4)
 end loop
  fa1 l(4) p(4) fa1 l(4) p(4) mi1 l(4) p(4) mi1 l(4) p(4) re1 l(4) p(4) 
  re1 l(4) p(4) sol1 l(2) p(4)
  fa1 l(4) p(4) fa1 l(4) p(4) mi1 l(4) p(4) mi1 l(4) p(4) re1 l(4) p(4)
  re1 l(4) p(4) do1 l(2) p(4)
end procedure

-- main program


forever loop

 one_little_violin
 delay_1s ( 3 )

end loop

    Source: geocities.com/vsurducan/electro/PIC/math

               ( geocities.com/vsurducan/electro/PIC)                   ( geocities.com/vsurducan/electro)                   ( geocities.com/vsurducan)