multisynth.c 107 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895189618971898189919001901190219031904190519061907190819091910191119121913191419151916191719181919192019211922192319241925192619271928192919301931193219331934193519361937193819391940194119421943194419451946194719481949195019511952195319541955195619571958195919601961196219631964196519661967196819691970197119721973197419751976197719781979198019811982198319841985198619871988198919901991199219931994199519961997199819992000200120022003200420052006200720082009201020112012201320142015201620172018201920202021202220232024202520262027202820292030203120322033203420352036203720382039204020412042204320442045204620472048204920502051205220532054205520562057205820592060206120622063206420652066206720682069207020712072207320742075207620772078207920802081208220832084208520862087208820892090209120922093209420952096209720982099210021012102210321042105210621072108210921102111211221132114211521162117211821192120212121222123212421252126212721282129213021312132213321342135213621372138213921402141214221432144214521462147214821492150215121522153215421552156215721582159216021612162216321642165216621672168216921702171217221732174217521762177217821792180218121822183218421852186218721882189219021912192219321942195219621972198219922002201220222032204220522062207220822092210221122122213221422152216221722182219222022212222222322242225222622272228222922302231223222332234223522362237223822392240224122422243224422452246224722482249225022512252225322542255225622572258225922602261226222632264226522662267226822692270227122722273227422752276227722782279228022812282228322842285228622872288228922902291229222932294229522962297229822992300230123022303230423052306230723082309231023112312231323142315231623172318231923202321232223232324232523262327232823292330233123322333233423352336233723382339234023412342234323442345234623472348234923502351235223532354235523562357235823592360236123622363236423652366236723682369237023712372237323742375237623772378237923802381238223832384238523862387238823892390239123922393239423952396239723982399240024012402240324042405240624072408240924102411241224132414241524162417241824192420242124222423242424252426242724282429243024312432243324342435243624372438243924402441244224432444244524462447244824492450245124522453245424552456245724582459246024612462246324642465246624672468246924702471247224732474247524762477247824792480248124822483248424852486248724882489249024912492249324942495249624972498249925002501250225032504250525062507250825092510251125122513251425152516251725182519252025212522252325242525252625272528252925302531253225332534253525362537253825392540254125422543254425452546254725482549255025512552255325542555255625572558255925602561256225632564256525662567256825692570257125722573257425752576257725782579258025812582258325842585258625872588258925902591259225932594259525962597259825992600260126022603260426052606260726082609261026112612261326142615261626172618261926202621262226232624262526262627262826292630263126322633263426352636263726382639264026412642264326442645264626472648264926502651265226532654265526562657265826592660266126622663266426652666266726682669267026712672267326742675267626772678267926802681268226832684268526862687268826892690269126922693269426952696269726982699270027012702270327042705270627072708270927102711271227132714271527162717271827192720272127222723272427252726272727282729273027312732273327342735273627372738273927402741274227432744274527462747274827492750275127522753275427552756275727582759276027612762276327642765276627672768276927702771277227732774277527762777277827792780278127822783278427852786278727882789279027912792279327942795279627972798279928002801280228032804280528062807280828092810281128122813281428152816281728182819282028212822282328242825282628272828282928302831283228332834283528362837283828392840284128422843284428452846284728482849285028512852285328542855285628572858285928602861286228632864286528662867286828692870287128722873287428752876287728782879288028812882288328842885288628872888288928902891289228932894289528962897289828992900290129022903290429052906290729082909291029112912291329142915291629172918291929202921292229232924292529262927292829292930293129322933293429352936293729382939294029412942294329442945294629472948294929502951295229532954295529562957295829592960296129622963296429652966296729682969297029712972297329742975297629772978297929802981298229832984298529862987298829892990299129922993299429952996299729982999300030013002300330043005300630073008300930103011301230133014301530163017301830193020302130223023302430253026302730283029303030313032303330343035303630373038303930403041304230433044304530463047304830493050305130523053305430553056305730583059306030613062306330643065306630673068306930703071307230733074307530763077307830793080308130823083308430853086308730883089309030913092309330943095309630973098
  1. // COMMENT
  2. // Works now for instruments with spectra defined internally
  3. // With note-loudness-envelope
  4. // With vibrato
  5. // Modified to accept an instrument, time, note, level, duration as parameters.
  6. // Tested with 1 note and with 2 notes.
  7. // Modified to accept several instruments and tested with 3 instruments.
  8. // Modified to make output stereo, and distrib outputs in (fixed) positions in stereo space.
  9. // Jitter (from quantised times) added
  10. // All instrument data consolidated into a structure "synstrument"
  11. // Multichan output option implemented
  12. // Orient multichan to be in front of listener.
  13. // TO DO
  14. // (0) Get (at least) 6 distinguishable instruments working
  15. // (1) Figure out how to enter data, and how to display entered data, in music-staff format.
  16. // (2) Work on permutation rules.
  17. // (3) Generating several outputs and playing side-by-side with input, for comparison.
  18. //
  19. // This is first stage of creating a multi-instrument synth engine, to test out chanber-music ideas.
  20. // Currently it does additive synth and packet synth, with input data files.
  21. // Idea is to choose a set of data values and use these as INTERNAL tables, to synthesize instrument notes.
  22. //
  23. // The synth must be extended as follows
  24. // (1) Add vibrato option
  25. // (2) Control the individual events generated (by each internal-table controlled instrument) from
  26. // new external params for pitch, level and duration (could be MIDI,MIDI,quantised-time)
  27. // (3) From an input score (several instruments) generate an output
  28. // (4) From an input score, generate several derived scores according to rules of transformation.
  29. // (5) Play the outputs, and hence select the best outcome .... ETC in an evloving sequence-of-steps.
  30. // (6) Convert the output data into staff notation.
  31. #include <stdio.h>
  32. #include <stdlib.h>
  33. #include <structures.h>
  34. #include <tkglobals.h>
  35. #include <pnames.h>
  36. #include <filetype.h>
  37. #include <processno.h>
  38. #include <modeno.h>
  39. #include <logic.h>
  40. #include <globcon.h>
  41. #include <cdpmain.h>
  42. #include <math.h>
  43. #include <mixxcon.h>
  44. #include <osbind.h>
  45. #include <standalone.h>
  46. #include <ctype.h>
  47. #include <sfsys.h>
  48. #include <string.h>
  49. #include <srates.h>
  50. #ifdef unix
  51. #define round(x) lround((x))
  52. #endif
  53. #define SAFETY 256
  54. #define VIBSHIFT (1.25) // Extension of pre-vibrato output, to allow for any possible length-variation with addition of vibrato
  55. #define MS_MM 0
  56. #define MS_MAXJIT 1
  57. #define MS_OCHANS 2
  58. #define MAXOUTDUR 60 // 1 minute
  59. #define MSYNSRATE 44100
  60. //#define MSYNCHANS 1
  61. #define INS_NO (0)
  62. #define NOTE_TIME (0)
  63. #define NOTE_PICH (1)
  64. #define NOTE_LEVL (2)
  65. #define NOTE_DUR (3)
  66. #define MSYNMAXQDUR (768) // Assumes time specified in quantisation units of semiquavers, maxdur = semibreve * 8
  67. #define MAXENTRYCNT (129) // 64 partials+levels and 1 time value
  68. #define MAXLINECNT (16) // 16 possible sets of changing spectral data
  69. #define MAXENVPNTS (8) // Maximum number of points specifiying note-envelope for instrument
  70. #define MAXSCORLINE (48) // Maximum number of lines (and therefore instruments) in score
  71. #define MAXPARTIALS (64) // (MAXENTRYCNT - 1)/2;
  72. #define ROOT2 (1.4142136)
  73. #define SIGNAL_TO_LEFT (0)
  74. #define SIGNAL_TO_RIGHT (1)
  75. #define UNITSPERSEMIQ 3 // No of time-units per semiquaver
  76. #define FLUTE_PASSFRQ 260
  77. #define FLUTE_STOPFRQ 200
  78. #define FILTATTEN -96
  79. #define TRUMPET 0
  80. #define CLARINET 1
  81. #define PIANO_RH 2
  82. #define PIANO_LH 3
  83. #define FLUTE 4
  84. #define VIOLIN 5
  85. #define CELLO 6
  86. #define vibrato is_flat
  87. // Array-indices: indicate which array contains which data
  88. #define sinarray fzeroset // sinetable : for sound and vibrato creation
  89. #define pntarray zeroset // various pointers into sinetable, for all partials and for vibrato
  90. #define pakt_env is_transpos // Envelope of wave-packets used in synth
  91. #define temp_tab could_be_transpos // Temporary storage of modified wave-packet
  92. #define orig_tab could_be_pitch // Temporary storage of original wave-packet
  93. #define ins_spectrum is_rectified // Spectrum of current instrument being used
  94. #define ins_envel specenv_type // Loudness-envelope template of current instrument being used
  95. #define ins_vibd deal_with_chan_data // Time-changing data for depth of vibrato for current-note
  96. #define ins_vibf unspecified_filecnt // Time-changing data for frq of vibrato for current-note
  97. #define ochan_pos finished // Positions of instrument streams in multichan output
  98. #define scoredata is_mapping // Storage of input score-data
  99. #define partialtabs_cnt ringsize // Number of partial-data tables (partialno at time t, partiallevel at time t, for all t)
  100. #define filterbas duplicate_snds // Base of counter of filter arrays
  101. // Size of sound and envelope arrays
  102. #define max_notedur tempsize // samplelength of longest note to be generated
  103. #define maxoutsamp rampbrksize // Total samplelength of output sound
  104. // Global constants
  105. #define timeconvert is_sharp // Conversion from semiquavers to time at input MM
  106. // ALPHA : instrument specific data
  107. struct synstrument {
  108. char name[64];
  109. double *spectrum;
  110. int partial_cnt; // No of partials specified in spectrum
  111. int line_cnt; // No of lines, each specifying spectrum at a different time in its evolution
  112. int line_entrycnt; // Total no of vals to specify line of spec: = line_cnt * (1 + (partialcnt * 2)) (time + all partialno-loudness pairs)
  113. int spec_len; // Total no of vals to specify spec: = line_entrycnt * line_cnt
  114. double *env; // Envelope in time-val pairs,
  115. int env_len; // env_len counts all entries so with 3 pairs, env_len = 6 : 10 or 12 ONLY !!
  116. int has_vibrato; // flag (0 1)
  117. double maxvibdepth; // max depth of any vibrato, in semitones
  118. int packettype; // If packettype == 1, synthesis by packets, else, simple additive synth
  119. double squeeze; // Narrowing of packet envelope (0 - 1000). Below 1.0 broaden packet. Vals near zero or very high produce clicks or silence.
  120. double centre; // Centring of peak of packet envelope. 0 peak at centre: -1 peak at start: 1 peak at end.
  121. int rangebot; // Lowest note of instrument (MIDI)
  122. int rangetop; // Highest note of instrument (MIDI)
  123. double balance; // Level of instrument relative to other instruments
  124. int overlap; // Flags if successive instrument-notes can overlap (e.g. piano resonance).
  125. int doublestop; // Max number of simultaneous notes instrument can play (also see rules!!).
  126. };
  127. typedef struct synstrument *synptr;
  128. // Preloaded (time-changing) spectra and loudness-envelope for synthetic instruments
  129. static int orchestra_size = 7;
  130. static double trumpet[99] = {0.0,1,0.970464,2,0.991561,3,0.590717,4,0.759494,5,0.632911,6,1.000000,7,0.573840,8,0.358650,
  131. 9,0.177215,10,0.033755,11,0.025316,12,0.016878,13,0.016878,14,0.012658,15,0.008439,16,0.012658,
  132. 0.1,1,0.970464,2,0.991561,3,0.590717,4,0.759494,5,0.632911,6,1.000000,7,0.573840,8,0.358650,
  133. 9,0.177215,10,0.033755,11,0.025316,12,0.016878,13,0.016878,14,0.012658,15,0.008439,16,0.012658,
  134. 1.0,1,0.970464,2,0.991561,3,0.590717,4,0.759494,5,0.632911,6,1.000000,7,0.573840,8,0.358650,
  135. 9,0.177215,10,0.033755,11,0.025316,12,0.016878,13,0.016878,14,0.012658,15,0.008439,16,0.012658};
  136. static double trumpenv[12] = {0.0, 0,
  137. 0.035,1,
  138. 0.085, 1,
  139. 0.125,.3,
  140. 0.9,.3,
  141. 1.0, 0};
  142. static double clarinet[42] = {0.0,1,1,3,0.9,5,0.8,7,0.7,9,0.6,11,0.5,13,0.4,15,0.3,17,0.2,19,0.1,
  143. 1.0,1,1,3,0.9,5,0.8,7,0.7,9,0.6,11,0.5,13,0.4,15,0.3,17,0.2,19,0.1};
  144. static double clarenv[12] = {0.0, 0,
  145. 0.035,1,
  146. 0.085, 1,
  147. 0.125, 1,
  148. 0.9, 1,
  149. 1.0, 0};
  150. static double flute[62] = {0.0, 1,1.000000,2,0.028184,3,0.031623,4,0.007943,5,0.008913,6,0.003548,7,0.003162,8,0.001778,
  151. 9,0.001778,10,0.001585,11,0.001585,12,0.001413,13,0.001413,14,0.001259,15,0.001259,
  152. 1.0, 1,1.000000,2,0.028184,3,0.031623,4,0.007943,5,0.008913,6,0.003548,7,0.003162,8,0.001778,
  153. 9,0.001778,10,0.001585,11,0.001585,12,0.001413,13,0.001413,14,0.001259,15,0.001259};
  154. static double flutenv[12] = {0.0, 0,
  155. 0.065,0.5,
  156. 0.085,1,
  157. 0.125,1,
  158. 0.9, 1,
  159. 1.0, 0};
  160. static double piano[100] = {0.0,1,1,2,1 ,4,1 ,7,1 ,8,1 , 12,1 ,17,1 ,18,1 ,19,1, 33.67,1, 21.7262,1, 30.4134,1,
  161. 0.3,1,1,2,0.9 ,4,0.8, 7,0.7 ,8,0.6, 12,0.5 ,17,0.4,18,0.3 ,19,0.3, 33.67,0.3 ,21.7262,0.15,30.4134,0.15,
  162. 0.6,1,.5,2,0.45 ,4,0.4,7,0.35 ,8,0.3, 12,0.25 ,17,0.2,18,0.15,19,0.15,33.67,0.1 ,21.7262,0.15,30.4134,0.15,
  163. 1.0,1,.5,2,0.225,4,0.2,7,0.175,8,0.15,12,0.125,17,0.1,18,0.07,19,0.03,33.67,0.03,21.7262,0.0 ,30.4134,0.0};
  164. static double pianoenv[12] = {0.0, 1,
  165. 0.035,0.5,
  166. 0.07,0.25,
  167. 0.1, 0.125,
  168. 1.0, 0.0625,
  169. 3.0, 0};
  170. static double violin[100] = {0.0,1,1.0,2,0.707956,3,0.501184,4,0.141243,5,0.199535,6,0.177826,7,0.281860,8,0.281860,9,0.089114,10,0.223880,11,0.158485,12,0.141243,
  171. 0.07,1,1.0,2,0.707956,3,0.501184,4,0.141243,5,0.199535,6,0.177826,7,0.281860,8,0.281860,9,0.089114,10,0.223880,11,0.158485,12,0.141243,
  172. 0.09,1,1.000000,2,0.501202,3,0.251185,4,0.019950,5,0.039814,6,0.031622,7,0.079445,8,0.079445,9,0.007941,10,0.050122,11,0.025117,12,0.019950,
  173. 1.0, 1,1.000000,2,0.501202,3,0.251185,4,0.019950,5,0.039814,6,0.031622,7,0.079445,8,0.079445,9,0.007941,10,0.050122,11,0.025117,12,0.019950};
  174. static double violenv[12] = {0.0, 0,
  175. 0.07,1,
  176. 0.085,1,
  177. 0.125,1,
  178. 0.9, 1,
  179. 1.0, 0};
  180. static double cello[92] = {0.0,1,1,2,.5,3,.07,4,.33,5,0.09,6,0.09,7,0.11,8,0.1,9,0.1,10,0.045,11,0.02,
  181. 0.07,1,1,2,.5,3,.07,4,.33,5,0.09,6,0.09,7,0.11,8,0.1,9,0.1,10,0.045,11,0.02,
  182. 0.09,1,1,2,.5,3,.07,4,.33,5,0.09,6,0.09,7,0.11,8,0.1,9,0.1,10,0.045,11,0.02,
  183. 1.0, 1,1,2,.5,3,.07,4,.33,5,0.09,6,0.09,7,0.11,8,0.1,9,0.1,10,0.045,11,0.02};
  184. static double cellenv[12] = {0.0, 0,
  185. 0.07,1,
  186. 0.085,1,
  187. 0.125,1,
  188. 0.8, 1,
  189. 1.0, 0};
  190. char errstr[2400];
  191. static int testing = 0;
  192. int anal_infiles = 1;
  193. int sloom = 0;
  194. int sloombatch = 0;
  195. const char* cdp_version = "7.0.0";
  196. //CDP LIB REPLACEMENTS
  197. static int setup_synthesizer_application(dataptr dz);
  198. static int parse_sloom_data(int argc,char *argv[],char ***cmdline,int *cmdlinecnt,dataptr dz);
  199. static int setup_synthesis_param_ranges_and_defaults(dataptr dz);
  200. static int handle_the_outfile(char *cmdline,dataptr dz);
  201. static int open_the_outfile(dataptr dz);
  202. static int setup_and_init_input_param_activity(dataptr dz,int tipc);
  203. static int setup_input_param_defaultval_stores(int tipc,aplptr ap);
  204. static int establish_application(dataptr dz);
  205. static int initialise_vflags(dataptr dz);
  206. static int setup_parameter_storage_and_constants(int storage_cnt,dataptr dz);
  207. static int initialise_is_int_and_no_brk_constants(int storage_cnt,dataptr dz);
  208. static int mark_parameter_types(dataptr dz,aplptr ap);
  209. static int assign_file_data_storage(int infilecnt,dataptr dz);
  210. static int get_tk_cmdline_word(int *cmdlinecnt,char ***cmdline,char *q);
  211. static int get_the_process_no(char *prog_identifier_from_cmdline,dataptr dz);
  212. static int get_the_mode_from_cmdline(char *str,dataptr dz);
  213. static int setup_and_init_input_brktable_constants(dataptr dz,int brkcnt);
  214. static int synthesis_param_preprocess(dataptr dz);
  215. static int score_synthesis(int inlinecnt,double onehzincr,synptr *orchestra,int flt_cnt,double flt_mul,dataptr dz);
  216. static void incr_sinptr(int n,double time,double onehzincr,double frq,double *partialfrq,dataptr dz);
  217. static double read_level(int n,double time,dataptr dz);
  218. static int create_synthesizer_sndbufs(dataptr dz);
  219. static int generate_packet_envelope (dataptr dz);
  220. static double read_packet_envelope(int kk,double incr,dataptr dz);
  221. static int modify_packet_envelope(double synth_ctr,double synth_sqz,dataptr dz);
  222. static double get_frq_with_vibrato(int *init,int n,double onehzincr,double srate,dataptr dz);
  223. static int pretest_the_special_data(char *cmdline,int *inlinecnt,synptr *orchestra,dataptr dz);
  224. static int setup_the_special_data_for_given_instr(int instrno,double *data,synptr instrument,dataptr dz);
  225. static int setup_the_data_arrays(int linecnt,double synth_ctr,double synth_sqz,dataptr dz);
  226. static int impose_note_envelope(float *obuf,double *notenv,int envlen,int sampcnt,int linecnt,int notecnt,synptr instrument,dataptr dz);
  227. static void generate_vibrato_curves(double maxdepth, double notedur, dataptr dz);
  228. static int add_packet_vibrato(int *init,double onehzincr,double srate,int *sampcnt,int packet_dur,dataptr dz);
  229. static int read_instrument_name_from_start_of_line(char **p,char *insnam,int *insno,synptr *orchestra,int linecnt);
  230. static int note_synthesis(int totaloutsamps,double frq,double levl,double onehzincr,int linecnt,int notecnt,int envlen,int *sampcnt,
  231. synptr instrument,int instrno,int flt_cnt,double flt_mul,dataptr dz);
  232. static int retest_count_and_store_the_special_data(char *str,synptr *orchestra,int *flt_cnt,double *flt_mul,dataptr dz);
  233. static void pancalc(double position,double *leftgain,double *rightgain);
  234. static int initialise_instruments(synptr **orchestra);
  235. static int check_clustering(int insno,int chordcnt,int doublestop,char *insname,int time, int *midival);
  236. static int valid_cluster(int insno,double *linestor,int datacnt,synptr *orchestra);
  237. static int add_vibrato(double onehzincr,double srate,int outsampcnt,float *obuf,float *obuf2,dataptr dz);
  238. static int msetup_lphp_filter(int *flt_cnt,double *flt_mul,double passfrq,double stopfrq,dataptr dz);
  239. static int mdo_lphp_filter(int sampcnt,int flt_cnt,double flt_mul,dataptr dz);
  240. /**************************************** MAIN *********************************************/
  241. int main(int argc,char *argv[])
  242. {
  243. int exit_status, inlinecnt, flt_cnt = 0;
  244. dataptr dz = NULL;
  245. synptr *orchestra = NULL;
  246. char **cmdline;
  247. char indatafile[400];
  248. int cmdlinecnt;
  249. double synth_ctr = 0.0, synth_sqz = 0.0, flt_mul = 0.0;
  250. aplptr ap;
  251. int is_launched = FALSE;
  252. double onehzincr = (double)SYNTH_TABSIZE/(double)MSYNSRATE;
  253. srand(16);
  254. if(argc==2 && (strcmp(argv[1],"--version") == 0)) {
  255. fprintf(stdout,"%s\n",cdp_version);
  256. fflush(stdout);
  257. return 0;
  258. }
  259. /* CHECK FOR SOUNDLOOM */
  260. if((sloom = sound_loom_in_use(&argc,&argv)) > 1) {
  261. sloom = 0;
  262. sloombatch = 1;
  263. }
  264. if(sflinit("cdp")){
  265. sfperror("cdp: initialisation\n");
  266. return(FAILED);
  267. }
  268. if((exit_status = initialise_instruments(&orchestra))<0) {
  269. print_messages_and_close_sndfiles(exit_status,is_launched,dz);
  270. return(FAILED);
  271. }
  272. /* SET UP THE PRINCIPLE DATASTRUCTURE */
  273. if((exit_status = establish_datastructure(&dz))<0) { // CDP LIB
  274. print_messages_and_close_sndfiles(exit_status,is_launched,dz);
  275. return(FAILED);
  276. }
  277. if(!sloom) {
  278. if(argc == 1) {
  279. usage1();
  280. return(FAILED);
  281. } else if(argc == 2) {
  282. usage2(argv[1]);
  283. return(FAILED);
  284. }
  285. }
  286. if(!sloom) {
  287. if((exit_status = make_initial_cmdline_check(&argc,&argv))<0) { // CDP LIB
  288. print_messages_and_close_sndfiles(exit_status,is_launched,dz);
  289. return(FAILED);
  290. }
  291. cmdline = argv;
  292. cmdlinecnt = argc;
  293. if((get_the_process_no(argv[0],dz))<0)
  294. return(FAILED);
  295. cmdline++;
  296. cmdlinecnt--;
  297. dz->maxmode = 0;
  298. // setup_particular_application =
  299. if((exit_status = setup_synthesizer_application(dz))<0) {
  300. print_messages_and_close_sndfiles(exit_status,is_launched,dz);
  301. return(FAILED);
  302. }
  303. if((exit_status = count_and_allocate_for_infiles(cmdlinecnt,cmdline,dz))<0) { // CDP LIB
  304. print_messages_and_close_sndfiles(exit_status,is_launched,dz);
  305. return(FAILED);
  306. }
  307. } else {
  308. //parse_TK_data() =
  309. if((exit_status = parse_sloom_data(argc,argv,&cmdline,&cmdlinecnt,dz))<0) {
  310. exit_status = print_messages_and_close_sndfiles(exit_status,is_launched,dz);
  311. return(exit_status);
  312. }
  313. }
  314. ap = dz->application;
  315. // parse_infile_and_hone_type() =
  316. // setup_param_ranges_and_defaults() =
  317. if((exit_status = setup_synthesis_param_ranges_and_defaults(dz))<0) {
  318. exit_status = print_messages_and_close_sndfiles(exit_status,is_launched,dz);
  319. return(FAILED);
  320. }
  321. // open_first_infile() : redundant
  322. // handle_extra_infiles() : redundant
  323. // handle_outfile() =
  324. if((exit_status = handle_the_outfile(cmdline[0],dz))<0) {
  325. print_messages_and_close_sndfiles(exit_status,is_launched,dz);
  326. return(FAILED);
  327. }
  328. cmdlinecnt--;
  329. cmdline++;
  330. // handle_formants() redundant
  331. // handle_formant_quiksearch() redundant
  332. // handle_special_data()
  333. if((exit_status = pretest_the_special_data(cmdline[0],&inlinecnt,orchestra,dz))<0) {
  334. print_messages_and_close_sndfiles(exit_status,is_launched,dz);
  335. return(FAILED);
  336. }
  337. strcpy(indatafile,cmdline[0]);
  338. cmdlinecnt--;
  339. cmdline++;
  340. if((exit_status = read_parameters_and_flags(&cmdline,&cmdlinecnt,dz))<0) { // CDP LIB
  341. print_messages_and_close_sndfiles(exit_status,is_launched,dz);
  342. return(FAILED);
  343. }
  344. if((exit_status = synthesis_param_preprocess(dz))<0) {
  345. print_messages_and_close_sndfiles(exit_status,is_launched,dz);
  346. return(FAILED);
  347. }
  348. // check_param_validity_and_consistency() redundant
  349. if((exit_status = setup_the_data_arrays(inlinecnt,synth_ctr,synth_sqz,dz))<0) {
  350. print_messages_and_close_sndfiles(exit_status,is_launched,dz);
  351. return(FAILED);
  352. }
  353. if((exit_status = retest_count_and_store_the_special_data(indatafile,orchestra,&flt_cnt,&flt_mul,dz))<0) {
  354. print_messages_and_close_sndfiles(exit_status,is_launched,dz);
  355. return(FAILED);
  356. }
  357. is_launched = TRUE;
  358. if((exit_status = create_synthesizer_sndbufs(dz))<0) { // CDP LIB
  359. print_messages_and_close_sndfiles(exit_status,is_launched,dz);
  360. return(FAILED);
  361. }
  362. // Must come AFTER the special_data function
  363. if((exit_status = open_the_outfile(dz))<0) {
  364. print_messages_and_close_sndfiles(exit_status,is_launched,dz);
  365. return(FAILED);
  366. }
  367. //process_file =
  368. if((exit_status = score_synthesis(inlinecnt,onehzincr,orchestra,flt_cnt,flt_mul,dz))<0) {
  369. print_messages_and_close_sndfiles(exit_status,is_launched,dz);
  370. return(FAILED);
  371. }
  372. if((exit_status = complete_output(dz))<0) { // CDP LIB
  373. print_messages_and_close_sndfiles(exit_status,is_launched,dz);
  374. return(FAILED);
  375. }
  376. exit_status = print_messages_and_close_sndfiles(FINISHED,is_launched,dz); // CDP LIB
  377. free(dz);
  378. return(SUCCEEDED);
  379. }
  380. /**********************************************
  381. REPLACED CDP LIB FUNCTIONS
  382. **********************************************/
  383. /****************************** SET_PARAM_DATA *********************************/
  384. int set_param_data(aplptr ap, int special_data,int maxparamcnt,int paramcnt,char *paramlist)
  385. {
  386. ap->special_data = (char)special_data;
  387. ap->param_cnt = (char)paramcnt;
  388. ap->max_param_cnt = (char)maxparamcnt;
  389. if(ap->max_param_cnt>0) {
  390. if((ap->param_list = (char *)malloc((size_t)(ap->max_param_cnt+1)))==NULL) {
  391. sprintf(errstr,"INSUFFICIENT MEMORY: for param_list\n");
  392. return(MEMORY_ERROR);
  393. }
  394. strcpy(ap->param_list,paramlist);
  395. }
  396. return(FINISHED);
  397. }
  398. /****************************** SET_VFLGS *********************************/
  399. int set_vflgs
  400. (aplptr ap,char *optflags,int optcnt,char *optlist,char *varflags,int vflagcnt, int vparamcnt,char *varlist)
  401. {
  402. ap->option_cnt = (char) optcnt; /*RWD added cast */
  403. if(optcnt) {
  404. if((ap->option_list = (char *)malloc((size_t)(optcnt+1)))==NULL) {
  405. sprintf(errstr,"INSUFFICIENT MEMORY: for option_list\n");
  406. return(MEMORY_ERROR);
  407. }
  408. strcpy(ap->option_list,optlist);
  409. if((ap->option_flags = (char *)malloc((size_t)(optcnt+1)))==NULL) {
  410. sprintf(errstr,"INSUFFICIENT MEMORY: for option_flags\n");
  411. return(MEMORY_ERROR);
  412. }
  413. strcpy(ap->option_flags,optflags);
  414. }
  415. ap->vflag_cnt = (char) vflagcnt;
  416. ap->variant_param_cnt = (char) vparamcnt;
  417. if(vflagcnt) {
  418. if((ap->variant_list = (char *)malloc((size_t)(vflagcnt+1)))==NULL) {
  419. sprintf(errstr,"INSUFFICIENT MEMORY: for variant_list\n");
  420. return(MEMORY_ERROR);
  421. }
  422. strcpy(ap->variant_list,varlist);
  423. if((ap->variant_flags = (char *)malloc((size_t)(vflagcnt+1)))==NULL) {
  424. sprintf(errstr,"INSUFFICIENT MEMORY: for variant_flags\n");
  425. return(MEMORY_ERROR);
  426. }
  427. strcpy(ap->variant_flags,varflags);
  428. }
  429. return(FINISHED);
  430. }
  431. /***************************** APPLICATION_INIT **************************/
  432. int application_init(dataptr dz)
  433. {
  434. int exit_status;
  435. int storage_cnt;
  436. int tipc, brkcnt;
  437. aplptr ap = dz->application;
  438. if(ap->vflag_cnt>0)
  439. initialise_vflags(dz);
  440. tipc = ap->max_param_cnt + ap->option_cnt + ap->variant_param_cnt;
  441. ap->total_input_param_cnt = (char)tipc;
  442. if(tipc>0) {
  443. if((exit_status = setup_input_param_range_stores(tipc,ap))<0)
  444. return(exit_status);
  445. if((exit_status = setup_input_param_defaultval_stores(tipc,ap))<0)
  446. return(exit_status);
  447. if((exit_status = setup_and_init_input_param_activity(dz,tipc))<0)
  448. return(exit_status);
  449. }
  450. brkcnt = tipc;
  451. //THERE ARE NO INPUTFILE brktables USED IN THIS PROCESS
  452. if(brkcnt>0) {
  453. if((exit_status = setup_and_init_input_brktable_constants(dz,brkcnt))<0)
  454. return(exit_status);
  455. }
  456. if((storage_cnt = tipc + ap->internal_param_cnt)>0) {
  457. if((exit_status = setup_parameter_storage_and_constants(storage_cnt,dz))<0)
  458. return(exit_status);
  459. if((exit_status = initialise_is_int_and_no_brk_constants(storage_cnt,dz))<0)
  460. return(exit_status);
  461. }
  462. if((exit_status = mark_parameter_types(dz,ap))<0)
  463. return(exit_status);
  464. // establish_infile_constants() replaced by
  465. dz->infilecnt = 1;
  466. //establish_bufptrs_and_extra_buffers():
  467. return(FINISHED);
  468. }
  469. /********************** SETUP_PARAMETER_STORAGE_AND_CONSTANTS ********************/
  470. /* RWD mallo changed to calloc; helps debug verison run as release! */
  471. int setup_parameter_storage_and_constants(int storage_cnt,dataptr dz)
  472. {
  473. if((dz->param = (double *)calloc(storage_cnt, sizeof(double)))==NULL) {
  474. sprintf(errstr,"setup_parameter_storage_and_constants(): 1\n");
  475. return(MEMORY_ERROR);
  476. }
  477. if((dz->iparam = (int *)calloc(storage_cnt, sizeof(int) ))==NULL) {
  478. sprintf(errstr,"setup_parameter_storage_and_constants(): 2\n");
  479. return(MEMORY_ERROR);
  480. }
  481. if((dz->is_int = (char *)calloc(storage_cnt, sizeof(char)))==NULL) {
  482. sprintf(errstr,"setup_parameter_storage_and_constants(): 3\n");
  483. return(MEMORY_ERROR);
  484. }
  485. if((dz->no_brk = (char *)calloc(storage_cnt, sizeof(char)))==NULL) {
  486. sprintf(errstr,"setup_parameter_storage_and_constants(): 5\n");
  487. return(MEMORY_ERROR);
  488. }
  489. return(FINISHED);
  490. }
  491. /************** INITIALISE_IS_INT_AND_NO_BRK_CONSTANTS *****************/
  492. int initialise_is_int_and_no_brk_constants(int storage_cnt,dataptr dz)
  493. {
  494. int n;
  495. for(n=0;n<storage_cnt;n++) {
  496. dz->is_int[n] = (char)0;
  497. dz->no_brk[n] = (char)0;
  498. }
  499. return(FINISHED);
  500. }
  501. /***************************** MARK_PARAMETER_TYPES **************************/
  502. int mark_parameter_types(dataptr dz,aplptr ap)
  503. {
  504. int n, m; /* PARAMS */
  505. for(n=0;n<ap->max_param_cnt;n++) {
  506. switch(ap->param_list[n]) {
  507. case('0'): break; /* dz->is_active[n] = 0 is default */
  508. case('i'): dz->is_active[n] = (char)1; dz->is_int[n] = (char)1;dz->no_brk[n] = (char)1; break;
  509. case('I'): dz->is_active[n] = (char)1; dz->is_int[n] = (char)1; break;
  510. case('d'): dz->is_active[n] = (char)1; dz->no_brk[n] = (char)1; break;
  511. case('D'): dz->is_active[n] = (char)1; /* normal case: double val or brkpnt file */ break;
  512. default:
  513. sprintf(errstr,"Programming error: invalid parameter type in mark_parameter_types()\n");
  514. return(PROGRAM_ERROR);
  515. }
  516. } /* OPTIONS */
  517. for(n=0,m=ap->max_param_cnt;n<ap->option_cnt;n++,m++) {
  518. switch(ap->option_list[n]) {
  519. case('i'): dz->is_active[m] = (char)1; dz->is_int[m] = (char)1; dz->no_brk[m] = (char)1; break;
  520. case('I'): dz->is_active[m] = (char)1; dz->is_int[m] = (char)1; break;
  521. case('d'): dz->is_active[m] = (char)1; dz->no_brk[m] = (char)1; break;
  522. case('D'): dz->is_active[m] = (char)1; /* normal case: double val or brkpnt file */ break;
  523. default:
  524. sprintf(errstr,"Programming error: invalid option type in mark_parameter_types()\n");
  525. return(PROGRAM_ERROR);
  526. }
  527. } /* VARIANTS */
  528. for(n=0,m=ap->max_param_cnt + ap->option_cnt;n < ap->variant_param_cnt; n++, m++) {
  529. switch(ap->variant_list[n]) {
  530. case('0'): break;
  531. case('i'): dz->is_active[m] = (char)1; dz->is_int[m] = (char)1; dz->no_brk[m] = (char)1; break;
  532. case('I'): dz->is_active[m] = (char)1; dz->is_int[m] = (char)1; break;
  533. case('d'): dz->is_active[m] = (char)1; dz->no_brk[m] = (char)1; break;
  534. case('D'): dz->is_active[m] = (char)1; /* normal case: double val or brkpnt file */ break;
  535. default:
  536. sprintf(errstr,"Programming error: invalid variant type in mark_parameter_types()\n");
  537. return(PROGRAM_ERROR);
  538. }
  539. } /* INTERNAL */
  540. for(n=0,
  541. m=ap->max_param_cnt + ap->option_cnt + ap->variant_param_cnt; n<ap->internal_param_cnt; n++,m++) {
  542. switch(ap->internal_param_list[n]) {
  543. case('0'): break; /* dummy variables: variables not used: but important for internal paream numbering!! */
  544. case('i'): dz->is_int[m] = (char)1; dz->no_brk[m] = (char)1; break;
  545. case('d'): dz->no_brk[m] = (char)1; break;
  546. default:
  547. sprintf(errstr,"Programming error: invalid internal param type in mark_parameter_types()\n");
  548. return(PROGRAM_ERROR);
  549. }
  550. }
  551. return(FINISHED);
  552. }
  553. /************************ HANDLE_THE_OUTFILE *********************/
  554. int handle_the_outfile(char *str,dataptr dz)
  555. {
  556. char filename[2000];
  557. char *p,*q;
  558. strcpy(filename,str);
  559. if(!sloom) {
  560. if(file_has_invalid_startchar(filename) || value_is_numeric(filename)) {
  561. sprintf(errstr,"Outfile name %s has invalid start character(s) or looks too much like a number.\n",filename);
  562. return(DATA_ERROR);
  563. }
  564. }
  565. q = filename;
  566. p = filename; // Drop file extension
  567. while(*p != ENDOFSTR) {
  568. if(*p == '.') {
  569. *p = ENDOFSTR;
  570. break;
  571. }
  572. p++;
  573. }
  574. p--;
  575. while(p != filename) { // Drop file path
  576. if(*p == '/') {
  577. q = p+1;
  578. break;
  579. }
  580. p--;
  581. }
  582. strcpy(dz->outfilename,q);
  583. return(FINISHED);
  584. }
  585. /************************ OPEN_THE_OUTFILE *********************/
  586. int open_the_outfile(dataptr dz)
  587. {
  588. int exit_status;
  589. if((exit_status = create_sized_outfile(dz->outfilename,dz))<0)
  590. return(exit_status);
  591. return(FINISHED);
  592. }
  593. /***************************** ESTABLISH_APPLICATION **************************/
  594. int establish_application(dataptr dz)
  595. {
  596. aplptr ap;
  597. if((dz->application = (aplptr)malloc(sizeof (struct applic)))==NULL) {
  598. sprintf(errstr,"establish_application()\n");
  599. return(MEMORY_ERROR);
  600. }
  601. ap = dz->application;
  602. memset((char *)ap,0,sizeof(struct applic));
  603. return(FINISHED);
  604. }
  605. /************************* INITIALISE_VFLAGS *************************/
  606. int initialise_vflags(dataptr dz)
  607. {
  608. int n;
  609. if((dz->vflag = (char *)malloc(dz->application->vflag_cnt * sizeof(char)))==NULL) {
  610. sprintf(errstr,"INSUFFICIENT MEMORY: vflag store,\n");
  611. return(MEMORY_ERROR);
  612. }
  613. for(n=0;n<dz->application->vflag_cnt;n++)
  614. dz->vflag[n] = FALSE;
  615. return FINISHED;
  616. }
  617. /************************* SETUP_INPUT_PARAM_DEFAULTVALS *************************/
  618. int setup_input_param_defaultval_stores(int tipc,aplptr ap)
  619. {
  620. int n;
  621. if((ap->default_val = (double *)malloc(tipc * sizeof(double)))==NULL) {
  622. sprintf(errstr,"INSUFFICIENT MEMORY for application default values store\n");
  623. return(MEMORY_ERROR);
  624. }
  625. for(n=0;n<tipc;n++)
  626. ap->default_val[n] = 0.0;
  627. return(FINISHED);
  628. }
  629. /***************************** SETUP_AND_INIT_INPUT_PARAM_ACTIVITY **************************/
  630. int setup_and_init_input_param_activity(dataptr dz,int tipc)
  631. {
  632. int n;
  633. if((dz->is_active = (char *)malloc((size_t)tipc))==NULL) {
  634. sprintf(errstr,"setup_and_init_input_param_activity()\n");
  635. return(MEMORY_ERROR);
  636. }
  637. for(n=0;n<tipc;n++)
  638. dz->is_active[n] = (char)0;
  639. return(FINISHED);
  640. }
  641. /************************* SETUP_SYNTHESIZER_APPLICATION *******************/
  642. int setup_synthesizer_application(dataptr dz)
  643. {
  644. int exit_status;
  645. aplptr ap;
  646. if((exit_status = establish_application(dz))<0) // GLOBAL
  647. return(FAILED);
  648. ap = dz->application;
  649. // SEE parstruct FOR EXPLANATION of next 2 functions
  650. if((exit_status = set_param_data(ap,SCOREDATA,1,1,"dD"))<0)
  651. return(FAILED);
  652. if((exit_status = set_vflgs(ap,"jo",2,"di","b",1,0,"0"))<0)
  653. return(exit_status);
  654. // set_legal_infile_structure -->
  655. dz->has_otherfile = FALSE;
  656. // assign_process_logic -->
  657. dz->input_data_type = NO_FILE_AT_ALL;
  658. dz->process_type = UNEQUAL_SNDFILE;
  659. dz->outfiletype = SNDFILE_OUT;
  660. return application_init(dz); //GLOBAL
  661. }
  662. /************************* PARSE_INFILE_AND_CHECK_TYPE *******************/
  663. int parse_infile_and_check_type(char **cmdline,dataptr dz)
  664. {
  665. int exit_status;
  666. infileptr infile_info;
  667. if(!sloom) {
  668. if((infile_info = (infileptr)malloc(sizeof(struct filedata)))==NULL) {
  669. sprintf(errstr,"INSUFFICIENT MEMORY for infile structure to test file data.");
  670. return(MEMORY_ERROR);
  671. } else if((exit_status = cdparse(cmdline[0],infile_info))<0) {
  672. sprintf(errstr,"Failed to parse input file %s\n",cmdline[0]);
  673. return(PROGRAM_ERROR);
  674. } else if(infile_info->filetype != SNDFILE) {
  675. sprintf(errstr,"File %s is not of correct type\n",cmdline[0]);
  676. return(DATA_ERROR);
  677. } else if((exit_status = copy_parse_info_to_main_structure(infile_info,dz))<0) {
  678. sprintf(errstr,"Failed to copy file parsing information\n");
  679. return(PROGRAM_ERROR);
  680. }
  681. free(infile_info);
  682. }
  683. return(FINISHED);
  684. }
  685. /************************* SETUP_SYNTHESIS_PARAM_RANGES_AND_DEFAULTS *******************/
  686. int setup_synthesis_param_ranges_and_defaults(dataptr dz)
  687. {
  688. int exit_status;
  689. aplptr ap = dz->application;
  690. // set_param_ranges()
  691. ap->total_input_param_cnt = (char)(ap->max_param_cnt + ap->option_cnt + ap->variant_param_cnt);
  692. // NB total_input_param_cnt is > 0 !!!
  693. if((exit_status = setup_input_param_range_stores(ap->total_input_param_cnt,ap))<0)
  694. return(FAILED);
  695. // get_param_ranges()
  696. ap->lo[MS_MM] = 30.0;
  697. ap->hi[MS_MM] = 500.0;
  698. ap->default_val[MS_MM] = 60.0;
  699. ap->lo[MS_MAXJIT] = 0;
  700. ap->hi[MS_MAXJIT] = 20;
  701. ap->default_val[MS_MAXJIT] = 15;
  702. ap->lo[MS_OCHANS] = 2;
  703. ap->hi[MS_OCHANS] = 8;
  704. ap->default_val[MS_OCHANS] = 2;
  705. dz->maxmode = 0;
  706. if(!sloom)
  707. put_default_vals_in_all_params(dz);
  708. return(FINISHED);
  709. }
  710. /********************************* PARSE_SLOOM_DATA *********************************/
  711. int parse_sloom_data(int argc,char *argv[],char ***cmdline,int *cmdlinecnt,dataptr dz)
  712. {
  713. int exit_status;
  714. int cnt = 1, infilecnt;
  715. int filesize, insams, inbrksize;
  716. double dummy;
  717. int true_cnt = 0;
  718. aplptr ap;
  719. while(cnt<=PRE_CMDLINE_DATACNT) {
  720. if(cnt > argc) {
  721. sprintf(errstr,"Insufficient data sent from TK\n");
  722. return(DATA_ERROR);
  723. }
  724. switch(cnt) {
  725. case(1):
  726. if(sscanf(argv[cnt],"%d",&dz->process)!=1) {
  727. sprintf(errstr,"Cannot read process no. sent from TK\n");
  728. return(DATA_ERROR);
  729. }
  730. break;
  731. case(2):
  732. if(sscanf(argv[cnt],"%d",&dz->mode)!=1) {
  733. sprintf(errstr,"Cannot read mode no. sent from TK\n");
  734. return(DATA_ERROR);
  735. }
  736. if(dz->mode > 0)
  737. dz->mode--;
  738. //setup_particular_application() =
  739. if((exit_status = setup_synthesizer_application(dz))<0)
  740. return(exit_status);
  741. ap = dz->application;
  742. break;
  743. case(3):
  744. if(sscanf(argv[cnt],"%d",&infilecnt)!=1) {
  745. sprintf(errstr,"Cannot read infilecnt sent from TK\n");
  746. return(DATA_ERROR);
  747. }
  748. if(infilecnt < 1) {
  749. true_cnt = cnt + 1;
  750. cnt = PRE_CMDLINE_DATACNT; /* force exit from loop after assign_file_data_storage */
  751. }
  752. if((exit_status = assign_file_data_storage(infilecnt,dz))<0)
  753. return(exit_status);
  754. break;
  755. case(INPUT_FILETYPE+4):
  756. if(sscanf(argv[cnt],"%d",&dz->infile->filetype)!=1) {
  757. sprintf(errstr,"Cannot read filetype sent from TK (%s)\n",argv[cnt]);
  758. return(DATA_ERROR);
  759. }
  760. break;
  761. case(INPUT_FILESIZE+4):
  762. if(sscanf(argv[cnt],"%d",&filesize)!=1) {
  763. sprintf(errstr,"Cannot read infilesize sent from TK\n");
  764. return(DATA_ERROR);
  765. }
  766. dz->insams[0] = filesize;
  767. break;
  768. case(INPUT_INSAMS+4):
  769. if(sscanf(argv[cnt],"%d",&insams)!=1) {
  770. sprintf(errstr,"Cannot read insams sent from TK\n");
  771. return(DATA_ERROR);
  772. }
  773. dz->insams[0] = insams;
  774. break;
  775. case(INPUT_SRATE+4):
  776. if(sscanf(argv[cnt],"%d",&dz->infile->srate)!=1) {
  777. sprintf(errstr,"Cannot read srate sent from TK\n");
  778. return(DATA_ERROR);
  779. }
  780. break;
  781. case(INPUT_CHANNELS+4):
  782. if(sscanf(argv[cnt],"%d",&dz->infile->channels)!=1) {
  783. sprintf(errstr,"Cannot read channels sent from TK\n");
  784. return(DATA_ERROR);
  785. }
  786. break;
  787. case(INPUT_STYPE+4):
  788. if(sscanf(argv[cnt],"%d",&dz->infile->stype)!=1) {
  789. sprintf(errstr,"Cannot read stype sent from TK\n");
  790. return(DATA_ERROR);
  791. }
  792. break;
  793. case(INPUT_ORIGSTYPE+4):
  794. if(sscanf(argv[cnt],"%d",&dz->infile->origstype)!=1) {
  795. sprintf(errstr,"Cannot read origstype sent from TK\n");
  796. return(DATA_ERROR);
  797. }
  798. break;
  799. case(INPUT_ORIGRATE+4):
  800. if(sscanf(argv[cnt],"%d",&dz->infile->origrate)!=1) {
  801. sprintf(errstr,"Cannot read origrate sent from TK\n");
  802. return(DATA_ERROR);
  803. }
  804. break;
  805. case(INPUT_MLEN+4):
  806. if(sscanf(argv[cnt],"%d",&dz->infile->Mlen)!=1) {
  807. sprintf(errstr,"Cannot read Mlen sent from TK\n");
  808. return(DATA_ERROR);
  809. }
  810. break;
  811. case(INPUT_DFAC+4):
  812. if(sscanf(argv[cnt],"%d",&dz->infile->Dfac)!=1) {
  813. sprintf(errstr,"Cannot read Dfac sent from TK\n");
  814. return(DATA_ERROR);
  815. }
  816. break;
  817. case(INPUT_ORIGCHANS+4):
  818. if(sscanf(argv[cnt],"%d",&dz->infile->origchans)!=1) {
  819. sprintf(errstr,"Cannot read origchans sent from TK\n");
  820. return(DATA_ERROR);
  821. }
  822. break;
  823. case(INPUT_SPECENVCNT+4):
  824. if(sscanf(argv[cnt],"%d",&dz->infile->specenvcnt)!=1) {
  825. sprintf(errstr,"Cannot read specenvcnt sent from TK\n");
  826. return(DATA_ERROR);
  827. }
  828. dz->specenvcnt = dz->infile->specenvcnt;
  829. break;
  830. case(INPUT_WANTED+4):
  831. if(sscanf(argv[cnt],"%d",&dz->wanted)!=1) {
  832. sprintf(errstr,"Cannot read wanted sent from TK\n");
  833. return(DATA_ERROR);
  834. }
  835. break;
  836. case(INPUT_WLENGTH+4):
  837. if(sscanf(argv[cnt],"%d",&dz->wlength)!=1) {
  838. sprintf(errstr,"Cannot read wlength sent from TK\n");
  839. return(DATA_ERROR);
  840. }
  841. break;
  842. case(INPUT_OUT_CHANS+4):
  843. if(sscanf(argv[cnt],"%d",&dz->out_chans)!=1) {
  844. sprintf(errstr,"Cannot read out_chans sent from TK\n");
  845. return(DATA_ERROR);
  846. }
  847. break;
  848. /* RWD these chanegs to samps - tk will have to deal with that! */
  849. case(INPUT_DESCRIPTOR_BYTES+4):
  850. if(sscanf(argv[cnt],"%d",&dz->descriptor_samps)!=1) {
  851. sprintf(errstr,"Cannot read descriptor_samps sent from TK\n");
  852. return(DATA_ERROR);
  853. }
  854. break;
  855. case(INPUT_IS_TRANSPOS+4):
  856. if(sscanf(argv[cnt],"%d",&dz->is_transpos)!=1) {
  857. sprintf(errstr,"Cannot read is_transpos sent from TK\n");
  858. return(DATA_ERROR);
  859. }
  860. break;
  861. case(INPUT_COULD_BE_TRANSPOS+4):
  862. if(sscanf(argv[cnt],"%d",&dz->could_be_transpos)!=1) {
  863. sprintf(errstr,"Cannot read could_be_transpos sent from TK\n");
  864. return(DATA_ERROR);
  865. }
  866. break;
  867. case(INPUT_COULD_BE_PITCH+4):
  868. if(sscanf(argv[cnt],"%d",&dz->could_be_pitch)!=1) {
  869. sprintf(errstr,"Cannot read could_be_pitch sent from TK\n");
  870. return(DATA_ERROR);
  871. }
  872. break;
  873. case(INPUT_DIFFERENT_SRATES+4):
  874. if(sscanf(argv[cnt],"%d",&dz->different_srates)!=1) {
  875. sprintf(errstr,"Cannot read different_srates sent from TK\n");
  876. return(DATA_ERROR);
  877. }
  878. break;
  879. case(INPUT_DUPLICATE_SNDS+4):
  880. if(sscanf(argv[cnt],"%d",&dz->duplicate_snds)!=1) {
  881. sprintf(errstr,"Cannot read duplicate_snds sent from TK\n");
  882. return(DATA_ERROR);
  883. }
  884. break;
  885. case(INPUT_BRKSIZE+4):
  886. if(sscanf(argv[cnt],"%d",&inbrksize)!=1) {
  887. sprintf(errstr,"Cannot read brksize sent from TK\n");
  888. return(DATA_ERROR);
  889. }
  890. if(inbrksize > 0) {
  891. switch(dz->input_data_type) {
  892. case(WORDLIST_ONLY):
  893. break;
  894. case(PITCH_AND_PITCH):
  895. case(PITCH_AND_TRANSPOS):
  896. case(TRANSPOS_AND_TRANSPOS):
  897. dz->tempsize = inbrksize;
  898. break;
  899. case(BRKFILES_ONLY):
  900. case(UNRANGED_BRKFILE_ONLY):
  901. case(DB_BRKFILES_ONLY):
  902. case(ALL_FILES):
  903. case(ANY_NUMBER_OF_ANY_FILES):
  904. if(dz->extrabrkno < 0) {
  905. sprintf(errstr,"Storage location number for brktable not established by CDP.\n");
  906. return(DATA_ERROR);
  907. }
  908. if(dz->brksize == NULL) {
  909. sprintf(errstr,"CDP has not established storage space for input brktable.\n");
  910. return(PROGRAM_ERROR);
  911. }
  912. dz->brksize[dz->extrabrkno] = inbrksize;
  913. break;
  914. default:
  915. sprintf(errstr,"TK sent brktablesize > 0 for input_data_type [%d] not using brktables.\n",
  916. dz->input_data_type);
  917. return(PROGRAM_ERROR);
  918. }
  919. break;
  920. }
  921. break;
  922. case(INPUT_NUMSIZE+4):
  923. if(sscanf(argv[cnt],"%d",&dz->numsize)!=1) {
  924. sprintf(errstr,"Cannot read numsize sent from TK\n");
  925. return(DATA_ERROR);
  926. }
  927. break;
  928. case(INPUT_LINECNT+4):
  929. if(sscanf(argv[cnt],"%d",&dz->linecnt)!=1) {
  930. sprintf(errstr,"Cannot read linecnt sent from TK\n");
  931. return(DATA_ERROR);
  932. }
  933. break;
  934. case(INPUT_ALL_WORDS+4):
  935. if(sscanf(argv[cnt],"%d",&dz->all_words)!=1) {
  936. sprintf(errstr,"Cannot read all_words sent from TK\n");
  937. return(DATA_ERROR);
  938. }
  939. break;
  940. case(INPUT_ARATE+4):
  941. if(sscanf(argv[cnt],"%f",&dz->infile->arate)!=1) {
  942. sprintf(errstr,"Cannot read arate sent from TK\n");
  943. return(DATA_ERROR);
  944. }
  945. break;
  946. case(INPUT_FRAMETIME+4):
  947. if(sscanf(argv[cnt],"%lf",&dummy)!=1) {
  948. sprintf(errstr,"Cannot read frametime sent from TK\n");
  949. return(DATA_ERROR);
  950. }
  951. dz->frametime = (float)dummy;
  952. break;
  953. case(INPUT_WINDOW_SIZE+4):
  954. if(sscanf(argv[cnt],"%f",&dz->infile->window_size)!=1) {
  955. sprintf(errstr,"Cannot read window_size sent from TK\n");
  956. return(DATA_ERROR);
  957. }
  958. break;
  959. case(INPUT_NYQUIST+4):
  960. if(sscanf(argv[cnt],"%lf",&dz->nyquist)!=1) {
  961. sprintf(errstr,"Cannot read nyquist sent from TK\n");
  962. return(DATA_ERROR);
  963. }
  964. break;
  965. case(INPUT_DURATION+4):
  966. if(sscanf(argv[cnt],"%lf",&dz->duration)!=1) {
  967. sprintf(errstr,"Cannot read duration sent from TK\n");
  968. return(DATA_ERROR);
  969. }
  970. break;
  971. case(INPUT_MINBRK+4):
  972. if(sscanf(argv[cnt],"%lf",&dz->minbrk)!=1) {
  973. sprintf(errstr,"Cannot read minbrk sent from TK\n");
  974. return(DATA_ERROR);
  975. }
  976. break;
  977. case(INPUT_MAXBRK+4):
  978. if(sscanf(argv[cnt],"%lf",&dz->maxbrk)!=1) {
  979. sprintf(errstr,"Cannot read maxbrk sent from TK\n");
  980. return(DATA_ERROR);
  981. }
  982. break;
  983. case(INPUT_MINNUM+4):
  984. if(sscanf(argv[cnt],"%lf",&dz->minnum)!=1) {
  985. sprintf(errstr,"Cannot read minnum sent from TK\n");
  986. return(DATA_ERROR);
  987. }
  988. break;
  989. case(INPUT_MAXNUM+4):
  990. if(sscanf(argv[cnt],"%lf",&dz->maxnum)!=1) {
  991. sprintf(errstr,"Cannot read maxnum sent from TK\n");
  992. return(DATA_ERROR);
  993. }
  994. break;
  995. default:
  996. sprintf(errstr,"case switch item missing: parse_sloom_data()\n");
  997. return(PROGRAM_ERROR);
  998. }
  999. cnt++;
  1000. }
  1001. if(cnt!=PRE_CMDLINE_DATACNT+1) {
  1002. sprintf(errstr,"Insufficient pre-cmdline params sent from TK\n");
  1003. return(DATA_ERROR);
  1004. }
  1005. if(true_cnt)
  1006. cnt = true_cnt;
  1007. *cmdlinecnt = 0;
  1008. while(cnt < argc) {
  1009. if((exit_status = get_tk_cmdline_word(cmdlinecnt,cmdline,argv[cnt]))<0)
  1010. return(exit_status);
  1011. cnt++;
  1012. }
  1013. return(FINISHED);
  1014. }
  1015. /********************************* GET_TK_CMDLINE_WORD *********************************/
  1016. int get_tk_cmdline_word(int *cmdlinecnt,char ***cmdline,char *q)
  1017. {
  1018. if(*cmdlinecnt==0) {
  1019. if((*cmdline = (char **)malloc(sizeof(char *)))==NULL) {
  1020. sprintf(errstr,"INSUFFICIENT MEMORY for TK cmdline array.\n");
  1021. return(MEMORY_ERROR);
  1022. }
  1023. } else {
  1024. if((*cmdline = (char **)realloc(*cmdline,((*cmdlinecnt)+1) * sizeof(char *)))==NULL) {
  1025. sprintf(errstr,"INSUFFICIENT MEMORY for TK cmdline array.\n");
  1026. return(MEMORY_ERROR);
  1027. }
  1028. }
  1029. if(((*cmdline)[*cmdlinecnt] = (char *)malloc((strlen(q) + 1) * sizeof(char)))==NULL) {
  1030. sprintf(errstr,"INSUFFICIENT MEMORY for TK cmdline item %d.\n",(*cmdlinecnt)+1);
  1031. return(MEMORY_ERROR);
  1032. }
  1033. strcpy((*cmdline)[*cmdlinecnt],q);
  1034. (*cmdlinecnt)++;
  1035. return(FINISHED);
  1036. }
  1037. /****************************** ASSIGN_FILE_DATA_STORAGE *********************************/
  1038. int assign_file_data_storage(int infilecnt,dataptr dz)
  1039. {
  1040. int exit_status;
  1041. int no_sndfile_system_files = FALSE;
  1042. dz->infilecnt = infilecnt;
  1043. if((exit_status = allocate_filespace(dz))<0)
  1044. return(exit_status);
  1045. if(no_sndfile_system_files)
  1046. dz->infilecnt = 0;
  1047. return(FINISHED);
  1048. }
  1049. /************************* redundant functions: to ensure libs compile OK *******************/
  1050. int assign_process_logic(dataptr dz)
  1051. {
  1052. return(FINISHED);
  1053. }
  1054. void set_legal_infile_structure(dataptr dz)
  1055. {}
  1056. int set_legal_internalparam_structure(int process,int mode,aplptr ap)
  1057. {
  1058. return(FINISHED);
  1059. }
  1060. int setup_internal_arrays_and_array_pointers(dataptr dz)
  1061. {
  1062. return(FINISHED);
  1063. }
  1064. int establish_bufptrs_and_extra_buffers(dataptr dz)
  1065. {
  1066. return(FINISHED);
  1067. }
  1068. int read_special_data(char *str,dataptr dz)
  1069. {
  1070. return(FINISHED);
  1071. }
  1072. int inner_loop
  1073. (int *peakscore,int *descnt,int *in_start_portion,int *least,int *pitchcnt,int windows_in_buf,dataptr dz)
  1074. {
  1075. return(FINISHED);
  1076. }
  1077. int get_process_no(char *prog_identifier_from_cmdline,dataptr dz)
  1078. {
  1079. return(FINISHED);
  1080. }
  1081. /******************************** USAGE1 ********************************/
  1082. int usage1(void)
  1083. {
  1084. usage2("synth");
  1085. return(USAGE_ONLY);
  1086. }
  1087. /********************************************************************************************/
  1088. int get_the_process_no(char *prog_identifier_from_cmdline,dataptr dz)
  1089. {
  1090. if(!strcmp(prog_identifier_from_cmdline,"synth")) dz->process = MULTISYN;
  1091. else {
  1092. fprintf(stderr,"Unknown program identification string '%s'\n",prog_identifier_from_cmdline);
  1093. return(USAGE_ONLY);
  1094. }
  1095. return(FINISHED);
  1096. }
  1097. /******************************** SETUP_AND_INIT_INPUT_BRKTABLE_CONSTANTS ********************************/
  1098. int setup_and_init_input_brktable_constants(dataptr dz,int brkcnt)
  1099. {
  1100. int n;
  1101. if((dz->brk = (double **)malloc(brkcnt * sizeof(double *)))==NULL) {
  1102. sprintf(errstr,"setup_and_init_input_brktable_constants(): 1\n");
  1103. return(MEMORY_ERROR);
  1104. }
  1105. if((dz->brkptr = (double **)malloc(brkcnt * sizeof(double *)))==NULL) {
  1106. sprintf(errstr,"setup_and_init_input_brktable_constants(): 6\n");
  1107. return(MEMORY_ERROR);
  1108. }
  1109. if((dz->brksize = (int *)malloc(brkcnt * sizeof(int)))==NULL) {
  1110. sprintf(errstr,"setup_and_init_input_brktable_constants(): 2\n");
  1111. return(MEMORY_ERROR);
  1112. }
  1113. if((dz->firstval = (double *)malloc(brkcnt * sizeof(double)))==NULL) {
  1114. sprintf(errstr,"setup_and_init_input_brktable_constants(): 3\n");
  1115. return(MEMORY_ERROR);
  1116. }
  1117. if((dz->lastind = (double *)malloc(brkcnt * sizeof(double)))==NULL) {
  1118. sprintf(errstr,"setup_and_init_input_brktable_constants(): 4\n");
  1119. return(MEMORY_ERROR);
  1120. }
  1121. if((dz->lastval = (double *)malloc(brkcnt * sizeof(double)))==NULL) {
  1122. sprintf(errstr,"setup_and_init_input_brktable_constants(): 5\n");
  1123. return(MEMORY_ERROR);
  1124. }
  1125. if((dz->brkinit = (int *)malloc(brkcnt * sizeof(int)))==NULL) {
  1126. sprintf(errstr,"setup_and_init_input_brktable_constants(): 7\n");
  1127. return(MEMORY_ERROR);
  1128. }
  1129. for(n=0;n<brkcnt;n++) {
  1130. dz->brk[n] = NULL;
  1131. dz->brkptr[n] = NULL;
  1132. dz->brkinit[n] = 0;
  1133. dz->brksize[n] = 0;
  1134. }
  1135. return(FINISHED);
  1136. }
  1137. /******************************** USAGE2 ********************************/
  1138. int usage2(char *str)
  1139. {
  1140. if(!strcmp(str,"synth")) {
  1141. fprintf(stderr,
  1142. "USAGE:\n"
  1143. "multisynth synth outfile score MM [-jjitter] [-oochans] [-b]\n"
  1144. "\n"
  1145. "Synthesize several sound-streams from a score.\n"
  1146. "\n"
  1147. "SCORE Text file with each line in the form:.\n"
  1148. " \"Insname\" followed by any number of sets-of-4-values representing\n"
  1149. " \"Time\" \"Pitch\" \"Loudness\" and \"Duration\".\n"
  1150. " e.g. (with two 4-sets) \"trumpet 0 62 .7 2 8 64 .9 12\"\n"
  1151. "\n"
  1152. "Insname name of instrument: one of the following.\n"
  1153. " \"flute\" \"clarinet\" \"trumpet\" \"violin\" \"cello\"\n"
  1154. " \"pianoRH\" \"pianoLH\" (LH must immediately follow RH in score file).\n"
  1155. "\n"
  1156. "Time Note onset time, measured in thirds-of-semiquavers from time 0 (integer).\n"
  1157. " \"Cello\" & \"violin\" & and \"piano\" (LH and RH)\n"
  1158. " may play up to 4 different notes simultaneously,\n"
  1159. " so long as the note-combinations are possible on the real instrument.\n"
  1160. "\n"
  1161. "Pitch Pitch of the note, as a MIDI value (integer).\n"
  1162. "Loudness A positive number no bigger than 1.\n"
  1163. "Duration Duration of the note, measured in thirds-of-semiquavers (integer).\n"
  1164. " \"Piano\" notes may overlay one another (sustained resonance)\n"
  1165. " but other instruments may not, so their duration values must not\n"
  1166. " create a note sustained beyond the start of the following note.\n"
  1167. " Simultaneously sounding notes must have the same duration.\n"
  1168. "\n"
  1169. "MM Metronome mark determining tempo of sound output.\n"
  1170. "JITTER Max random divergence from regular note placement in mS (default 15).\n"
  1171. "OCHANS Number of output channels (2-8): default stereo.\n"
  1172. " The sounds in successive lines will be spaced in the output-space\n"
  1173. " from line-1, at the far left, to the last-line, at far right.\n"
  1174. " (single-line score output will be placed at front centre).\n"
  1175. "\n"
  1176. "-b If \"ochans\" is greater than stereo, lspkr array assumed to be surround.\n"
  1177. " To force a bounded array (with a left extreme and right extreme)\n"
  1178. " use the \"-b\" flag.\n"
  1179. " For surround, outputs numbered in order clockwise from front-centre.\n"
  1180. " For bounded, outputs numbered in order from far-left to far-right.\n"
  1181. "\n");
  1182. } else
  1183. fprintf(stdout,"Unknown option '%s'\n",str);
  1184. return(USAGE_ONLY);
  1185. }
  1186. int usage3(char *str1,char *str2)
  1187. {
  1188. fprintf(stderr,"Insufficient parameters on command line.\n");
  1189. return(USAGE_ONLY);
  1190. }
  1191. /**************************** SYNTHESIS_PARAM_PREPROCESS *************************/
  1192. int synthesis_param_preprocess (dataptr dz)
  1193. {
  1194. dz->infile->channels = dz->iparam[MS_OCHANS];
  1195. dz->infile->srate = MSYNSRATE;
  1196. dz->nyquist = (double)MSYNSRATE/2.0;
  1197. // Duration of thirds of semiquavers
  1198. dz->timeconvert = (60.0/dz->param[MS_MM])/12.0;
  1199. dz->param[MS_MAXJIT] *= MS_TO_SECS;
  1200. return(FINISHED);
  1201. }
  1202. /******************************** SCORE_SYNTHESIS *********************************/
  1203. #define LEFT 0
  1204. #define RITE 1
  1205. int score_synthesis(int inlinecnt,double onehzincr,synptr *orchestra,int flt_cnt,double flt_mul,dataptr dz)
  1206. {
  1207. int exit_status, linecnt, m, typ, instrno, notecnt, pos, envlen, outchans = dz->iparam[MS_OCHANS], leftchan, ritechan, packet_type;
  1208. double *data, *env = dz->parray[dz->ins_envel], *ochanpos = dz->parray[dz->ochan_pos];
  1209. double srate = (double)MSYNSRATE, normaliser = 0.0, synth_ctr = 1.0, synth_sqz = 0.0, changain[2], jitter;
  1210. double time, frq = 0.0, levl = 1.0, dur = 0.0, maxval;
  1211. float *obuf = dz->sampbuf[0], *notebuf = dz->sampbuf[1];
  1212. unsigned int startsamp = 0, totaloutsamps = 0, outsampcnt;
  1213. int notesamps = 0, sampcnt, n;
  1214. synptr instrument;
  1215. memset((char *)obuf,0,dz->buflen * sizeof(float));
  1216. if(!sloom)
  1217. fprintf(stdout,"INFO: First Score-pass. ");
  1218. for(linecnt = 0, pos = 0; linecnt < inlinecnt; linecnt++,pos +=3) {
  1219. leftchan = (int)round(ochanpos[pos]);
  1220. ritechan = (leftchan + 1) % outchans;
  1221. changain[LEFT] = ochanpos[pos+1];
  1222. changain[RITE] = ochanpos[pos+2];
  1223. notecnt = 0;
  1224. data = dz->parray[dz->scoredata + linecnt];
  1225. instrno = (int)round(data[INS_NO]);
  1226. instrument = orchestra[instrno]; // Point to relevant instrument-structure
  1227. data++; // Move into note data
  1228. if((exit_status = setup_the_special_data_for_given_instr(instrno,data,instrument,dz))<0)
  1229. return(exit_status);
  1230. packet_type = instrument->packettype;
  1231. if(packet_type) {
  1232. synth_sqz = instrument->squeeze; // Centring of peak of packet envelope.
  1233. synth_ctr = instrument->centre; // Narrowing of packet envelope.
  1234. if((exit_status = modify_packet_envelope(synth_ctr,synth_sqz,dz))<0)
  1235. return(exit_status);
  1236. }
  1237. m = 0;
  1238. while(data[m] >= 0) {
  1239. typ = m % 4;
  1240. switch(typ) {
  1241. case(NOTE_TIME):
  1242. time = data[m] * dz->timeconvert;
  1243. if(time > 0.0 && dz->param[MS_MAXJIT] > 0.0) {
  1244. jitter = drand48() * 2.0;
  1245. jitter -= 1.0;
  1246. jitter *= dz->param[MS_MAXJIT];
  1247. time += jitter;
  1248. time = max(time,0.0);
  1249. }
  1250. startsamp = (int)round(time * srate) * outchans; // Position of note in total output
  1251. break;
  1252. case(NOTE_PICH):
  1253. frq = miditohz(data[m]);
  1254. break;
  1255. case(NOTE_LEVL):
  1256. levl = data[m];
  1257. break;
  1258. case(NOTE_DUR):
  1259. dur = data[m] * dz->timeconvert;
  1260. if(instrument->overlap) // If "overlap" allow note to decay completely
  1261. dur = max(dur,instrument->env[instrument->env_len - 2]);
  1262. notesamps = (int)round(dur * srate); // Length of note in (MONO) note-synth buf
  1263. break;
  1264. }
  1265. m++;
  1266. if(m%4 == 0) { // Once a whole note-data-set (4 items) is gathered
  1267. notecnt++;
  1268. envlen = instrument->env_len; // (envlen modifiable later, if note is very short)
  1269. if(instrument->has_vibrato)
  1270. generate_vibrato_curves(instrument->maxvibdepth,dur,dz);
  1271. for(n=0;n < envlen;n++) // copy complete instrument envelope template into note-envelope array
  1272. env[n] = instrument->env[n]; // Get note envelope (this will be modified when true duration of note is known)
  1273. if((exit_status = note_synthesis(notesamps,frq,levl,onehzincr,linecnt,notecnt,envlen,&sampcnt,instrument,instrno,flt_cnt,flt_mul,dz))<0)
  1274. return(exit_status);
  1275. for(n = 0,outsampcnt = startsamp;n < sampcnt;n++,outsampcnt+=outchans) {
  1276. obuf[outsampcnt+leftchan] = (float)(obuf[outsampcnt+leftchan] + (notebuf[n] * levl * changain[LEFT]));
  1277. obuf[outsampcnt+ritechan] = (float)(obuf[outsampcnt+ritechan] + (notebuf[n] * levl * changain[RITE]));
  1278. }
  1279. totaloutsamps = max(totaloutsamps,outsampcnt);
  1280. }
  1281. }
  1282. }
  1283. maxval = 0.0;
  1284. for(outsampcnt=0;outsampcnt<totaloutsamps;outsampcnt++)
  1285. maxval = max(maxval,fabs(obuf[outsampcnt]));
  1286. normaliser = 0.95/maxval;
  1287. if(!sloom) {
  1288. fprintf(stdout,"\nNormalising output.\n");
  1289. fflush(stdout);
  1290. }
  1291. for(outsampcnt=0;outsampcnt<totaloutsamps;outsampcnt++)
  1292. obuf[outsampcnt] = (float)(obuf[outsampcnt] * normaliser);
  1293. if((exit_status = write_samps(obuf,totaloutsamps,dz))<0)
  1294. return(exit_status);
  1295. return FINISHED;
  1296. }
  1297. /******************************** NOTE_SYNTHESIS *********************************/
  1298. int note_synthesis(int totaloutsamps,double frq,double levl,double onehzincr,int linecnt,int notecnt,int envlen,int *sampcnt,synptr instrument,int instrno,
  1299. int flt_cnt,double flt_mul,dataptr dz)
  1300. {
  1301. int exit_status, n;
  1302. int loindex, hiindex, packet_dur = 0, kk, total_outsamps;
  1303. double loval, hival, valdiff, timefrac, val, level, maxval = 0.0, packet_incr = 0, envv, passfrq, stopfrq;
  1304. float *obuf = dz->sampbuf[1], *obuf2 = dz->sampbuf[2];
  1305. double srate = (double)dz->infile->srate;
  1306. double *sintab = dz->parray[dz->sinarray], *sinptr = dz->parray[dz->pntarray], *notenv = dz->parray[dz->ins_envel];
  1307. double time = 0.0, normaliser, partialfrq = HUGE;
  1308. int packet_phase = 1, partialcnt;
  1309. int init, packet_type;
  1310. packet_type = instrument->packettype;
  1311. if(packet_type) {
  1312. packet_dur = (int)round((1.0/frq) * srate);
  1313. packet_incr = (double)TREMOLO_TABSIZE/(double)(packet_dur - 1); // Forces last read to be at end of packet envelope (zero)
  1314. }
  1315. if(!sloom)
  1316. fprintf(stdout,"*");
  1317. *sampcnt = 0;
  1318. init = 1;
  1319. memset((char *)obuf,0,dz->max_notedur * sizeof(float));
  1320. memset((char *)obuf2,0,dz->max_notedur * sizeof(float));
  1321. for(n=0;n<instrument->partial_cnt;n++) {
  1322. partialfrq = frq * dz->parray[n][1]; // Get initial partial-frq
  1323. if(partialfrq >= dz->nyquist) // Ignore any partials beyond the nyquist
  1324. break;
  1325. }
  1326. partialcnt = n;
  1327. if(packet_type) {
  1328. while(*sampcnt < totaloutsamps) {
  1329. for(n=0;n<partialcnt;n++)
  1330. sinptr[n] = 0.0;
  1331. for(kk = 0; kk<packet_dur;kk++) {
  1332. time = (double)(*sampcnt)/srate;
  1333. for(n=0;n<partialcnt;n++) {
  1334. loindex = (int)floor(sinptr[n]);
  1335. hiindex = loindex + 1;
  1336. loval = sintab[loindex];
  1337. hival = sintab[hiindex];
  1338. valdiff = hival - loval;
  1339. timefrac = sinptr[n] - (double)loindex;
  1340. val = loval + (valdiff * timefrac);
  1341. level = read_level(n,time,dz);
  1342. val *= level;
  1343. obuf[*sampcnt] = (float)(obuf[*sampcnt] + val);
  1344. incr_sinptr(n,time,onehzincr,frq,&partialfrq,dz);
  1345. }
  1346. envv = read_packet_envelope(kk,packet_incr,dz);
  1347. obuf[*sampcnt] = (float)(obuf[*sampcnt] * envv * packet_phase);
  1348. (*sampcnt)++;
  1349. }
  1350. if(instrument->has_vibrato)
  1351. add_packet_vibrato(&init,onehzincr,srate,sampcnt,packet_dur,dz);
  1352. packet_phase = -packet_phase;
  1353. }
  1354. for(kk=0;kk<*sampcnt;kk++)
  1355. maxval = max(maxval,fabs(obuf[kk]));
  1356. } else {
  1357. for(n=0;n<partialcnt;n++)
  1358. sinptr[n] = 0.0;
  1359. if(instrument->has_vibrato)
  1360. total_outsamps = (int)round(totaloutsamps * VIBSHIFT); // Generate more than required, to allow for vibrato
  1361. else
  1362. total_outsamps = totaloutsamps;
  1363. for(kk = 0; kk<total_outsamps;kk++) {
  1364. time = (double)kk/srate;
  1365. for(n=0;n<partialcnt;n++) {
  1366. loindex = (int)floor(sinptr[n]);
  1367. hiindex = loindex + 1;
  1368. loval = sintab[loindex];
  1369. hival = sintab[hiindex];
  1370. valdiff = hival - loval;
  1371. timefrac = sinptr[n] - (double)loindex;
  1372. val = loval + (valdiff * timefrac);
  1373. level = read_level(n,time,dz);
  1374. val *= level;
  1375. obuf[kk] = (float)(obuf[kk] + val);
  1376. incr_sinptr(n,time,onehzincr,frq,&partialfrq,dz);
  1377. }
  1378. }
  1379. if(instrument->has_vibrato)
  1380. add_vibrato(onehzincr,srate,totaloutsamps,obuf,obuf2,dz);
  1381. if(instrno == FLUTE) {
  1382. passfrq = FLUTE_PASSFRQ;
  1383. stopfrq = FLUTE_STOPFRQ;
  1384. if((exit_status = msetup_lphp_filter(&flt_cnt,&flt_mul,passfrq,stopfrq,dz))<0)
  1385. return exit_status;
  1386. if((exit_status = mdo_lphp_filter(totaloutsamps,flt_cnt,flt_mul,dz))<0)
  1387. return exit_status;
  1388. if((exit_status = mdo_lphp_filter(totaloutsamps,flt_cnt,flt_mul,dz))<0)
  1389. return exit_status;
  1390. }
  1391. for(kk=0;kk<total_outsamps;kk++)
  1392. maxval = max(maxval,fabs(obuf[kk]));
  1393. }
  1394. packet_phase = 1;
  1395. normaliser = levl/maxval;
  1396. time = 0.0;
  1397. *sampcnt = 0;
  1398. if(!sloom)
  1399. fprintf(stdout,"*");
  1400. memset((char *)obuf,0,dz->max_notedur * sizeof(float));
  1401. memset((char *)obuf2,0,dz->max_notedur * sizeof(float));
  1402. init = 1;
  1403. if(packet_type) {
  1404. while(*sampcnt < totaloutsamps) {
  1405. for(n=0;n<partialcnt;n++) // Zero sine-table pointers for all partials, at start of packet
  1406. sinptr[n] = 0.0;
  1407. for(kk = 0; kk<packet_dur;kk++) {
  1408. time = (double)(*sampcnt)/srate;
  1409. for(n=0;n<partialcnt;n++) {
  1410. loindex = (int)floor(sinptr[n]); // Read from sintable, using partial-increment, for each partial
  1411. hiindex = loindex + 1;
  1412. loval = sintab[loindex];
  1413. hival = sintab[hiindex];
  1414. valdiff = hival - loval;
  1415. timefrac = sinptr[n] - (double)loindex;
  1416. val = loval + (valdiff * timefrac);
  1417. level = read_level(n,time,dz); // Read corresponding level
  1418. val *= level;
  1419. obuf[*sampcnt] = (float)(obuf[*sampcnt] + val);
  1420. incr_sinptr(n,time,onehzincr,frq,&partialfrq,dz); // Track (modify if ness) the partial-incr value for this partial
  1421. }
  1422. // Once all partial-samples added, impose packet envelope
  1423. envv = read_packet_envelope(kk,packet_incr,dz);
  1424. obuf[*sampcnt] = (float)(obuf[*sampcnt] * envv * normaliser * packet_phase);
  1425. (*sampcnt)++;
  1426. }
  1427. if(instrument->has_vibrato)
  1428. add_packet_vibrato(&init,onehzincr,srate,sampcnt,packet_dur,dz);
  1429. packet_phase = -packet_phase;
  1430. }
  1431. } else {
  1432. for(n=0;n<partialcnt;n++)
  1433. sinptr[n] = 0.0;
  1434. if(instrument->has_vibrato)
  1435. total_outsamps = (int)round(totaloutsamps * VIBSHIFT); // Generate more than required, to allow for vibrato
  1436. else
  1437. total_outsamps = totaloutsamps;
  1438. for(kk = 0; kk<total_outsamps;kk++) {
  1439. time = (double)kk/srate;
  1440. for(n=0;n<partialcnt;n++) {
  1441. loindex = (int)floor(sinptr[n]);
  1442. hiindex = loindex + 1;
  1443. loval = sintab[loindex];
  1444. hival = sintab[hiindex];
  1445. valdiff = hival - loval;
  1446. timefrac = sinptr[n] - (double)loindex;
  1447. val = loval + (valdiff * timefrac);
  1448. level = read_level(n,time,dz);
  1449. val *= level;
  1450. obuf[kk] = (float)(obuf[kk] + val);
  1451. incr_sinptr(n,time,onehzincr,frq,&partialfrq,dz);
  1452. }
  1453. obuf[kk] = (float)(obuf[kk] * normaliser);
  1454. }
  1455. if(instrument->has_vibrato)
  1456. add_vibrato(onehzincr,srate,totaloutsamps,obuf,obuf2,dz);
  1457. if(instrno == FLUTE) {
  1458. if((exit_status = mdo_lphp_filter(totaloutsamps,flt_cnt,flt_mul,dz))<0)
  1459. return exit_status;
  1460. if((exit_status = mdo_lphp_filter(totaloutsamps,flt_cnt,flt_mul,dz))<0)
  1461. return exit_status;
  1462. }
  1463. *sampcnt = totaloutsamps;
  1464. }
  1465. if((exit_status = impose_note_envelope(obuf,notenv,envlen,totaloutsamps,linecnt,notecnt,instrument,dz))<0)
  1466. return exit_status;
  1467. return FINISHED;
  1468. }
  1469. /**************************** IMPOSE_NOTE_ENVELOPE ****************************/
  1470. int impose_note_envelope(float *obuf,double *notenv,int envlen,int sampcnt,int linecnt,int notecnt,synptr instrument,dataptr dz)
  1471. {
  1472. double time, srate = (double)MSYNSRATE, envval, dur, fade, endenvtime;
  1473. int n;
  1474. int envnext = 2;
  1475. double thistime, thisval, nexttime, nextval, timediff, valdiff, tratio;
  1476. endenvtime = instrument->env[instrument->env_len-2];
  1477. thistime = notenv[0];
  1478. thisval = notenv[1];
  1479. nexttime = notenv[2],
  1480. nextval = notenv[3];
  1481. timediff = nexttime - thistime;
  1482. valdiff = nextval - thisval;
  1483. dur = (double)sampcnt/srate;
  1484. if(instrument->overlap)
  1485. // Ensure (post-vibrato) duration of note does not spill over end of envelope data
  1486. dur = min(endenvtime,dur);
  1487. else {
  1488. // Curtail or extend prototype instr envelope to (post-vibrato) duration of note
  1489. if(envlen == 12) { // rise, on, down, hold,off
  1490. fade = notenv[10] - notenv[8];
  1491. if(dur > notenv[6] + fade) { // x x
  1492. notenv[10] = dur; // x <-x->
  1493. notenv[8] = dur - fade; // x <-x->
  1494. } else if(dur > notenv[6]) {
  1495. notenv[6] = dur; // x x
  1496. notenv[7] = 0.0; // envlen NOW = 8
  1497. // x x
  1498. } else if(dur > notenv[4]) {
  1499. notenv[4] = dur; // x
  1500. notenv[5] = 0.0; // envlen NOW = 6
  1501. // x x
  1502. } else {
  1503. sprintf(errstr,"Note too short in line %d : note %d\n",linecnt+1,notecnt);
  1504. return DATA_ERROR;
  1505. }
  1506. } else { // rise, on, down, decay
  1507. if(dur > notenv[6]) { // x x
  1508. notenv[8] = dur; // x
  1509. // x <-x->
  1510. } else if(dur > notenv[4]) {
  1511. notenv[4] = dur; // x
  1512. notenv[5] = 0.0; // envlen NOW = 6
  1513. // x x
  1514. } else {
  1515. sprintf(errstr,"Note too short in line %d : note %d\n",linecnt+1,notecnt);
  1516. return DATA_ERROR;
  1517. }
  1518. }
  1519. }
  1520. for(n=0;n<sampcnt;n++) {
  1521. time = (double)n/srate;
  1522. if(time == 0.0 || time >= dur)
  1523. envval = 0.0;
  1524. else {
  1525. while (nexttime <= time) {
  1526. thistime = nexttime;
  1527. thisval = nextval;
  1528. envnext += 2;
  1529. nexttime = notenv[envnext];
  1530. nextval = notenv[envnext+1];
  1531. timediff = nexttime - thistime;
  1532. valdiff = nextval - thisval;
  1533. }
  1534. tratio = (time - thistime)/timediff;
  1535. envval = (valdiff * tratio) + thisval;
  1536. }
  1537. obuf[n] = (float)(obuf[n] * envval * instrument->balance);
  1538. }
  1539. memset((char *)(obuf + sampcnt),0,(dz->max_notedur - sampcnt) * sizeof(float));
  1540. return FINISHED;
  1541. }
  1542. /**************************** INCR_SINPTR ****************************/
  1543. void incr_sinptr(int n,double time,double onehzincr,double frq,double *partialfrq,dataptr dz)
  1544. {
  1545. int m;
  1546. double hival, loval, hitime, lotime, timediff, timefrac, valdiff, partialval, thisincr;
  1547. double *sinptr = dz->parray[dz->pntarray];
  1548. double *thispartial = dz->parray[n];
  1549. m = 0;
  1550. while(thispartial[m] < time) {
  1551. m += 2;
  1552. if(m >= dz->partialtabs_cnt)
  1553. break;
  1554. }
  1555. if(m==0)
  1556. partialval = thispartial[1];
  1557. else if(m < dz->partialtabs_cnt) {
  1558. hival = thispartial[m+1];
  1559. loval = thispartial[m-1];
  1560. hitime = thispartial[m];
  1561. lotime = thispartial[m-2];
  1562. timediff = hitime - lotime;
  1563. timefrac = (time - lotime)/timediff;
  1564. valdiff = hival - loval;
  1565. partialval = loval + (valdiff * timefrac);
  1566. } else
  1567. partialval = thispartial[dz->partialtabs_cnt-1];
  1568. // Convert partial numbers to table-increments
  1569. thisincr = partialval * onehzincr;
  1570. thisincr *= frq;
  1571. sinptr[n] += thisincr;
  1572. if(sinptr[n] >= SYNTH_TABSIZE)
  1573. sinptr[n] -= (double)SYNTH_TABSIZE;
  1574. }
  1575. /**************************** READ_LEVEL ****************************/
  1576. double read_level(int n,double time,dataptr dz)
  1577. {
  1578. int m;
  1579. double hival, loval, hitime, lotime, timediff, timefrac, valdiff, level;
  1580. double *thislevel = dz->parray[n + MAXPARTIALS];
  1581. m = 0;
  1582. while(thislevel[m] < time) {
  1583. m += 2;
  1584. if(m >= dz->partialtabs_cnt)
  1585. break;
  1586. }
  1587. if(m==0) {
  1588. level = thislevel[1];
  1589. } else if(m < dz->partialtabs_cnt) {
  1590. hival = thislevel[m+1];
  1591. loval = thislevel[m-1];
  1592. hitime = thislevel[m];
  1593. lotime = thislevel[m-2];
  1594. timediff = hitime - lotime;
  1595. timefrac = (time - lotime)/timediff;
  1596. valdiff = hival - loval;
  1597. level = loval + (valdiff * timefrac);
  1598. } else {
  1599. level = thislevel[dz->partialtabs_cnt-1];
  1600. }
  1601. return level;
  1602. }
  1603. /**************************** CREATE_SYNTHESIZER_SNDBUFS ****************************/
  1604. int create_synthesizer_sndbufs(dataptr dz)
  1605. {
  1606. unsigned int bigbufsize;
  1607. int framesize, segsize;
  1608. int safety = (int)(dz->param[MS_MAXJIT] * dz->infile->srate) * dz->infile->channels;
  1609. dz->bufcnt = 3;
  1610. framesize = F_SECSIZE * dz->infile->channels;
  1611. if((dz->sampbuf = (float **)malloc(sizeof(float *) * (dz->bufcnt+1)))==NULL) {
  1612. sprintf(errstr,"INSUFFICIENT MEMORY establishing sample buffers.\n");
  1613. return(MEMORY_ERROR);
  1614. }
  1615. if((dz->sbufptr = (float **)malloc(sizeof(float *) * dz->bufcnt))==NULL) {
  1616. sprintf(errstr,"INSUFFICIENT MEMORY establishing sample buffer pointers.\n");
  1617. return(MEMORY_ERROR);
  1618. }
  1619. dz->buflen = dz->maxoutsamp + dz->max_notedur + safety; // Allow for jitter and vibrato
  1620. segsize = dz->buflen / framesize;
  1621. if(segsize * framesize < dz->buflen)
  1622. segsize++;
  1623. dz->buflen = segsize * framesize;
  1624. bigbufsize = (dz->buflen + (2 * dz->max_notedur)) * sizeof(float);
  1625. if((dz->bigbuf = (float *)malloc(bigbufsize)) == NULL) {
  1626. sprintf(errstr,"INSUFFICIENT MEMORY to create sound buffers.\n");
  1627. return(PROGRAM_ERROR);
  1628. }
  1629. dz->sbufptr[0] = dz->sampbuf[0] = dz->bigbuf; // Whole output sound
  1630. dz->sbufptr[1] = dz->sampbuf[1] = dz->sampbuf[0] + dz->buflen; // Output note
  1631. dz->sbufptr[2] = dz->sampbuf[2] = dz->sampbuf[1] + dz->max_notedur; // Any vibrato transform of output note
  1632. dz->sampbuf[3] = dz->sampbuf[2] + dz->max_notedur;
  1633. return(FINISHED);
  1634. }
  1635. /**************************** GENERATE_PACKET_ENVELOPE *************************/
  1636. int generate_packet_envelope (dataptr dz)
  1637. {
  1638. int n;
  1639. double *costab, *origtab;
  1640. if((dz->parray[dz->pakt_env] = (double *)malloc((TREMOLO_TABSIZE + 1) * sizeof(double)))==NULL) {
  1641. sprintf(errstr,"INSUFFICIENT MEMORY for sine table.\n");
  1642. return(MEMORY_ERROR);
  1643. }
  1644. costab = dz->parray[dz->pakt_env];
  1645. if((dz->parray[dz->temp_tab] = (double *)malloc((TREMOLO_TABSIZE + 1) * sizeof(double)))==NULL) {
  1646. sprintf(errstr,"INSUFFICIENT MEMORY for sine table.\n");
  1647. return(MEMORY_ERROR);
  1648. }
  1649. if((dz->parray[dz->orig_tab] = (double *)malloc((TREMOLO_TABSIZE + 1) * sizeof(double)))==NULL) {
  1650. sprintf(errstr,"INSUFFICIENT MEMORY for sine table.\n");
  1651. return(MEMORY_ERROR);
  1652. }
  1653. origtab = dz->parray[dz->orig_tab];
  1654. for(n=0;n<TREMOLO_TABSIZE;n++) {
  1655. costab[n] = cos(PI * 2.0 * ((double)n/(double)TREMOLO_TABSIZE));
  1656. costab[n] += 1.0;
  1657. costab[n] /= 2.0;
  1658. costab[n] = 1.0 - costab[n];
  1659. origtab[n] = costab[n];
  1660. }
  1661. costab[n] = 0.0; /* wrap around point */
  1662. origtab[n] = 0.0; /* wrap around point */
  1663. return(FINISHED);
  1664. }
  1665. /**************************** MODIFY_PACKET_ENVELOPE *************************/
  1666. int modify_packet_envelope (double synth_ctr,double synth_sqz,dataptr dz)
  1667. {
  1668. int n, halftabsize = TREMOLO_TABSIZE/2;
  1669. int isneg = 0, tablopos, tabhipos;
  1670. double *costab, *temptab, *origtab, diff, tabrem, tabincr, lotabincr, hitabincr, readpos, frac;
  1671. costab = dz->parray[dz->pakt_env];
  1672. temptab = dz->parray[dz->temp_tab];
  1673. origtab = dz->parray[dz->orig_tab];
  1674. if(flteq(synth_sqz,1.0)) {
  1675. for(n=0;n<=TREMOLO_TABSIZE;n++)
  1676. temptab[n] = origtab[n];
  1677. } else {
  1678. for(n=0;n<=TREMOLO_TABSIZE;n++)
  1679. temptab[n] = pow(origtab[n],synth_sqz);
  1680. }
  1681. if(flteq(synth_ctr,1.0)) {
  1682. for(n=0;n<=TREMOLO_TABSIZE;n++)
  1683. costab[n] = temptab[n];
  1684. } else {
  1685. if(synth_ctr < 0.0) {
  1686. frac = 1.0 + synth_ctr;
  1687. isneg = 1;
  1688. } else
  1689. frac = 1.0 - synth_ctr;
  1690. if(isneg) {
  1691. lotabincr = 1.0/frac;
  1692. hitabincr = 1.0/(2.0 - frac);
  1693. } else {
  1694. lotabincr = 1.0/(2.0 - frac);
  1695. hitabincr = 1.0/frac;
  1696. }
  1697. readpos = 0;
  1698. tabincr = lotabincr;
  1699. for(n=0;n<TREMOLO_TABSIZE;n++) {
  1700. if(readpos >= halftabsize) {
  1701. tabincr = hitabincr;
  1702. }
  1703. tablopos = (int)floor(readpos);
  1704. tabhipos = min(tablopos + 1,TREMOLO_TABSIZE);
  1705. tabrem = readpos - (double)tablopos;
  1706. diff = temptab[tabhipos] - temptab[tablopos];
  1707. costab[n] = temptab[tablopos] + (diff * tabrem);
  1708. readpos += tabincr;
  1709. }
  1710. }
  1711. return(FINISHED);
  1712. }
  1713. /**************************** READ_PACKET_ENVELOPE *************************/
  1714. double read_packet_envelope(int kk,double incr,dataptr dz)
  1715. {
  1716. double *costab, tabpos, tabrem, diff, envv;
  1717. int tablopos, tabhipos;
  1718. costab = dz->parray[dz->pakt_env];
  1719. tabpos = (double)kk * incr;
  1720. tablopos = (int)floor(tabpos);
  1721. tabhipos = min(tablopos + 1,TREMOLO_TABSIZE);
  1722. tabrem = tabpos - (double)tablopos;
  1723. diff = costab[tabhipos] - costab[tablopos];
  1724. envv = costab[tablopos] + (diff * tabrem);
  1725. return envv;
  1726. }
  1727. /**************************** SETUP_THE_DATA_ARRAYS ****************************/
  1728. int setup_the_data_arrays(int inlinecnt,double synth_ctr,double synth_sqz,dataptr dz)
  1729. {
  1730. int exit_status;
  1731. double *sintab;
  1732. int n;
  1733. int zz;
  1734. dz->array_cnt = (MAXPARTIALS * 2) + inlinecnt + 10 + 7;
  1735. // An array for every partial-pno, every partial-level,
  1736. // An array for every input line of data
  1737. // + (0) snd-sintable
  1738. // + (1) sintab-incr-pointers
  1739. // + (2-4) packet envelope + 2 packet-envelope-temp-arrays
  1740. // + (5) storage of instrument-note-spectral_data
  1741. // + (6) storage if instr-note-envelope-data
  1742. // + (7) storage of note-vibrato-depth-curve
  1743. // + (8) storage of note-vibrato-frq-curve
  1744. // + (9) multichan positions of output streams
  1745. // + 7 for filter calculations
  1746. if((dz->parray = (double **)malloc(dz->array_cnt * sizeof(double *)))==NULL) {
  1747. sprintf(errstr,"INSUFFICIENT MEMORY to create partial data arrays.\n");
  1748. return(MEMORY_ERROR);
  1749. }
  1750. for(n=0;n <dz->array_cnt;n++)
  1751. dz->parray[n] = NULL;
  1752. dz->filterbas = dz->array_cnt - 7;
  1753. zz = MAXPARTIALS * 2;
  1754. for(n=0;n <zz;n++) { // 2 entries (time and value) for every line in the data.
  1755. if((dz->parray[n] = (double *)malloc((MAXLINECNT * 2) * sizeof(double)))==NULL) {
  1756. sprintf(errstr,"INSUFFICIENT MEMORY to store partial data.\n");
  1757. return(MEMORY_ERROR);
  1758. }
  1759. }
  1760. dz->scoredata = (MAXPARTIALS * 2);
  1761. dz->sinarray = (MAXPARTIALS * 2) + inlinecnt;
  1762. dz->pntarray = dz->sinarray + 1;
  1763. dz->pakt_env = dz->sinarray + 2;
  1764. dz->temp_tab = dz->sinarray + 3;
  1765. dz->orig_tab = dz->sinarray + 4;
  1766. dz->ins_spectrum = dz->sinarray + 5;
  1767. dz->ins_envel = dz->sinarray + 6;
  1768. dz->ins_vibd = dz->sinarray + 7;
  1769. dz->ins_vibf = dz->sinarray + 8;
  1770. dz->ochan_pos = dz->sinarray + 9;
  1771. // Establish sine-table
  1772. if((dz->parray[dz->sinarray] = (double *)malloc((SYNTH_TABSIZE + 1) * sizeof(double)))==NULL) {
  1773. sprintf(errstr,"INSUFFICIENT MEMORY for sine table.\n");
  1774. return(MEMORY_ERROR);
  1775. }
  1776. sintab = dz->parray[dz->sinarray];
  1777. for(n=0;n<SYNTH_TABSIZE;n++)
  1778. sintab[n] = sin(PI * 2.0 * ((double)n/(double)SYNTH_TABSIZE));
  1779. sintab[n] = sintab[0]; /* wrap around point */
  1780. // Pointers into sintable for all partials, and one for vibrato read
  1781. if((dz->parray[dz->pntarray] = (double *)malloc((MAXPARTIALS+1) * sizeof(double)))==NULL) {
  1782. sprintf(errstr,"INSUFFICIENT MEMORY for sine table.\n");
  1783. return(MEMORY_ERROR);
  1784. }
  1785. if((exit_status = generate_packet_envelope(dz))<0)
  1786. return(exit_status);
  1787. for(n=0;n<=MAXPARTIALS;n++) // Zero sine-table pointers for all partials and for vibrato
  1788. dz->parray[dz->pntarray][n] = 0.0;
  1789. // Max size array for time-changing spectrum of instrument
  1790. if((dz->parray[dz->ins_spectrum] = (double *)malloc(MAXENTRYCNT * sizeof(double)))==NULL) {
  1791. sprintf(errstr,"INSUFFICIENT MEMORY for sine table.\n");
  1792. return(MEMORY_ERROR);
  1793. }
  1794. // Max size array for loudness envelope of instrument
  1795. if((dz->parray[dz->ins_envel] = (double *)malloc((MAXENVPNTS * 2) * sizeof(double)))==NULL) {
  1796. sprintf(errstr,"INSUFFICIENT MEMORY for sine table.\n");
  1797. return(MEMORY_ERROR);
  1798. }
  1799. // Small arrays for vibrato params of notes
  1800. if((dz->parray[dz->ins_vibd] = (double *)malloc(6 * sizeof(double)))==NULL) {
  1801. sprintf(errstr,"INSUFFICIENT MEMORY for sine table.\n");
  1802. return(MEMORY_ERROR);
  1803. }
  1804. if((dz->parray[dz->ins_vibf] = (double *)malloc(6 * sizeof(double)))==NULL) {
  1805. sprintf(errstr,"INSUFFICIENT MEMORY for sine table.\n");
  1806. return(MEMORY_ERROR);
  1807. }
  1808. // Array for multichan output positions (channo of left-chan plus pair of L-R levels) of streams
  1809. if((dz->parray[dz->ochan_pos] = (double *)malloc((MAXSCORLINE * 3) * sizeof(double)))==NULL) {
  1810. sprintf(errstr,"INSUFFICIENT MEMORY for sine table.\n");
  1811. return(MEMORY_ERROR);
  1812. }
  1813. return FINISHED;
  1814. }
  1815. /**************************** GENERATE_VIBRATO_CURVES *************************/
  1816. void generate_vibrato_curves(double maxdepth, double notedur, dataptr dz)
  1817. {
  1818. double *vibdepth = dz->parray[dz->ins_vibd];
  1819. double *vibfrq = dz->parray[dz->ins_vibf];
  1820. double time, depth, frq;
  1821. vibdepth[0] = 0.0;
  1822. vibdepth[1] = 0.0;
  1823. time = drand48() * notedur/2;
  1824. time += notedur/4;
  1825. vibdepth[2] = time;
  1826. depth = drand48() * maxdepth/2;
  1827. depth += maxdepth/2;
  1828. vibdepth[3] = depth;
  1829. vibdepth[4] = notedur;
  1830. vibdepth[5] = 0.0;
  1831. frq = drand48() * 4.0;
  1832. frq += 4.0;
  1833. vibfrq[0] = 0.0;
  1834. vibfrq[1] = frq;
  1835. frq = drand48() * 4.0;
  1836. frq += 4.0;
  1837. vibfrq[2] = time;
  1838. vibfrq[3] = frq;
  1839. frq = drand48() * 4.0;
  1840. frq += 4.0;
  1841. vibfrq[4] = notedur;
  1842. vibfrq[5] = frq;
  1843. }
  1844. /**************************** ADD_VIBRATO *************************/
  1845. int add_vibrato(double onehzincr,double srate,int outsampcnt,float *obuf,float *obuf2,dataptr dz)
  1846. {
  1847. int vibnext = 2;
  1848. double *vib_depth = dz->parray[dz->ins_vibd], obufptr = 0.0;
  1849. double *vib_frq = dz->parray[dz->ins_vibf];
  1850. double *sintab = dz->parray[dz->sinarray];
  1851. static double thistime, thisfrq, thisdepth, nexttime, nextfrq, nextdepth, timediff, depthdiff, frqdiff, endtime;
  1852. double time, vibdepth, vibfrq, timefrac, tratio, val, loval, hival, valdiff, frac;
  1853. int loindex, hiindex, sampcnt, obufi = 0;
  1854. double vib_sinpntr = dz->parray[dz->pntarray][MAXPARTIALS];
  1855. // Initialise variables
  1856. thistime = 0.0;
  1857. thisdepth = vib_depth[1];
  1858. nexttime = vib_depth[2];
  1859. nextdepth = vib_depth[3];
  1860. endtime = vib_depth[4];
  1861. thisfrq = vib_frq[1];
  1862. nextfrq = vib_frq[3];
  1863. depthdiff = nextdepth - thisdepth;
  1864. frqdiff = nextfrq - thisfrq;
  1865. timediff = nexttime - thistime;
  1866. vib_sinpntr = 0.0;
  1867. sampcnt = 0;
  1868. obuf2[sampcnt++] = obuf[0];
  1869. while(sampcnt < outsampcnt) {
  1870. // Write vibratoed value to obuf2
  1871. time = (double)sampcnt/srate;
  1872. obufi = (int)floor(obufptr);
  1873. loval = obuf[obufi];
  1874. hival = obuf[obufi+1];
  1875. valdiff = hival - loval;
  1876. frac = obufptr - obufi;
  1877. val = loval + (valdiff * frac);
  1878. obuf2[sampcnt] = (float)val;
  1879. // Find current frequency and depth of vibrato
  1880. if(time >= endtime) {
  1881. vibdepth = vib_depth[5];
  1882. vibfrq = vib_frq[5];
  1883. } else {
  1884. while (nexttime <= time) {
  1885. thistime = nexttime;
  1886. thisdepth = nextdepth;
  1887. thisfrq = nextfrq;
  1888. vibnext += 2;
  1889. nexttime = vib_depth[vibnext];
  1890. nextdepth = vib_depth[vibnext+1];
  1891. nextfrq = vib_frq[vibnext+1];
  1892. depthdiff = nextdepth - thisdepth;
  1893. frqdiff = nextfrq - thisfrq;
  1894. timediff = nexttime - thistime;
  1895. }
  1896. tratio = (time - thistime)/timediff;
  1897. vibfrq = (frqdiff * tratio) + thisfrq;
  1898. vibdepth = (depthdiff * tratio) + thisdepth;
  1899. }
  1900. // Use current pointer-position for vibrato, in sintable, to read sinusoidal vibrato-divergence
  1901. loindex = (int)floor(vib_sinpntr); // Read from sintable, using vibrato-sinptr
  1902. hiindex = loindex + 1;
  1903. loval = sintab[loindex];
  1904. hival = sintab[hiindex];
  1905. valdiff = hival - loval;
  1906. timefrac = vib_sinpntr - (double)loindex;
  1907. val = loval + (valdiff * timefrac);
  1908. // Advance vibrato sin-table-read-pointer
  1909. vib_sinpntr += vibfrq * onehzincr;
  1910. if(vib_sinpntr >= SYNTH_TABSIZE)
  1911. vib_sinpntr -= (double)SYNTH_TABSIZE;
  1912. // Multiply sinusoidal val by current semitone-depth of vib
  1913. val *= vibdepth;
  1914. // convert semitone-offset to frq-ratio (>1 for up, <1 for down) and advance in pre-vibrato sound by frq-ratio
  1915. obufptr += SEMITONES_AS_RATIO(val);
  1916. sampcnt++;
  1917. } // Copy vibratoed output to original obuf
  1918. memset((char *)obuf,0,dz->max_notedur * sizeof(float));
  1919. memcpy((char *)obuf,(char *)obuf2,sampcnt * sizeof(float));
  1920. return FINISHED;
  1921. }
  1922. /**************************** ADD_PACKET_VIBRATO *************************/
  1923. int add_packet_vibrato(int *init,double onehzincr,double srate,int *sampcnt,int packet_dur,dataptr dz)
  1924. {
  1925. int vibnext = 2;
  1926. double *vib_depth = dz->parray[dz->ins_vibd];
  1927. double *vib_frq = dz->parray[dz->ins_vibf];
  1928. double *sintab = dz->parray[dz->sinarray];
  1929. static double thistime, thisfrq, thisdepth, nexttime, nextfrq, nextdepth, timediff, depthdiff, frqdiff, endtime;
  1930. double time, vibdepth, vibfrq, timefrac, tratio, val, loval, hival, valdiff, incr;
  1931. int loindex, hiindex, new_packet_dur, packet_shift;
  1932. double *vib_sinpntr = &(dz->parray[dz->pntarray][MAXPARTIALS]);
  1933. // Initialise variables
  1934. if(*init) {
  1935. thistime = 0.0;
  1936. thisdepth = vib_depth[1];
  1937. nexttime = vib_depth[2];
  1938. nextdepth = vib_depth[3];
  1939. endtime = vib_depth[4];
  1940. thisfrq = vib_frq[1];
  1941. nextfrq = vib_frq[3];
  1942. depthdiff = nextdepth - thisdepth;
  1943. frqdiff = nextfrq - thisfrq;
  1944. timediff = nexttime - thistime;
  1945. *vib_sinpntr = 0.0;
  1946. *init = 0;
  1947. }
  1948. // Find current frequency and depth of vibrato
  1949. time = (double)(*sampcnt)/srate;
  1950. if(time == 0.0) {
  1951. vibdepth = thisdepth;
  1952. vibfrq = thisfrq;
  1953. } else if(time >= endtime) {
  1954. vibdepth = vib_depth[5];
  1955. vibfrq = vib_frq[5];
  1956. } else {
  1957. while (nexttime <= time) {
  1958. thistime = nexttime;
  1959. thisdepth = nextdepth;
  1960. thisfrq = nextfrq;
  1961. vibnext += 2;
  1962. nexttime = vib_depth[vibnext];
  1963. nextdepth = vib_depth[vibnext+1];
  1964. nextfrq = vib_frq[vibnext+1];
  1965. depthdiff = nextdepth - thisdepth;
  1966. frqdiff = nextfrq - thisfrq;
  1967. timediff = nexttime - thistime;
  1968. }
  1969. tratio = (time - thistime)/timediff;
  1970. vibfrq = (frqdiff * tratio) + thisfrq;
  1971. vibdepth = (depthdiff * tratio) + thisdepth;
  1972. }
  1973. // Use current pointer-position for vibrato, in sintable, to read sinusoidal vibrato-divergence
  1974. loindex = (int)floor(*vib_sinpntr); // Read from sintable, using vibrato-sinptr
  1975. hiindex = loindex + 1;
  1976. loval = sintab[loindex];
  1977. hival = sintab[hiindex];
  1978. valdiff = hival - loval;
  1979. timefrac = *vib_sinpntr - (double)loindex;
  1980. val = loval + (valdiff * timefrac);
  1981. // Advance vibrato sin-table-read-pointer by duration of one packet
  1982. *vib_sinpntr += vibfrq * onehzincr * packet_dur;
  1983. if(*vib_sinpntr >= SYNTH_TABSIZE)
  1984. *vib_sinpntr -= (double)SYNTH_TABSIZE;
  1985. // Multiply sinusoidal val by current semitone-depth of vib
  1986. val *= vibdepth;
  1987. // convert semitone offset to frq-ratio : THEN wavelen (packet) duration = 1.0/frq-ratio
  1988. incr = 1.0/SEMITONES_AS_RATIO(val);
  1989. new_packet_dur = (int)round((double)packet_dur * incr);
  1990. packet_shift = new_packet_dur - packet_dur;
  1991. *sampcnt += packet_shift;
  1992. return FINISHED;
  1993. }
  1994. /**************************** SETUP_THE_SPECIAL_DATA_FOR_GIVEN_INSTR ****************************/
  1995. int setup_the_special_data_for_given_instr(int instrno,double *data,synptr instrument,dataptr dz)
  1996. {
  1997. double val, timeval = 0.0;
  1998. int timepos, valpos, pno_cnt, lev_cnt = 0;
  1999. double *instr = dz->parray[dz->ins_spectrum], *env = dz->parray[dz->ins_envel];
  2000. int lstart;
  2001. int line, mm, cnt;
  2002. // Clearly arrays for spectrum and envelope
  2003. memset((char *)instr,0, MAXENTRYCNT * sizeof(double));
  2004. memset((char *)env,0, (MAXENVPNTS * 2) * sizeof(double));
  2005. // ALPHA : Setup instrument specific spectrum
  2006. instr = instrument->spectrum; // instrument spectrum
  2007. timepos = 0; // Pointer to time-values in all arrays
  2008. valpos = 1; // Pointer to val-at-time in all arrays
  2009. pno_cnt = 0; // Pointer to partial-pno table
  2010. lstart = MAXPARTIALS; // Start of partial-level table
  2011. for(line=0; line < instrument->line_cnt; line++) {
  2012. mm = instrument->line_entrycnt * line; // Index of entry in the instrument array, at start of current line
  2013. for(cnt = 0;cnt < instrument->line_entrycnt;cnt++) {
  2014. val = instr[mm];
  2015. switch(cnt) {
  2016. case(0):
  2017. pno_cnt = 0; // Point to start of pnos, and levels
  2018. lev_cnt = lstart;
  2019. timeval = val;
  2020. break;
  2021. default:
  2022. if(ODD(cnt)) { // Put pno in appropriate pno-array
  2023. dz->parray[pno_cnt][timepos] = timeval;
  2024. dz->parray[pno_cnt][valpos] = val;
  2025. pno_cnt++;
  2026. } else { // Put level in appropriate level-array
  2027. dz->parray[lev_cnt][timepos] = timeval;
  2028. dz->parray[lev_cnt][valpos] = val;
  2029. lev_cnt++;
  2030. }
  2031. break;
  2032. }
  2033. mm++;
  2034. }
  2035. timepos += 2; // Advance pointers in pno and level tables
  2036. valpos +=2;
  2037. }
  2038. dz->partialtabs_cnt = instrument->line_cnt * 2; // Store lengths of partial tables (1 time and 1 value entry from each dataline)
  2039. return(FINISHED);
  2040. }
  2041. /**************************** PRETEST_THE_SPECIAL_DATA ****************************/
  2042. int pretest_the_special_data(char *str,int *inlinecnt,synptr *orchestra,dataptr dz)
  2043. {
  2044. double dummy = 0.0, lasttime = 0.0, lastpitch[16];
  2045. synptr instrument;
  2046. double timestep;
  2047. int insno, typ, coincident = 0, doublestop, lastdur, pianoRHcnt = 0, pianoLHcnt = 0, pianoRHpos = -1, pianoLHpos = -1;
  2048. FILE *fp;
  2049. int cnt, linecnt, n, m;
  2050. char temp[8000], insnam[200],*p;
  2051. if((fp = fopen(str,"r"))==NULL) {
  2052. sprintf(errstr,"Cannot open file %s to read times.\n",str);
  2053. return(DATA_ERROR);
  2054. }
  2055. linecnt = 1;
  2056. while(fgets(temp,8000,fp)!=NULL) {
  2057. p = temp;
  2058. while(isspace(*p))
  2059. p++;
  2060. if(*p == ';' || *p == ENDOFSTR) // Allow comments in file
  2061. continue;
  2062. if((read_instrument_name_from_start_of_line(&p,insnam,&insno,orchestra,linecnt)) < 0) {
  2063. return DATA_ERROR;
  2064. }
  2065. if(!(strcmp(insnam,"pianoRH"))) {
  2066. pianoRHcnt++;
  2067. if(pianoRHcnt > 1) {
  2068. sprintf(errstr,"Cannot handle more than 1 piano right-hand.\n");
  2069. return DATA_ERROR;
  2070. }
  2071. pianoRHpos = linecnt;
  2072. } else if(!(strcmp(insnam,"pianoLH"))) {
  2073. pianoLHcnt++;
  2074. if(pianoLHcnt > 1) {
  2075. sprintf(errstr,"Cannot handle more than 1 piano left-hand.\n");
  2076. return DATA_ERROR;
  2077. }
  2078. pianoLHpos = linecnt;
  2079. }
  2080. instrument = orchestra[insno]; // ALPHA : Sets up instrument specific pitch-ranges
  2081. doublestop = instrument->doublestop;
  2082. cnt = 0;
  2083. lastdur = 0;
  2084. while(get_float_from_within_string(&p,&dummy)) {
  2085. typ = cnt % 4;
  2086. switch(typ) {
  2087. case(0): // time
  2088. if(cnt > 0) {
  2089. timestep = dummy - lasttime;
  2090. if(timestep < 0) {
  2091. sprintf(errstr,"Times do not advance (%lf %lf) in line %d\n",lasttime,dummy,linecnt);
  2092. return DATA_ERROR;
  2093. }
  2094. if(timestep == 0)
  2095. coincident++;
  2096. else if(timestep < 3) {
  2097. sprintf(errstr,"Times do not advance sufficiently (%d to %d = %d units) in line %d (min: 3 units)\n",(int)round(lasttime),(int)round(dummy),(int)round(dummy - lasttime),linecnt);
  2098. return DATA_ERROR;
  2099. } else
  2100. coincident = 1;
  2101. if(coincident > instrument->doublestop) {
  2102. sprintf(errstr,"Too many coincident notes at time %lf in line %d\n",lasttime,linecnt);
  2103. return DATA_ERROR;
  2104. }
  2105. } else
  2106. coincident = 1;
  2107. lasttime = dummy;
  2108. break;
  2109. case(1): // pitch
  2110. if(dummy < instrument->rangebot || dummy > instrument->rangetop) {
  2111. sprintf(errstr,"Pitch value (%d) out of range (%d to %d) for instrument %s line %d\n",(int)round(dummy),instrument->rangebot,instrument->rangetop,insnam,linecnt);
  2112. return DATA_ERROR;
  2113. }
  2114. lastpitch[coincident - 1] = dummy;
  2115. if(coincident > 1) {
  2116. for(n = 0;n < coincident-1;n++) {
  2117. for(m = n+1;m < coincident;m++) {
  2118. if(lastpitch[n] == lastpitch[m]) {
  2119. sprintf(errstr,"Identical Pitch values (%d) used at same time (%d) for instrument %s line %d\n",(int)round(lastpitch[n]),(int)round(lasttime),insnam,linecnt);
  2120. return DATA_ERROR;
  2121. }
  2122. }
  2123. }
  2124. }
  2125. break;
  2126. case(2): // level
  2127. if(dummy <= 0.0 || dummy > 1.0) {
  2128. sprintf(errstr,"Level value (%lf) out of range (>0 to 1) for instrument %s\n",dummy,insnam);
  2129. return DATA_ERROR;
  2130. }
  2131. break;
  2132. case(3): // dur
  2133. if(dummy < 1 || dummy > MSYNMAXQDUR) {
  2134. sprintf(errstr,"Duration in semiquavers (%d) out of range (1 to %d) for instrument %s\n",(int)round(dummy),MSYNMAXQDUR,insnam);
  2135. return DATA_ERROR;
  2136. }
  2137. if(coincident > 1 && dummy != lastdur) {
  2138. sprintf(errstr,"Notes in \"%s\" at same time %d, have different durations (%d and %d)\n",insnam,(int)round(lasttime),lastdur,(int)round(dummy));
  2139. return DATA_ERROR;
  2140. }
  2141. lastdur = (int)round(dummy);
  2142. break;
  2143. }
  2144. cnt++;
  2145. }
  2146. if(cnt % 4 != 0) {
  2147. sprintf(errstr,"Invalid number of numeric entries (%d) on line %d (must be in sets of 4: time,pitch,level,duration).\n",cnt,linecnt);
  2148. return(DATA_ERROR);
  2149. }
  2150. linecnt++;
  2151. }
  2152. linecnt--;
  2153. fclose(fp);
  2154. if(linecnt == 0) {
  2155. sprintf(errstr,"No significant data found in score file.\n");
  2156. return(DATA_ERROR);
  2157. }
  2158. if(linecnt >= MAXSCORLINE) {
  2159. sprintf(errstr,"Too many data lines (%d) found in score file (max %d).\n",linecnt,MAXSCORLINE);
  2160. return(DATA_ERROR);
  2161. }
  2162. *inlinecnt = linecnt;
  2163. if(pianoLHcnt != pianoRHcnt) {
  2164. sprintf(errstr,"Piano LH and RH not both present.\n");
  2165. return(DATA_ERROR);
  2166. }
  2167. if(pianoRHpos >= 0 && pianoRHpos+1 != pianoLHpos) {
  2168. sprintf(errstr,"Piano LH does not immediately follow piano RH.\n");
  2169. return(DATA_ERROR);
  2170. }
  2171. return FINISHED;
  2172. }
  2173. /**************************** RETEST_COUNT_AND_STORE_THE_SPECIAL_DATA ****************************
  2174. *
  2175. * In Pass 1
  2176. * (a) makes an instrument dependent test, to check that successive notes don't overlap, if this not possible for specific instrument.
  2177. * (b) uses dz->timeconvert, derived from the input MM parameter to calculate sizes of buffers required.
  2178. * (c) creates the correct-sized arrays to store the scoredata lines.
  2179. * In Pass 2
  2180. * (a)stores the scoredata lines.
  2181. */
  2182. int retest_count_and_store_the_special_data(char *str,synptr *orchestra,int *flt_cnt,double *flt_mul,dataptr dz)
  2183. {
  2184. double dummy = 0.0, lastdur = 0.0, maxdur = 0.0, maxnotedur = 0.0, lasttime = 0.0, timestep, leftgain, rightgain;
  2185. double *linestor, *ochanpos = dz->parray[dz->ochan_pos], sustain = 0.0, lrpos;
  2186. int insno, cnt, typ, linecnt, n, m, itimestep, idummy, ilastdur = 0, ochans = dz->iparam[MS_OCHANS];
  2187. int surround = 0, leftmostchan, ispiano = -1, instrcnt = 0, coincidence;
  2188. synptr instrument;
  2189. FILE *fp;
  2190. char temp[8000], insnam[200],*p;
  2191. if((fp = fopen(str,"r"))==NULL) {
  2192. sprintf(errstr,"Cannot open file %s to read times.\n",str);
  2193. return(DATA_ERROR);
  2194. }
  2195. if(ochans > 2 && !dz->vflag[0])
  2196. surround = 1;
  2197. linecnt = 0;
  2198. coincidence = 1;
  2199. while(fgets(temp,8000,fp)!=NULL) {
  2200. p = temp;
  2201. while(isspace(*p))
  2202. p++;
  2203. if(*p == ';' || *p == ENDOFSTR) // Allow comments in file
  2204. continue;
  2205. read_instrument_name_from_start_of_line(&p,insnam,&insno,orchestra,(int)(linecnt+1));
  2206. if(!strcmp(insnam,"pianoRH"))
  2207. ispiano = linecnt;
  2208. instrument = orchestra[insno]; // ALPHA Establish note-overlap type
  2209. if(instrument->overlap) // If sustaining instrument, check entire decay-length of note
  2210. sustain = instrument->env[instrument->env_len - 2];
  2211. else
  2212. sustain = 0.0;
  2213. cnt = 0;
  2214. while(get_float_from_within_string(&p,&dummy)) {
  2215. typ = cnt % 4;
  2216. switch(typ) {
  2217. case(0): // time
  2218. if(cnt > 0) {
  2219. idummy = (int)floor(dummy);
  2220. if(idummy != dummy) {
  2221. sprintf(errstr,"Bad time value (%lf) (Times must be integers) on line %d (%s).\n",dummy,linecnt+1,insnam);
  2222. return(DATA_ERROR);
  2223. }
  2224. if((idummy % 3 != 0) && (idummy % 4 != 0)) {
  2225. sprintf(errstr,"Bad time value (%d) (Times must be multiples of 3 or 4) on line %d (%s).\n",idummy,linecnt+1,insnam);
  2226. return(DATA_ERROR);
  2227. }
  2228. timestep = dummy - lasttime;
  2229. itimestep = (int)round(timestep);
  2230. timestep *= dz->timeconvert; // Convert thirds-of-semiquavers to seconds
  2231. if(itimestep == 0) {
  2232. coincidence++;
  2233. if(coincidence > instrument->doublestop) {
  2234. sprintf(errstr,"Too many coincident notes at time %d in line %d (%s)\n",ilastdur,linecnt+1,insnam);
  2235. return DATA_ERROR;
  2236. }
  2237. } else if(itimestep < UNITSPERSEMIQ) {
  2238. sprintf(errstr,"Timestep between entries %d and %d (= %d) too small (MIN 3) on line %d (%s)\n",(int)round(lasttime),(int)round(dummy),itimestep,linecnt+1,insnam);
  2239. return DATA_ERROR;
  2240. } else
  2241. coincidence = 1;
  2242. if(instrument->doublestop < 2 && timestep < lastdur) { // Test instrument for note-overlaps
  2243. sprintf(errstr,"Duration (%d) at time %d too long for timestep (%d) in line %d (%s)\n",ilastdur,(int)round(lasttime),itimestep,linecnt+1,insnam);
  2244. return DATA_ERROR;
  2245. }
  2246. } else
  2247. coincidence = 1;
  2248. lasttime = dummy;
  2249. break;
  2250. case(3): // dur
  2251. idummy = (int)floor(dummy);
  2252. if(idummy != dummy) {
  2253. sprintf(errstr,"Bad duration value (%lf) (Durations must be integers) on line %d (%s).\n",dummy,linecnt+1,insnam);
  2254. return(DATA_ERROR);
  2255. }
  2256. if((idummy % 3 != 0) && (idummy % 4 != 0)) {
  2257. sprintf(errstr,"Bad duration (%d) (must be multiples of 3 or 4) on line %d (%s).\n",idummy,linecnt+1,insnam);
  2258. return(DATA_ERROR);
  2259. }
  2260. if(coincidence > 1) {
  2261. if(idummy != ilastdur) {
  2262. sprintf(errstr,"Coincident notes must have same duration (time %d on line %d : %s).\n",(int)round(lasttime),linecnt+1,insnam);
  2263. return(DATA_ERROR);
  2264. }
  2265. }
  2266. ilastdur = idummy;
  2267. lastdur = dummy * dz->timeconvert; // Convert thirds-of-semiquavers to seconds
  2268. lastdur = max(lastdur,sustain);
  2269. maxdur = max(maxdur,lasttime+lastdur);
  2270. maxnotedur = max(maxnotedur,lastdur);
  2271. break;
  2272. }
  2273. cnt++;
  2274. }
  2275. if((dz->parray[dz->scoredata+linecnt] = (double *)malloc((cnt+1) * sizeof(double)))==NULL) {
  2276. sprintf(errstr,"INSUFFICIENT MEMORY for score line %d.\n",linecnt+1);
  2277. return(MEMORY_ERROR);
  2278. }
  2279. linecnt++;
  2280. }
  2281. dz->maxoutsamp = (int)ceil(maxdur * (double)MSYNSRATE) * dz->iparam[MS_OCHANS];
  2282. dz->max_notedur = (int)ceil(maxnotedur * 2 * (double)MSYNSRATE); // Instrument streams are mono, but we have to allow for vibrato
  2283. // Position the instrument streams in the multichan-output space
  2284. // single instrument-stream
  2285. instrcnt = linecnt;
  2286. if(ispiano >= 0)
  2287. instrcnt--;
  2288. if(instrcnt == 1) {
  2289. if(ochans == 2) { // if stereo, create central image
  2290. ochanpos[0] = 0; // Left channel is channel 1(0)
  2291. ochanpos[1] = 0.5; // signal on 1+2
  2292. ochanpos[2] = 0.5;
  2293. } else if(surround) { // if multichan-surround, create image on front-centre channel 1(0)
  2294. ochanpos[0] = 0; // Left channel is channel 1(0): front centre
  2295. ochanpos[1] = 1.0; // Signal on 1
  2296. ochanpos[2] = 0.0;
  2297. } else { // if multichan linear, create image on central channel(s)
  2298. if(ODD(ochans)) {
  2299. ochanpos[0] = ochans/2; // e.g. 7 --> 3
  2300. ochanpos[1] = 1.0; // all signal on 3
  2301. ochanpos[2] = 0.0;
  2302. } else {
  2303. ochanpos[0] = ochans/2 - 1; // e.g. 8 --> 3
  2304. ochanpos[1] = 0.5; // signal on 3+4
  2305. ochanpos[2] = 0.5;
  2306. }
  2307. }
  2308. if(ispiano) { // Both LH and RH on same channel
  2309. if(ochans == 2) {
  2310. ochanpos[3] = 0;
  2311. ochanpos[4] = 0.5;
  2312. ochanpos[5] = 0.5;
  2313. } else if(surround) {
  2314. ochanpos[3] = 0;
  2315. ochanpos[4] = 1.0;
  2316. ochanpos[5] = 0.0;
  2317. } else {
  2318. if(ODD(ochans)) {
  2319. ochanpos[3] = ochans/2;
  2320. ochanpos[4] = 1.0;
  2321. ochanpos[5] = 0.0;
  2322. } else {
  2323. ochanpos[3] = ochans/2 - 1;
  2324. ochanpos[4] = 0.5;
  2325. ochanpos[5] = 0.5;
  2326. }
  2327. }
  2328. }
  2329. } else if(instrcnt <= ochans) {
  2330. // 1 instrument to a channel
  2331. for(n = 0,m = 0; m < linecnt * 3; n++,m+=3) {
  2332. ochanpos[m] = n; // Assign each instrument-stream to (successive) output channel
  2333. ochanpos[m+1] = 1.0; // All level on this channel
  2334. ochanpos[m+2] = 0.0; // None on adjacent channel
  2335. if(n == ispiano) { // Force both piano outputs to same channel
  2336. n--;
  2337. ispiano = -1; // Prevent this happening again
  2338. }
  2339. }
  2340. if(surround) { // If sound_surround, orient instruments to front of space.
  2341. leftmostchan = ochans/2 + 1;
  2342. for(n = 0,m = 0; n < linecnt; n++,m+=3)
  2343. ochanpos[m] = (double)(((int)round(ochanpos[m]) + leftmostchan) % ochans);
  2344. }
  2345. } else if(ochans == 2 || dz->vflag[0]) {
  2346. // if linear array, distribute instruments equispaced over multichannel linear array
  2347. for(n = 0,m = 0;m < (linecnt-1) * 3; n++,m+=3) {
  2348. if(n >= instrcnt - 1) { // If piano (double entry) is last item : say instrcnt = 5, but linecnt =6
  2349. ochanpos[m] = (double)(ochans - 1); // then n will reach instrcnt-1 before m reaches (linecnt-1)*3
  2350. ochanpos[m+1] = 0.0; // In this case, stick piano RH in rightmost channel of array, then go on
  2351. ochanpos[m+2] = 1.0; // (outside loop) to add pianoLH at same position in array.
  2352. } else {
  2353. ochanpos[m] = (double)n/(double)(instrcnt - 1); // e.g for 5 instr
  2354. // 0 1/4 2/4 3/4 () (Range 0 to 1)
  2355. ochanpos[m] *= ochans-1; // e.g. stereo (*1) --> 0 1/4 2/4 3/4 () (Range 0 to 1)
  2356. // e.g. 4-chan (*3) --> 0 3/4 1+1/2 2+1/4 () (Range 0 to 3)
  2357. lrpos = ochanpos[m];
  2358. while(lrpos > 1.0) // stereo 0 1/4 2/4 3/4 () : 4-chan 0 3/4 1+1/2 2+1/4 ()
  2359. lrpos -= 1.0; // stereo 0 1/4 2/4 3/4 () : 4-chan 0 3/4 1/2 1/4 ()
  2360. pancalc(lrpos,&leftgain,&rightgain);
  2361. ochanpos[m] = floor(ochanpos[m]); // stereo 0 0 0 0 () : 4-chan 0 0 1 2 ()
  2362. ochanpos[m+1] = leftgain;
  2363. ochanpos[m+2] = rightgain;
  2364. if(n == ispiano) { // Force both piano outputs to same channel
  2365. n--;
  2366. ispiano = -1;
  2367. }
  2368. }
  2369. }
  2370. ochanpos[m] = (double)(ochans - 1); // stereo(0) (0) (0) (0) 1 : 4-chan(0)(0) (1) (2) 3
  2371. ochanpos[m+1] = 0.0;
  2372. ochanpos[m+2] = 1.0; // all signal to rightmost speaker
  2373. } else {
  2374. // if sound-surround, distribute instruments equispaced around multichannel suround-array
  2375. for(n = 0,m = 0;m < linecnt*3; n++,m+=3) {
  2376. ochanpos[m] = (double)n/(double)instrcnt; // e.g for 5 instr
  2377. // 0 1/5 2/5 3/5 4/5 (Range 0 to 1)
  2378. ochanpos[m] *= ochans; // e.g. 4-chan (*4) --> 0 4/5 1+3/5 2+2/5 3+1/5 (Range 0 to 4)
  2379. // e.g. 8-chan (*8) --> 0 1+3/5 3+1/5 4+4/5 6+2/5 (Range 0 to 8)
  2380. lrpos = ochanpos[m];
  2381. while(lrpos > 1.0) // 4-chan 0 4/5 1+3/5 2+2/5 3+1/5 : 8-chan 0 1+3/5 3+1/5 4+4/5 6+2/5
  2382. lrpos -= 1.0; // 4-chan 0 4/5 3/5 2/5 1/5 : 8-chan 0 3/5 1/5 4/5 2/5
  2383. pancalc(lrpos,&leftgain,&rightgain);
  2384. ochanpos[m] = floor(ochanpos[m]); // 4-chan 0 0 1 2 3 : 8-chan 0 1 3 4 6
  2385. ochanpos[m+1] = leftgain;
  2386. ochanpos[m+2] = rightgain;
  2387. if(n == ispiano) { // Force both piano outputs to same channel
  2388. n--;
  2389. ispiano = -1; // prevent this happening again
  2390. }
  2391. }
  2392. leftmostchan = ochans/2 + 1; // Orient data
  2393. for(n = 0,m = 0; n < linecnt; n++,m+=3)
  2394. ochanpos[m] = (double)(((int)round(ochanpos[m]) + leftmostchan) % ochans);
  2395. }
  2396. fseek(fp,0,0);
  2397. linecnt = 0;
  2398. while(fgets(temp,8000,fp)!=NULL) {
  2399. cnt = 0;
  2400. linestor = dz->parray[dz->scoredata + linecnt];
  2401. p = temp;
  2402. while(isspace(*p))
  2403. p++;
  2404. if(*p == ';' || *p == ENDOFSTR) // Allow comments in file
  2405. continue;
  2406. read_instrument_name_from_start_of_line(&p,insnam,&insno,orchestra,(int)(linecnt+1));
  2407. linestor[cnt] = (double)insno;
  2408. cnt++;
  2409. while(get_float_from_within_string(&p,&dummy)) {
  2410. linestor[cnt] = dummy;
  2411. cnt++;
  2412. }
  2413. if(!valid_cluster(insno,linestor,cnt,orchestra))
  2414. return DATA_ERROR;
  2415. linestor[cnt] = -1; // End of scoredataline marker
  2416. linecnt++;
  2417. }
  2418. fclose(fp);
  2419. return(FINISHED);
  2420. }
  2421. /************************************ PANCALC *******************************/
  2422. void pancalc(double position,double *leftgain,double *rightgain)
  2423. {
  2424. int dirflag;
  2425. double temp;
  2426. double relpos;
  2427. double reldist, invsquare;
  2428. if(position < 0.0)
  2429. dirflag = SIGNAL_TO_LEFT; /* signal on left */
  2430. else
  2431. dirflag = SIGNAL_TO_RIGHT;
  2432. if(position < 0)
  2433. relpos = -position;
  2434. else
  2435. relpos = position;
  2436. if(relpos <= 1.0){ /* between the speakers */
  2437. temp = 1.0 + (relpos * relpos);
  2438. reldist = ROOT2 / sqrt(temp);
  2439. temp = (position + 1.0) / 2.0;
  2440. *rightgain = temp * reldist;
  2441. *leftgain = (1.0 - temp ) * reldist;
  2442. } else { /* outside the speakers */
  2443. temp = (relpos * relpos) + 1.0;
  2444. reldist = sqrt(temp) / ROOT2; /* relative distance to source */
  2445. invsquare = 1.0 / (reldist * reldist);
  2446. if(dirflag == SIGNAL_TO_LEFT){
  2447. *leftgain = invsquare;
  2448. *rightgain = 0.0;
  2449. } else { /* SIGNAL_TO_RIGHT */
  2450. *rightgain = invsquare;
  2451. *leftgain = 0;
  2452. }
  2453. }
  2454. }
  2455. /**************************** READ_INSTRUMENT_NAME_FROM_START_OF_LINE ****************************/
  2456. int read_instrument_name_from_start_of_line(char **p,char *insnam,int *insno,synptr *orchestra,int linecnt)
  2457. {
  2458. int n = 0;
  2459. char *q;
  2460. q = *p;
  2461. while(!isspace(*q) && *q != ENDOFSTR) {
  2462. insnam[n++] = *q;
  2463. q++;
  2464. }
  2465. if(n == 0) {
  2466. sprintf(errstr,"No instrument name in line %d\n",linecnt);
  2467. return DATA_ERROR;
  2468. }
  2469. insnam[n] = ENDOFSTR;
  2470. while(isspace(*q))
  2471. q++;
  2472. if(*q == ENDOFSTR) {
  2473. sprintf(errstr,"No further data in line %d\n",linecnt);
  2474. return DATA_ERROR;
  2475. }
  2476. for(n=0;n<orchestra_size;n++) {
  2477. if(!strcmp(insnam,orchestra[n]->name)) {
  2478. *insno = n;
  2479. break;
  2480. }
  2481. }
  2482. if(n == orchestra_size) {
  2483. sprintf(errstr,"Unknown instrument name (%s) in line %d\n",insnam,linecnt);
  2484. return DATA_ERROR;
  2485. }
  2486. *p = q;
  2487. return FINISHED;
  2488. }
  2489. /**************************** VALID_CLUSTER ****************************/
  2490. int valid_cluster(int insno,double *linestor,int datacnt,synptr *orchestra)
  2491. {
  2492. int midival[64];
  2493. char insname[64];
  2494. int n = 0, chordcnt = 0, time, midi, lasttime = 0, lastmidi = 0;
  2495. synptr instrument = orchestra[insno];
  2496. int doublestop = instrument->doublestop;
  2497. switch(insno) {
  2498. case(2): strcpy(insname,"pianoRH"); break;
  2499. case(3): strcpy(insname,"pianoLH"); break;
  2500. case(5): strcpy(insname,"violin"); break;
  2501. case(6): strcpy(insname,"cello"); break;
  2502. }
  2503. n = 1;
  2504. while(n < datacnt) {
  2505. time = (int)round(linestor[n++]);
  2506. midi = (int)round(linestor[n++]);
  2507. n += 2;
  2508. if(n > 5) {
  2509. if(time == lasttime) {
  2510. if(chordcnt == 0)
  2511. midival[chordcnt++] = lastmidi;
  2512. midival[chordcnt++] = midi;
  2513. } else {
  2514. if(!check_clustering(insno,chordcnt,doublestop,insname,lasttime,midival))
  2515. return DATA_ERROR;
  2516. chordcnt = 0;
  2517. }
  2518. }
  2519. lasttime = time;
  2520. lastmidi = midi;
  2521. }
  2522. return FINISHED;
  2523. }
  2524. /**************************** CHECK_CLUSTERING ****************************/
  2525. #define FIFTH 7 // semitones
  2526. #define OCTAV 12 // semitones
  2527. int check_clustering(int insno,int chordcnt,int doublestop,char *insname,int time, int *midival)
  2528. {
  2529. int maxmidi = -1000, minmidi = 1000, k, n, range, openstring, position;
  2530. int minposition = 1000, maxposition = -1;
  2531. char openname[4];
  2532. if(chordcnt < 1)
  2533. return FINISHED;
  2534. if(chordcnt > doublestop) {
  2535. sprintf(errstr,"CLUSTER SIZE TOO LARGE in %s at time %d\n",insname,time);
  2536. return DATA_ERROR;
  2537. }
  2538. for(k = 0;k < chordcnt;k++) {
  2539. maxmidi = max(midival[k],maxmidi);
  2540. minmidi = min(midival[k],minmidi);
  2541. }
  2542. range = maxmidi - minmidi;
  2543. switch(insno) {
  2544. case(PIANO_RH): // pianoRH
  2545. case(PIANO_LH): // pianoLH
  2546. if (range > OCTAV) {
  2547. sprintf(errstr,"CLUSTER RANGE (%d) TOO LARGE (MAX %d) in %s at time %d\n",range,OCTAV,insname,time);
  2548. return DATA_ERROR;
  2549. }
  2550. break;
  2551. case(VIOLIN): // violin
  2552. case(CELLO): // cello
  2553. if(insno == VIOLIN)
  2554. openstring = 55;
  2555. else
  2556. openstring = 36;
  2557. n = 0;
  2558. for(k=0;k<chordcnt;k++) {
  2559. if(insno == 5) {
  2560. switch(n) {
  2561. case(0): strcpy(openname,"G"); break;
  2562. case(1): strcpy(openname,"D"); break;
  2563. case(2): strcpy(openname,"A"); break;
  2564. case(3): strcpy(openname,"E"); break;
  2565. }
  2566. } else {
  2567. switch(n) {
  2568. case(0): strcpy(openname,"C"); break;
  2569. case(1): strcpy(openname,"G"); break;
  2570. case(2): strcpy(openname,"D"); break;
  2571. case(3): strcpy(openname,"A"); break;
  2572. }
  2573. }
  2574. if(midival[k] < openstring) {
  2575. sprintf(errstr,"CLUSTER NOTE %d NOT ACCESSIBLE ON %s STRING OF %s",midival[k],openname,insname);
  2576. return DATA_ERROR;
  2577. }
  2578. position = midival[k] - (n * FIFTH);
  2579. minposition = min(minposition,position);
  2580. maxposition = max(maxposition,position);
  2581. n++;
  2582. openstring += FIFTH;
  2583. }
  2584. if (maxposition - minposition > FIFTH) {
  2585. sprintf(errstr,"CLUSTER HAS IMPOSSIBLE STRETCH FROM POSITION %d TO POSITION %d ON %s\n",minposition,maxposition,insname);
  2586. return DATA_ERROR;
  2587. }
  2588. }
  2589. return FINISHED;
  2590. }
  2591. /***************************** MDO_LPHP_FILTER *************************************/
  2592. int mdo_lphp_filter(int sampcnt,int flt_cnt,double flt_mul,dataptr dz)
  2593. {
  2594. int flt_den1 = dz->filterbas;
  2595. int flt_den2 = dz->filterbas+1;
  2596. int flt_count = dz->filterbas+2;
  2597. int flt_s1 = dz->filterbas+3;
  2598. int flt_s2 = dz->filterbas+4;
  2599. int flt_e1 = dz->filterbas+5;
  2600. int flt_e2 = dz->filterbas+6;
  2601. int i;
  2602. int k;
  2603. float *buf = dz->sampbuf[1];
  2604. double ip, op = 0.0, b1;
  2605. double *e1 = dz->parray[flt_e1];
  2606. double *e2 = dz->parray[flt_e2];
  2607. double *s1 = dz->parray[flt_s1];
  2608. double *s2 = dz->parray[flt_s2];
  2609. double *den1 = dz->parray[flt_den1];
  2610. double *den2 = dz->parray[flt_den2];
  2611. double *cn = dz->parray[flt_count];
  2612. for (i = 0 ; i < sampcnt; i++) {
  2613. ip = (double) buf[i];
  2614. for (k = 0 ; k < flt_cnt; k++) {
  2615. b1 = flt_mul * cn[k];
  2616. op = (cn[k] * ip) + (den1[k] * s1[k]) + (den2[k] * s2[k]) + (b1 * e1[k]) + (cn[k] * e2[k]);
  2617. s2[k] = s1[k];
  2618. s1[k] = op;
  2619. e2[k] = e1[k];
  2620. e1[k] = ip;
  2621. }
  2622. if (fabs(op) > 1.0) {
  2623. dz->iparam[FLT_OVFLW]++;
  2624. dz->param[FLT_PRESCALE] *= .9999;
  2625. if (op > 0.0)
  2626. op = 1.0;
  2627. else
  2628. op = -1.0;
  2629. }
  2630. buf[i] = (float)op;
  2631. }
  2632. return FINISHED;
  2633. }
  2634. /********************************* MSETUP_LPHP_FILTER *****************************/
  2635. int msetup_lphp_filter(int *flt_cnt,double *flt_mul,double passfrq,double stopfrq,dataptr dz)
  2636. {
  2637. int flt_den1 = dz->filterbas;
  2638. int flt_den2 = dz->filterbas+1;
  2639. int flt_count = dz->filterbas+2;
  2640. int flt_s1 = dz->filterbas+3;
  2641. int flt_s2 = dz->filterbas+4;
  2642. int flt_e1 = dz->filterbas+5;
  2643. int flt_e2 = dz->filterbas+6;
  2644. int filter_order, k;
  2645. double tc, tp, tt, pii, xx, yy, flt_gain;
  2646. double sr = MSYNSRATE, nyquist = sr/2.0;
  2647. double ss, aa, tppwr, x1, x2, cc;
  2648. *flt_mul = -2.0;
  2649. passfrq = nyquist - passfrq;
  2650. stopfrq = nyquist - stopfrq;
  2651. pii = 4.0 * atan(1.0);
  2652. passfrq = pii * passfrq/sr;
  2653. tp = tan(passfrq);
  2654. stopfrq = pii * stopfrq/sr;
  2655. tc = tan(stopfrq);
  2656. tt = tc / tp ;
  2657. tt = (tt * tt);
  2658. flt_gain = fabs(FILTATTEN);
  2659. flt_gain = flt_gain * log(10.0)/10.0 ;
  2660. flt_gain = exp(flt_gain) - 1.0 ;
  2661. xx = log(flt_gain)/log(tt) ;
  2662. yy = floor(xx);
  2663. if ((xx - yy) == 0.0 )
  2664. yy = yy - 1.0 ;
  2665. filter_order = ((int)yy) + 1;
  2666. if (filter_order <= 1)
  2667. filter_order = 2;
  2668. *flt_cnt = filter_order/2 ;
  2669. filter_order = 2 * *flt_cnt;
  2670. filter_order = 2 * *flt_cnt;
  2671. if(dz->parray[flt_den1] != NULL) {
  2672. free(dz->parray[flt_den1]);
  2673. free(dz->parray[flt_den2]);
  2674. free(dz->parray[flt_count]);
  2675. free(dz->parray[flt_s1]);
  2676. free(dz->parray[flt_e1]);
  2677. free(dz->parray[flt_s2]);
  2678. free(dz->parray[flt_e2]);
  2679. }
  2680. if((dz->parray[flt_den1] = (double *)malloc(*flt_cnt * sizeof(double)))==NULL
  2681. || (dz->parray[flt_den2] = (double *)malloc(*flt_cnt * sizeof(double)))==NULL
  2682. || (dz->parray[flt_count]= (double *)malloc(*flt_cnt * sizeof(double)))==NULL
  2683. || (dz->parray[flt_s1] = (double *)malloc(*flt_cnt * sizeof(double)))==NULL
  2684. || (dz->parray[flt_e1] = (double *)malloc(*flt_cnt * sizeof(double)))==NULL
  2685. || (dz->parray[flt_s2] = (double *)malloc(*flt_cnt * sizeof(double)))==NULL
  2686. || (dz->parray[flt_e2] = (double *)malloc(*flt_cnt * sizeof(double)))==NULL) {
  2687. sprintf(errstr,"INSUFFICIENT MEMORY for arrays of filter parameters.\n");
  2688. return(MEMORY_ERROR);
  2689. }
  2690. ss = pii / (double)(2 * filter_order);
  2691. for (k = 0; k < *flt_cnt; k++ ) {
  2692. xx = (double) ((2.0 * (k+1)) - 1.0);
  2693. aa = -sin(xx * ss);
  2694. tppwr = pow(tp,2.0);
  2695. cc = 1.0 - (2.0 * aa * tp) + tppwr;
  2696. x1 = 2.0 * (tppwr - 1.0)/cc ;
  2697. x2 = (1.0 + (2.0 * aa * tp) + tppwr)/cc ;
  2698. dz->parray[flt_den1][k] = x1;
  2699. dz->parray[flt_den2][k] = -x2 ;
  2700. dz->parray[flt_count][k] = pow(tp,2.0)/cc ;
  2701. }
  2702. for (k = 0; k < *flt_cnt; k++) {
  2703. dz->parray[flt_s1][k] = 0.0;
  2704. dz->parray[flt_s2][k] = 0.0;
  2705. dz->parray[flt_e1][k] = 0.0;
  2706. dz->parray[flt_e2][k] = 0.0;
  2707. }
  2708. return(FINISHED);
  2709. }
  2710. /**************************** INITIALISE_INSTRUMENTS ****************************/
  2711. int initialise_instruments(synptr **orchestra)
  2712. {
  2713. int n;
  2714. synptr instrument;
  2715. if((*orchestra = (synptr *)malloc(MAXSCORLINE * sizeof(synptr)))==NULL) {
  2716. sprintf(errstr,"INSUFFICIENT MEMORY for storing pointers to internal instrument data.\n");
  2717. return(MEMORY_ERROR); // Allocate pointers to all instrument data
  2718. }
  2719. for(n = 0;n < MAXSCORLINE; n++) {
  2720. if(((*orchestra)[n] = (synptr)malloc(sizeof(struct synstrument)))==NULL) {
  2721. sprintf(errstr,"INSUFFICIENT MEMORY for storing internal instrument data %d.\n",n+1);
  2722. return(MEMORY_ERROR); // Allocate pointers to this instrument data
  2723. }
  2724. instrument = (*orchestra)[n];
  2725. switch(n) {
  2726. case(0): // trumpet
  2727. strcpy(instrument->name,"trumpet");
  2728. instrument->partial_cnt = 16; // Must tally with no. of partials in instrument spectrum definition
  2729. instrument->line_cnt = 3; // Must tally with no. of (timed) lines in instrument spectrum definition
  2730. instrument->env_len = 12; // Must tally with no. of entries (count time and val as separate entries) in instrument envelope definition
  2731. instrument->has_vibrato = 1;
  2732. instrument->maxvibdepth = 0.3;
  2733. instrument->packettype = 0;
  2734. instrument->squeeze = 1.0;
  2735. instrument->centre = -0.8;
  2736. instrument->rangebot = 54;
  2737. instrument->rangetop = 79;
  2738. instrument->overlap = 0;
  2739. instrument->doublestop = 1;
  2740. instrument->balance = 2;
  2741. instrument->spectrum = trumpet; // Point to relevant static array
  2742. instrument->env = trumpenv; // Point to relevant static array
  2743. break;
  2744. case(1): // clarinet
  2745. strcpy(instrument->name,"clarinet");
  2746. instrument->partial_cnt = 10;
  2747. instrument->line_cnt = 2;
  2748. instrument->env_len = 12;
  2749. instrument->has_vibrato = 0;
  2750. instrument->maxvibdepth = 0.0;
  2751. instrument->packettype = 1;
  2752. instrument->squeeze = 1.0;
  2753. instrument->centre = -0.8;
  2754. instrument->rangebot = 50;
  2755. instrument->rangetop = 91;
  2756. instrument->overlap = 0;
  2757. instrument->doublestop = 1;
  2758. instrument->balance = 1;
  2759. instrument->spectrum = clarinet; // Point to relevant static array
  2760. instrument->env = clarenv; // Point to relevant static array
  2761. break;
  2762. case(2): // piano
  2763. strcpy(instrument->name,"pianoRH");
  2764. instrument->partial_cnt = 12;
  2765. instrument->line_cnt = 4;
  2766. instrument->env_len = 12;
  2767. instrument->has_vibrato = 0;
  2768. instrument->maxvibdepth = 0.0;
  2769. instrument->packettype = 0;
  2770. instrument->squeeze = 1.0;
  2771. instrument->centre = -0.8;
  2772. instrument->rangebot = 48;
  2773. instrument->rangetop = 108;
  2774. instrument->overlap = 1;
  2775. instrument->doublestop = 4;
  2776. instrument->balance = 2.5;
  2777. instrument->spectrum = piano; // Point to relevant static array
  2778. instrument->env = pianoenv; // Point to relevant static array
  2779. break;
  2780. case(3): // piano
  2781. strcpy(instrument->name,"pianoLH");
  2782. instrument->partial_cnt = 12;
  2783. instrument->line_cnt = 4;
  2784. instrument->env_len = 12;
  2785. instrument->has_vibrato = 0;
  2786. instrument->maxvibdepth = 0.0;
  2787. instrument->packettype = 0;
  2788. instrument->squeeze = 1.0;
  2789. instrument->centre = -0.8;
  2790. instrument->rangebot = 21;
  2791. instrument->rangetop = 72;
  2792. instrument->overlap = 1;
  2793. instrument->doublestop = 4;
  2794. instrument->balance = 2.5;
  2795. instrument->spectrum = piano; // Point to relevant static array
  2796. instrument->env = pianoenv; // Point to relevant static array
  2797. break;
  2798. case(4): // flute
  2799. strcpy(instrument->name,"flute");
  2800. instrument->partial_cnt = 20;
  2801. instrument->line_cnt = 2;
  2802. instrument->env_len = 12;
  2803. instrument->has_vibrato = 1;
  2804. instrument->maxvibdepth = 0.5;
  2805. instrument->packettype = 0;
  2806. instrument->squeeze = 1.0;
  2807. instrument->centre = -0.8;
  2808. instrument->rangebot = 60;
  2809. instrument->rangetop = 92;
  2810. instrument->overlap = 0;
  2811. instrument->doublestop = 1;
  2812. instrument->balance = 0.35;
  2813. instrument->spectrum = flute; // Point to relevant static array
  2814. instrument->env = flutenv; // Point to relevant static array
  2815. break;
  2816. case(5): // violin
  2817. strcpy(instrument->name,"violin");
  2818. instrument->partial_cnt = 12;
  2819. instrument->line_cnt = 4;
  2820. instrument->env_len = 12;
  2821. instrument->has_vibrato = 1;
  2822. instrument->maxvibdepth = 1.5;
  2823. instrument->packettype = 0;
  2824. instrument->squeeze = 1.0;
  2825. instrument->centre = -0.8;
  2826. instrument->rangebot = 55;
  2827. instrument->rangetop = 96;
  2828. instrument->overlap = 0;
  2829. instrument->doublestop = 4;
  2830. instrument->balance = 0.5;
  2831. instrument->spectrum = violin; // Point to relevant static array
  2832. instrument->env = violenv; // Point to relevant static array
  2833. break;
  2834. case(6): // cello
  2835. strcpy(instrument->name,"cello");
  2836. instrument->partial_cnt = 11;
  2837. instrument->line_cnt = 4;
  2838. instrument->env_len = 12;
  2839. instrument->has_vibrato = 1;
  2840. instrument->maxvibdepth = 1.8;
  2841. instrument->packettype = 1;
  2842. instrument->squeeze = 1.0;
  2843. instrument->centre = -0.8;
  2844. instrument->rangebot = 36;
  2845. instrument->rangetop = 72;
  2846. instrument->overlap = 0;
  2847. instrument->doublestop = 4;
  2848. instrument->balance = 0.7;
  2849. instrument->spectrum = cello; // Point to relevant static array
  2850. instrument->env = cellenv; // Point to relevant static array
  2851. break;
  2852. // NB: BE SURE TO INCREASE orchestra_size WHEN ADDING A NEW INSTRUMENT!!!!
  2853. }
  2854. instrument->line_entrycnt = (instrument->partial_cnt * 2) + 1; // No of items in line defining spectrum at specific time
  2855. instrument->spec_len = instrument->line_entrycnt * instrument->line_cnt; // Total number of entries for spectral data
  2856. }
  2857. return FINISHED;
  2858. }