CN1369188A - 用于声复制的补偿系统和方法 - Google Patents

用于声复制的补偿系统和方法 Download PDF

Info

Publication number
CN1369188A
CN1369188A CN 00811556 CN00811556A CN1369188A CN 1369188 A CN1369188 A CN 1369188A CN 00811556 CN00811556 CN 00811556 CN 00811556 A CN00811556 A CN 00811556A CN 1369188 A CN1369188 A CN 1369188A
Authority
CN
China
Prior art keywords
response
parameter
value
frequency
filter
Prior art date
Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
Granted
Application number
CN 00811556
Other languages
English (en)
Other versions
CN100382657C (zh
Inventor
麦茨·米尔博格
亚历克斯·里姆伯里斯
蒂莫西·E·昂德斯
基思·O·约翰逊
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Microsoft Technology Licensing LLC
Original Assignee
Pacific Microsonics Inc
Priority date (The priority date is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the date listed.)
Filing date
Publication date
Application filed by Pacific Microsonics Inc filed Critical Pacific Microsonics Inc
Publication of CN1369188A publication Critical patent/CN1369188A/zh
Application granted granted Critical
Publication of CN100382657C publication Critical patent/CN100382657C/zh
Anticipated expiration legal-status Critical
Expired - Fee Related legal-status Critical Current

Links

Images

Classifications

    • HELECTRICITY
    • H04ELECTRIC COMMUNICATION TECHNIQUE
    • H04RLOUDSPEAKERS, MICROPHONES, GRAMOPHONE PICK-UPS OR LIKE ACOUSTIC ELECTROMECHANICAL TRANSDUCERS; DEAF-AID SETS; PUBLIC ADDRESS SYSTEMS
    • H04R5/00Stereophonic arrangements
    • H04R5/04Circuit arrangements, e.g. for selective connection of amplifier inputs/outputs to loudspeakers, for loudspeaker detection, or for adaptation of settings to personal preferences or hearing impairments
    • HELECTRICITY
    • H04ELECTRIC COMMUNICATION TECHNIQUE
    • H04RLOUDSPEAKERS, MICROPHONES, GRAMOPHONE PICK-UPS OR LIKE ACOUSTIC ELECTROMECHANICAL TRANSDUCERS; DEAF-AID SETS; PUBLIC ADDRESS SYSTEMS
    • H04R25/00Deaf-aid sets, i.e. electro-acoustic or electro-mechanical hearing aids; Electric tinnitus maskers providing an auditory perception

Landscapes

  • Physics & Mathematics (AREA)
  • Engineering & Computer Science (AREA)
  • Acoustics & Sound (AREA)
  • Signal Processing (AREA)
  • Circuit For Audible Band Transducer (AREA)
  • Obtaining Desirable Characteristics In Audible-Bandwidth Transducers (AREA)

Abstract

一种声音补偿系统,改变输入到一个具有有关性能特性的声复制器件的电气声频信号。器件的性能特性由声复制器件的分立元件的各个或组定义,并且包括机械、声学及电磁性能。模型包括模拟声复制器件的性能特性的至少一个的多个滤波器。滤波器由数字信号过程或由模拟电路定义,并且其特征在于有关频率、时间、相位及瞬态响应的一个或多个。这些响应结合以定义对于模型的整体响应。滤波器包括可调节参数,这些可调节参数用来改变滤波器响应,以产生与未改变滤波器的响应共轭并因而与声复制器件的响应共轭的响应。一个控制器修改参数。

Description

用于声复制的补偿系统和方法
本发明一般涉及一种用在声传输和复制系统中的补偿方法和系统,并且更具体地说,涉及一种使用参数值借助于象用在传输或复制系统中的器件或元件之类的性质或响应控制或调节具有转换或模型的过程的补偿方法和系统。
大多数声频复制系统使用机电扬声器声学地复制声频信号。扬声器的电气;机械、及声学性质常常比理想的差,引起失真、响应异常、及声的其他着色。多种技术用来补偿扬声器的特性,以便提高接收的感觉声频质量。
扬声器的功能或性能模型用在实际中,并且在文献中发现产生这样的补偿。模型和模型化过程如何工作的一个良好例子在“扬声器的有源等效”,Speaker Builder,1997年2月中描述。模型强化技术语言,并且通常打算模仿或模拟来自电刺激的扬声器系统的声学响应。模型产生或合成从形成集体表示或性能象扬声器的全部或部分的元件的功能组频繁地开始。线圈和磁铁部分成为由电阻器、电感器、电容器、反EMF(电动势)发生器及其他转换部分表示的电机。诸如空气体积、运动质量、声学加载、磁性制动、及机械损失之类的因素的组合可以分析,并且简化成LCR谐振器网络或电路。最经常的是,把在模型中表示的转换机电、声学、及机械表示进一步简化或减小到较少元件。模型仍象扬声器响应,但形成模型的部分已没有对于形成扬声器的部分的准确性能等效。因此,当改变扬声器部分时,传统模型既不打算也不能够参数寻址的零相位补偿。
人们能特征化和颠倒良好设想模型的频率响应以及其他性质,并且实现扬声器的线性相位校正。该技术的确逐渐变得流行,但其依靠传统模型的专用、不灵活电路或特殊过程限制其用于一种单扬声器设计。一些建造成在多个驱动器中划分信号频谱的高质量分频网络可能具有象这样的某种共轭响应校正。
低频谐振放大打算为多数扬声器而设计。常常是,使传统模型表示可量化和可预计声学性能以及影响低音响应的其它扬声器设计因素。机械构造和空气的性质确定频率、谐振损失及对于来自扬声器的声学输出的结构影响。能以这种方式设计和实施对于零相位共轭的良好近似或用于较宽频率的相同量级校正。需要几个器件匹配谐振性能,但当对于类似概念和设计的不同扬声器进行调节时都彼此相互作用。因此,操作不会严格地参数控制,因为必须由模型重新计算调节以产生最小相位或关于新扬声器最逼真所需要的准确匹配。当添加较多校正时,相互作用问题变得难以克服。每当进行调节时,必须经验地调谐或模型分析系统。因此,用于响应平化的集总模型过程固有地为特定扬声器而设计。对于其它扬声器必须重新设计该过程。
传统曲线拟合方法可能需要建立的几百个数据点和对应调节及匹配需要频率响应的多个器件或较多处理功率。模拟方法是不实际的,而数字过程需要较多计算和实现这点的扩展构造。两者没有扬声器和其操作的知识都不能提供相位准确响应或以后描述的隐藏校正。没有一个模型,由测量响应把振幅、时间和相位校正结合在一起的努力成为困难的。
扬声器的最重要性能的一些(关于声学感觉效应)由传统方法不能模型化或实施。这样的性能包括驻波干扰、形式分散、及耦合谐振以及来自这样的潜在相互作用声学和机械性能的非线性后果。反生产随机运动或分散可能发生。即使当平均响应保持扁平或者与复制的其它频率相同时,能量在信号刺激期间也能积累而当信号变化或停止时也能释放。另外,与运动部分的刚性和用于远离驱动音圈的运动的高频去耦有关的其它空间因素需要考虑。这些任一个能产生源运动、延迟能量释放、及对于双耳听觉的相位误差。常常是,这样的破坏响应可能是不可见的,或者由传统麦克风和频谱分析器校准方法非常难以解释。
例如,由节点和驻波性能产生的多余响应影响扬声器的稳定时间、方向性能及辐射输出。常常是,这些响应引起对于信息信号的感觉变化,可是由响应线图不可能见到或识别。具有大存储能量的机械运动在换能器不同部分处可能异相。声学输出可能显得是平的,但人双耳听觉能把 性能定位到其源,并且改变的感觉能使立体成象变坏。
经常是,机械干扰是可听见的,可是由使用频率扫描和麦克风进行的响应测量是不可见的或难以解释。辐射表面的部分能以对于其他部分的不同相位关系振动,从而其辅助声学输出与在换能器内的运动和涉及的能量存储相比较低。当在节点频率处的信号变化并且突然停止时,存储能量的释放能与在不同频率处的其他信号相互作用。在两个频率之间的生成差拍声能是可听到的并且非常令人讨厌。具有在干扰频率范围中的频谱的声音可能显得较响和是粒状的。人双耳听觉能把干扰定位到驱动器或从其方向波瓣可能回波的表面,由此进一步损害来自多扬声器立体声复制的舞台幻觉。对于这种情形,必须足够地衰减产生机械干扰的频率,以防止结果响应的未掩蔽复制。经验已经表明,实现这点需要的尖锐深切口除去校正频率周围的足够能量以产生鼻声。如果修改这种不适当校正以实现平响应,那么机械声音与潜在多余平衡象差一道保持。多个小扬声器用换能器、外壳、及扩展低音响应的谐振装置,如端口或无源辐射器,建造。通常,这些部分设计成实现在效率、频率响应精度、低音扩展、及可接收失真之间的实际和经济平衡。便宜、低功率系统的设计者一般选择较高效率,以便与电源和包装的有关成本一道减小放大器要求。平衡情形暴露多个有害的性能方面。
大多数传统扬声器校正方法应用振幅均衡的某种变化以平化和扩展来自扬声器的响应。调节有时通过耳朵实现。为了成为定量的,人们必须获得有关数据。实现这点的大多数普通技术使用来自噪声刺激的频谱分析。然后,响应图线或显示器指示均衡器如何调节。基于延迟接收或抽样窗口的较成熟技术能测量来自扬声器的第一到达响应,并且能除去高频室内干扰以产生无回声数据。目的是捕获与室内听众或与其中通常离扬声器一米指定和放置一个试验麦克风的标准测量实践有关的信息。这样的技术对于单点试验麦克风产生可以发声平衡的响应。一种或多种已知系统通过调节路径长度、或时间延迟把多个扬声器对准一个收听位置稍微胜过这种技术。
其他技术在一个事件之后提供频谱图线的瞬态响应波形、瀑布或连续。 获得群延迟和时间有关的信息。这样的数据需要解释,并且对于频率响应水准测量作业具有有限用途。能识别一些性能响应,但必须知道关于扬声器的更多信息。为此需要诸如加速度计、微分声探针、以及麦克风之类的测量器件。检测仪器可以靠近一个怀疑性能场合放置,并且运动以探测响应如何随位置变化。能调谐加权切口或缓慢地扫过怀疑频率,同时主观地观察噪声产生。需要关于零件尺寸、收听位置、以及地板、书架、可能的计算机监视器、或可能是收听环境部分的其他介入物体的更多信息。需要其他说明或表示以完成能够实现时间相位准确校正的共轭模型。
操作员通过调节图象均衡器、相互调谐一个参量滤波器、或改变对于一个交叉器件的设置能承担对准角色。工业模拟元件实现这些功能,但他们有限制。图象均衡器具有高达31个频带或谐振器,参量器件包括几个可调节滤波器,并且少数个具有可变交叉和搁置功能。需要更多个滤波器。图象和参量均衡器的组合不能够提供足够大数量的点,也不能提供有效地补偿来自扬声器的复杂性能的准确相位和响应。校正不会匹配特定频率,由此产生相位误差,或者滤波器的数量不适于处理稳定时间和驻波问题。群延迟失真、时间相位误差、不完整校正及其他缺点可能胜过其他改进。
DSP滤波器能创建比实际来自模拟电路多的多个滤波器部分。对于产生室内响应水准测量的特别控制发生软件,已经使用了用参量控制部分组成的图象均匀器。这样的过程难以建立,因为房间与重要性能指示器的辨别相干扰。没有其输入,共轭响应校正就是不可能的。驻波和节点失真校正能由这样一种系统形成。然而,参量运动补偿切口需要的笨拙编辑和处理是困难的。最可能,单点响应拾波和FFT已经用于输入到系统的数据。这样的方法不能响应或提供创建对于扬声器的真实共轭响应需要的时间相位信息。分析系统,如MLSSA,能从测量除去房间干扰,并且能产生来自一个扬声器系统的频率、瞬态和稳定响应数据。然而,必须译码来自这些测量的大量数据。多频带图象均衡器不是建立校正的一种良好选择。
DSP系统能经济地创建多个参量滤波器和用模拟电路不能实现的有关过程。传统大规模DSP系统几乎没有由其他测量异常辨别和选出扬声器性能的装置。它们的频域响应可能添加相位误差和忽视延迟稳定能量。对于一个收听位置声音可能改进,但对于所其它位置声音将变坏。更可能的是,复制声音将变化而没有决定性的改进。
所以,与声音复制有关的那些人已经认识到,需要一种模型化声音复制器件的完整性能的系统和方法,从而可以创建对于声音复制器件响应的共轭响应。也已经认识到对一种采用可改进共轭响应的系统和方法的需要。另外,也已经认识到对补偿独立于其中要收听声音的环境的声音复制的系统和方法的需要。本发明满足这些需要和其他需要。
简短和一般地说,本发明提供一种用来模型化声音复制器件的各个响应特性的系统和方法,以创建一种用来改进器件的频率、时间、相位及振幅性能的共轭模型、和提供改进的声平衡、声音清晰性、减小失真及改进的立体成象。
在第一方面,本发明涉及一种用来修改输入到一个其特征在于多个个别响应的声复制器件的电气声频信号的设备。器件的个别响应结合以定义一个整体响应。每个个别响应包括频率、时间、相位或瞬态响应的一个或多个。该设备包括多个修改滤波器,这些滤波器具有模拟声复制器件的多个个别响应的修改响应。修改滤波器接收电气声频信号,修改电气声频信号,及把电气声频信号提供到声复制器件。该设备进一步包括多个可调节参数。调节参数的每一个与修改滤波器的至少一个有关。可调节参数允许对于修改滤波器的响应的调节。调节创建多个个别共轭响应。每个个别共轭响应与多个个别响应的至少一个有关。
通过创建具有模型化复制器件的个别响应的响应的多个滤波器或网络和提供用来调节滤波器或网络响应的参数,系统允许把特定相对或校正响应提供给复制器件的响应的共轭响应的创建。
在本发明的详细方面,声复制器件的多个个别响应与声复制器件的机械、声学及电磁性能的至少一个有关。在本发明的另一个详细方面,多个修改响应结合以形成与声复制器件的整体响应共轭的整体响应。在本 发明的又一个详细方面,修改滤波器的至少一个包括一个截止滤波器,并且用来调节截止滤波器的频率响应的参数包括波峰频率、振幅及Q参数。在本发明的再一个方面,修改滤波器的至少一个包括一个恒定斜率均衡器,并且用来调节恒定斜率均衡器的频率响应的参数包括交叉频率和提升搁置参数。在本发明的其它详细方面,修改滤波器的至少一个包括一个参量切口滤波器,并且用来调节参量切口滤波器的频率响应的参数包括切口频率、振幅和Q参数,而修改滤波器的至少一个包括一个参量切口提升滤波器,并且用来调节参量切口提升滤波器的频率响应的参数包括切口频率、振幅和Q参数。
在第二方面,本发明涉及一种用来改变输入到具有有关性能特性的声复制器件的电气声频信号的声音补偿系统。该系统包括声复制器件的一种模型。该模型包括模拟声复制器件的性能特性的至少一个的多个滤波器或过程。每个滤波器具有结合以定义对于该模型的整体响应的有关响应。每个个别响应包括频率、时间、相位或瞬态响应的一个或多个。系统也包括一个修改多个滤波器每一个的响应以把该滤波器转换成一个共轭滤波器的控制器。每个共轭滤波器具有与滤波器或过程的原始响应共轭的响应。
在本发明的一个详细方面,性能特性由声复制器件的分立元件的单个或组定义。通过模型化复制器件的分立元件和那些元件或元件组的特性,能创建和参量操纵对于这些特性的个别补偿。因此,这些相同的补偿能应用于具有类似元件或特性的辅助系统。
在本发明的其它详细方面,滤波器由数字信号过程或由模拟电路定义,并且控制器包括一个计算机或可调节电路元件。在本发明的其它详细方面,声复制器件包括一个扬声器,并且多个滤波器的至少一个包括至少一个有关可调节参数,并且根据从一个标准扬声器模型导出的或使用标准试验测量经验确定的扬器物理特性计算参数的值。在本发明的又一个详细方面,这样配置控制器,从而在一个参数设置中的调节调制至少一个其它参数的设置。在本发明的再一个详细方面,控制器监视在声复制器件处的程序条件,并且根据程序条件设置参数值的至少一个。
在第三方面,本发明涉及一种声音系统。该声音系统包括一个具有有关机械、声学及电磁性能特性的声复制器件。该声音系统也包括一个用来把一个电气声频信号输出到声复制器件的一个模型的源。该模型包括模拟声复制器件的机械、声学和电磁性能特性的至少一个的多个滤波器。每个滤波器具有包括频率、时间、相位或瞬态响应的至少一个的有关响应。该模型把电气声频信号输出到声复制器件。该声音系统进一步包括一个控制器,它修改滤波器的响应,以把该模型转换成一个具有带有包括与该滤波器的原始响应共轭的响应的多个滤波器的共轭模型。
在第四方面,本发明涉及一种用来修改输入到一个声复制器件的电气声频信号的方法,该声复制器件的特征在于结合定义对于声复制器件的整体频率响应的多个个别响应。每个个别响应包括频率、时间、相位或瞬态响应的一个或多个。该方法包括步骤:用多个滤波器模拟多个个别响应;和调节多个滤波器的响应,从而对于每个滤波器,调节响应包括与个别响应之一共轭的响应。该方法进一步包括把电气声频信号输入到滤波器的步骤。
在本发明的一个详细方面,滤波器的至少一个包括一个截止滤波器,并且调节截止滤波器的频率响应的步骤包括设置波峰频率、振幅及Q的至少一个的步骤。在本发明的另一个详细方面,滤波器的至少一个包括一个恒定斜率均衡器,并且调节恒定斜率均衡器的频率响应的步骤包括设置交叉频率和提升搁置的至少一个的步骤。在本发明的又一个详细方面,滤波器的至少一个包括一个参量切口滤波器,并且调节参量切口滤波器的频率响应的步骤包括设置切口频率、振幅和Q的至少一个的步骤。在本发明的再一个方面,滤波器的至少一个包括一个参量切口提升滤波器,并且调节参量切口提升滤波器的频率响应的步骤包括设置切口频率、振幅和Q的至少一个的步骤。
在第五方面,本发明涉及一种改变输入到一个具有有关性能特性的声复制器件的电气声频信号的方法。该方法包括用多个滤波器模拟声复制器件的性能特性的至少一个的步骤。滤波器的每一个具有包括频率、时间、相位或瞬态响应的至少一个的有关响应。该方法进一步包括步骤: 对于滤波器的每一个,修改滤波器的响应,以把滤波器转换成具有一种包括与该滤波器的原始响应共轭的响应的共轭滤波器。
在本发明的详细方面,声复制器件包括一个扬声器,多个滤波器的至少一个具有至少一个有关可调节参数,并且修改滤波器的响应的步骤包括如下步骤对的一个或多个:根据扬声器的物理特性计算可调节参数值的值和把参数设置到计算值,由一个标准扬声器模型导出可调节参数和把参数设置到导出值,及使用标准试验测量经验地确定可调节参数;和把参数设置到确定值。在本发明的又一个详细方面,该方法进一步包括步骤:响应另一个参数的设置调制至少一个参数的设置。在另一个详细方面,该方法进一步包括步骤:监视在声复制器件处的至少一个程序条件,和根据程序条件设置参数值的至少一个。
保持声中性的这些特征和能力使得一种补偿系统和方法能够复合、动态地改变能用简化、直觉控制特性控制和调节的响应校正。与传统响应水准测量方法相比较,补偿方法和系统要求较小的处理复杂性,并且能容易地应用于不同的声音复制系统。补偿方法和系统,作为整体或片部分,能接通或断开,从一步骤运动到另一个,或者由简单、直觉命令改变。
由如下详细描述,当结合通过例子表明本发明最佳实施例的附图时,将明白本发明的这些和其它方面及优点。
图1是包括一种按照本发明的补偿系统的声复制系统的方块图;
图2是具有多个修改滤波器的补偿系统的方块图,每个具有用来修改滤波器的频率、时间及相位响应的一个或多个的多个可调节参数;
图3a-3c描绘用于扬声器的多个响应元件;
图3f描绘当结合图3a-3e的个别响应时形成的整体响应;
图4a-4e描述用于补偿系统的多个可调节响应,每个响应是可调节的以形成对于图3a-3e的响应元件的共轭响应;
图5是曲线图,描绘对于产生一个有功声输出的圆锥的运动;
图6描绘用于两个小扬声器驱动器的频率响应;
图7描绘其中在右边的箭头表示增大时间轴的瀑布线图;
图8a-8f描绘用来调节参量控制以便修改修改滤波器的响应的一系列图形用户接口;
图9是低通/高通波峰滤波器的示意图,其中所有的C必须变化以运动频率;
图10是提升并且具有近参量独立的有源RC或恒定斜率均衡器的示意图,其中Cc和Rc都非常大以偏置op amp;
图11是频率可运动切口的示意图;
图12是频率可运动切口的一种可选择结构的示意图;
图13包括一个加权切口滤波器的和用于提升的响应的示意图、及使用滤波器可得到的切口元件和组合响应;
图14包括一个多重谐振加权切口滤波器的和用于提升的响应的示意图、及使用滤波器可得到的切口元件和组合响应;
图15描绘对于一个切口滤波器的频率、和相位响应;
图16是显示干扰模拟器/补偿器的示意图,其中CW等于与干扰相同的响应,CCW等于共轭校正及RC等于用于较高频率的减小补偿;及
图17是全通或相移网络的示意图。
如下描述集中在本发明对于扬声器的应用上。然而,本发明不限于这样的用途,并且可以应用于其他声传输和复制器件,如在说明书未尾叙述的那些。
现在参照附图,其中类似标号在所有图中指示类似或相应部分,并且具体地对于图1,表示有一种包括本发明的系统10。系统10包括一个信号源12,用来提供电气声频信号。信号源可以是例如一个CD唱机。来自信号源12的输出14输入到一个采用本发明的详细特征和方面的补偿系统16。输出14由补偿系统16处理,以产生一个供给到一个功率放大器19和一个扬声器20的补偿电气声频信号18。
参照图2,补偿系统18采用多个滤波器24,滤波器24或者个别地或者组合地呈现模拟由扬声器的各种机械、声学和电磁元件呈现的频率、时间和相位响应的个别补偿响应。与滤波器24的每一个,并因而与补偿响应的每一个,相联系的是一个或多个可调节参数22。使用DSP或模拟 电路创建滤波器24。数字信号处理是最佳实施,因为扬声器性能的分析模型容易转换到用于设计数字系统的数学综合技术。模拟电路具有建立在级联结构中的失真。因此,仅当模拟设计者知道在性能响应是隔离和无相互作用时使用并联连接电路元件时,补偿系统18的实际模拟实施才是可能的。一些参数22调节与补偿系统的一个或多个部分相互作用。一种数字实施提供利用可能设置的编辑或按需要计算这些关系的能力。当由计算机控制补偿系统时,建立调节显得简单和直观。
这些计算和可调节补偿响应的每一个能定标到尤其与尺寸、运动性质或声学辐射性能有关的参量变量、特征、或设计方面。能调节扬声器的时间延迟、最大漂移极限、波长关系、节点和驻波频率、边界反射及类似性质,并且由补偿系统使用。代替编辑或减小扬声器元件以创建一个集总响应系统,补偿系统使用最小相位均衡和无相互作用滤波器串。
对于小扬声器的典型整体响应表示在图3f中。在图4的顶部处重复相同的响应。图3a-3e表示与结合产生整体响应曲线的扬声器元件有关的多个个别响应。图4a-4e表示经多个可调节参数,例如LS、HS、LX、HX等,调节以产生多个共轭响应的多个个别补偿响应。下面详细描述参数的性质。如图4f中所示,个别共轭响应组合以产生或一个整体共轭响应。整体扬声器响应(图3f)和共轭响应(图4f)的组合产生一个平稳响应。
由图3a和4a,对于高和低频的第一和第二截止反射是显然的。在曲线上的这些点确定用于LX、LS、HX、和HS的频率。当音圈长度和运动互补能力已知时,那么类似于图5中表示的一种的计算或图表能帮助确定用于LP的合理频率和振幅。以类似的方式处理HP。有关的反射、截止、和频率表示在图3b和4b中。LP和HP的振幅设置具有主观功率处理和加权补偿问题。
在其外壳体中操作的驱动器的自谐振能测量或计算以产生W0。由传统模型能试验地测量和计算有关的Q0和|A|0设置,条件是已经除去声学耦合因数。图3d和4d表示这种低音补偿。
在常规模型中很少使用机械谐振的表示,象W1。图3d和4d的高频部分表示,来自W1的声学响应误差和着色能由设置|A|1除去。注意周 围谐振,并且能选择预置或缺省Q,以补偿象征着涉及的扬声器材料的谐振性能模型。
节点和干扰性能在图3e中是显然的。在图6中的其他例子揭示节点跳跃、干扰、及因为粗糙、污染声音的常常叫做“锥叫(cone cry)”的相关问题。与表示在图7中的那些类似的瀑布或MLSSA能表示象征这样的高能量运动干扰的频率和延迟分散结果。图4e中的隐藏补偿切口WCC1和WCC2除去这些频率和能量存储问题。
添加斜坡或倾斜EQ以实现最好的听众喜好。图3c和4c表示性能和校正。为了主观平衡可以添加辅助向下倾斜。
如能看到的那样,每个横跨少到8位分辨率的近似12至16次调节能进行非常良好的共轭校正。来自两个扬声器驱动器单元的代表性频率响应表示在图6中。注意,如由在低端处的响应曲线的滑离指示的那样,与LP有关的W0和第二反射响应丢失,因为驱动器在非常大的壳体中操作。除此之外,其它的参量相关特征是显然的,并且由这些曲线能算出调节。
如下参数允许扬声器的复合频率、相位、及时间响应的创建、模拟或与其共轭。这些可调节参数22和其操作能近似零相位响应,扩展低音输出,及从扬声器除去机械声音(能以类似方式使用其他参数)。使用有源或无源模拟电路,如RC电路、模拟谐振器、或象状态变量滤波器或双石英片之类的全参量电路,能数字地进行个别补偿。
术语 缩写 描述、关系
低交叉 LX 辐射面积、柔性、空气体积、声学耦合、及BL因数。(第一反射@+/-6dB每八度)
高交叉 HX 质量、辐射面积关系、刚度、BL因数。(在每八度@+/-6dB下的第一反射)
低提升搁置 LS 设计极限、声平衡、(XdB停止斜率)
高提升搁置 HS 设计极限、功率处理、有用的响应线性(XdB停止斜率)
低波峰 WL 用于第二耦合反射的提升。用于高通或低频极限滤波器的隐藏补偿。(缺省截止斜率、XdB波峰)
高波峰 WH 用于第二高频损失的提升。用于低通或高频极限滤波器的隐藏补偿。(缺省截止斜率、XdB波峰)
电机 BL 力、反电动势、电感因数。调制响应和参量值的影响
低音谐振 W0 音量、柔性、面积、阻尼、BL因数。(频率、Q、振幅)
术语 缩写 描述、关系
端口调谐 WB 低音调模型(传统的)(用于双调谐滤波器模型的输入)
机械谐振 W1、W2、至Wn 系统的部分包括板、锥、周围场、及圆顶(频率、Q、和振幅)
稳定谐振 WCC1、WCC2、至WCCn 节点模式:驻波、钟形模式、延迟耦合干扰(加权切口频率、Q及振幅)
耦合因数 |A|1、|A|1…|A|n 谐振数值(谐振器的总是可调节的部分+/-dB)
损耗因子 Q0,Q1…Qn 谐振带宽(缺省或调节可能+/-dB)
倾斜 dB 离开频率平衡输出:BL因数。主观平衡和缺省放置平衡
波干扰 Td 尺寸:壳体、地板、壁、扬声器和听众放置。
平衡 EQ 用户操作的:房间、其他传统的
功率 PW 最大低频输入或输出。模拟比例或阈值开关探测器
模式开关 SW1、SW2、等 动态过程:操作或选择
在8与32参数调节之间的某处可以用来编程补偿系统和操作一个适当的补偿过程。由于参数与专用物理和性能方面有关,所以对于调节范围和精度的数据要求远小于覆盖人类感觉所需要的。八位分辨率对于这些的多数是适当的,从而一个1-5k位的单次数据流特征化来自模型的一个非常复杂的响应。以上参数的描述如下。
低交叉(LX)或声学耦合-低频输出取决于辐射表面的尺寸。来自这种关系的每八度6dB损失由增大的锥运动固有地补偿,条件是来自电机结构的反电压与驱动信号相比较小。如果柔性是无限的并且电机产生力而没有速度限制,则这种理想化的配置具有平响应。具有空气体积、机械刚度、及速度极限的真实系统具有两个实际交叉点,其中响应从平的中止,并且会聚到6dB/八度和然后到12dB/八度低音损失。通常,第二反射靠近扬声器的最低有用响应,并且常常成为不实际地补偿。用于这种补偿的控制参数是单位为Hz的频率,并且共轭响应(特定补偿)对于减小频率是+6dB/八度提升。这种提升在来自扬声器的第一响应反射处开始。用于该参数的值能通过向扬声器施加一个试验信号,例如正弦波,和测量响应而测量。根据扬声器的物理特性,如锥和线圈质量,也可以计算该值。由扬声器模型,如一般由扬声器制造商提供的标准Theil/Small模型,也可以导出该值。
高交叉(HS)或质量柔性因数-高频输出取决于辐射表面的尺寸和速度。通常,用于靠近截止的频率的感兴趣波长与创建输出的扬声器的运动相 比较小。锥材料的刚度和阻尼性质影响以较低频率来自整个表面的辐射的这种过渡。频率辐射越高,越靠近音圈。运动质量最终借助于增大频率创建运动的6dB/八度减小。来自电机组件的漏电感把另外的柔性添加到系统上,以在最高实际频率下创建进行12dB/八度下降的第二反射。这些损失与减小的辐射面积相结合,创建声学输出的减小。在较低频率下,能熟练地平衡两种关系以产生平声学响应。用于这种补偿的控制参数是单位为Hz的频率,并且共轭响应是具有增大频率的6dB/八度提升。以与对于低交叉在以上描述的相类似的方式能测量或计算用于该参数的值。
低提升搁置(LS)-来自LS的最大提升限制到来自放大器功率、锥运动、音圈长度、壳体尺寸、及打算低音扩展的实际最大极限。这些要求矛盾和相互作用,例如音圈要求越长,放大器和悬挂部分越大。例如,一个延长的线圈能提供较大的线性漂移和低音输出潜力,但效率减小,除非增大来自磁铁的磁通能量。增大漂移要求较大的周围场,并且必须增大锥直径以保持相同的辐射面积和低音输出。低音谐振越低,而扬声器必须物理上越大,并且增大的运动质量进一步减小效率。如果限制放大器功率,则壳体变得较大。LX、W0(下面描述)和LS参数的操纵使有效或扩展响应扬声器设计具有小得多的折衷。另外,能使LS参数改变或跟踪不同的音量控制设置和程序动态,从而扬声器系统能靠近其最大能力在宽范围条件下操作。LS参数受设计和结构因数的影响,这些因数包括辐射面积、柔性、及驱动电机的力因数。模型化参数能以非常小的相互作用能跟踪变化至这些因数。LS参数是+/-dB。LS参数设置能经试验测量通过具有折衷权衡的试验确定。
高提升搁置(HS)-扬声器的实际最大性能和功率处理能力限制最大高频 率提升。在某些用途中,可以把HS参数设置成减小来自源的感觉失真代之以来自扬声器。关于LS,通过命令能使内部操作设置变化。当系统的其它部分,包括程序材料,按压成在其最大线性功率能力上方操作时,这种特征能帮助覆盖增大失真。HS参数是+/-dB。其设置最好经试验测量试验地确定。
低波峰(WL)-谐振低音截止常常是希望的。为此平衡记录,并且把大多数扬声器设计成具有自谐振低音增强。一般,较大扬声器具有较低谐振频率,并且听众把值联系到这种关系上。WL参数提供在扬声器本身的自然自谐振(W0)下面的低频谐振提升。当低QL补偿响应下降除去W0效应时,扬声器系统就象它较大那样电气和声学地动作。它不会具有平衡小扬声器的隆隆或箱声音。为了防止过分失真和功率抽取,在WL下面的信号迅速衰减,并且涉及的高通滤波器跟踪WL参数设置。这种作用具有与加权补偿类似的主观因数,因为在截止下面的频率可能弱小,但当不由在人类听觉的WL临界频带中的其他声音掩蔽时仍能听到。一般,调节和设置WL波峰,以便对于最大回放条件控制功率和失真。对于其他条件,能关闭高通或次低音滤波器,并且运动或改变低通滤波器的(LP)的部分而没有明显的主观结果。如描述的那样,能动态地调制WL参数以扩展低音或减小失真。低通滤波器的响应的调节包括波峰频率(WL)和单位为dB的振幅|AL|。意味着缺省QL设置。
高波峰(WH)-谐振截止可能是希望的以补偿第二截止反射,或者它能用来限制复制带宽。第一用途能扩展响应和减小群延迟失真。带宽限制可能是需要的以使失真程序声音较好。波峰谐振器跟踪高通滤波器(HP)以与低频波峰系统相类似的方式操作。高通滤波器能排列成创建加权响应限制和提供在临时设计实践中最佳的波峰截止响应。高通滤波器调节包 括单位为Hz的波峰频率(WH)和单位为dB的振幅(|AH|)。意味着缺省QH设置。
电机(BL)磁铁结构和音圈的性质统一到传统表示。音圈直径、绕组长度、间隙磁通、磁极尺寸等是创建电机和发电机当量的传统扬声器模型的部分。关于电流和机械运动、以及其他与机械性质有关的因数的力和反EMF关系得到简化表示。有时包括漏电感和机械质量关系。这些元件由各种装置测量、计算或导出,以创建能影响扬声器多个性能方面的一组电机相关参数。对于补偿系统和其处理的可调节参数取决于BL。因此,如果需要,模型能具有建立的关系,从而BL变化能调制参数设置。例如,BL特性能用来跟踪或重新调节用于具有不同磁铁重量、音圈长度、或其它机电因数的类似扬声器的其它参数。可调节BL参数能是:磁通x长度、电压x速度、波峰漂移长度、及电阻/电感或时间常数。
低音谐振(WO)或自谐振-这是扬声器的自然低音谐振频率。其值由空气体积、机械柔性、辐射面积、阻尼、运动质量、电机特性、及扬声器的其他设计特征确定。不象传统低音模型,声学耦合因数不是W0响应的部分,因为它在补偿系统的LX参数中已经描述。这种布置防止在调节参数之间的相互作用,并且对于机械性能的等效转换到机械性能的LCR谐振器等效。频率W0、Q0和耦合能量或振幅|A0|的用户命令语言能规定对于机械谐振性能的共轭响应。因为用于系统的扬声器性能和校正响应具有相同的量极、但相反的振幅,所以群延迟性能能非常良好。调节是单位为Hz的W0,Q0作为一个数,及单位为dB的|A0|。这些调节值能由非常近范围设备、位置检测换能器;或由计算试验地确定。
端口调谐(WB)-多个扬声器设计成提供一种打算扩展频率响应或改进功率处理的第二低音谐振。这样作的物理结构包括端口、管、无源谐振器、 迷宫、其它低音喇叭等。许多文献已经致力于模型化和调谐这些系统,通常实现最平的可能频率响应。这样的模型与补偿系统相结合,有潜力扩展低音、改进过渡响应、及改进效率而不增加扬声器的成本。能结构设计较大功率处理和扩展低音能力,并且通过共轭校正能除去由使用这种策略生成的频率响应奇异性和端带失真折衷。当进行这种选择时,端口能较大并且调谐较低、使壳体较小、以及改进低音的其他变化。粗响应和次低音过载的生成结果由补偿系统颠倒。标志或开关能是控制操作的部分,这种控制操作辨别程序条件或在扬声器处的响应状态。来自样本或试验的极限状态确定用于该前馈/反馈型系统的开关状态。然后,从开关或状态输入选择参数系数。以这种方式,补偿系统能借助于模糊逻辑控制或其它方法操作,以防止对于参数值的不必要肘动(toggling)或变化。例如,不同的音量控制设置、程序水平、或低音内容能改变参数系数和排列,以实现较高功率或较平响应优化。开关操作可能是可听的,但控制磁滞提供较不明显或客观的策略变化。便宜设备是希望的,并且可能过载或超越合理线性操作推动。以适当控制逻辑操作的补偿系统能致动柔和及响亮的操作状态,每种状态具有最优排列,而不创建其之间的失真连续。
机械谐振(W1、W2、至Wn)-扬声器系统的多个部分和动作象谐振器起作用。不象W0,这些的大多数是无意的,并且他们通常添加到扬声器的声学输出上。这些尤其包括圆顶、锥、及周围场的弯曲和质量性能、以及机箱共振。等效LCR性能参量化成无相互作用的个别校正或与用于W0的那些相类似的调节。谐振调节是单位为Hz的W1、W2、至Wn;单位的Q1、Q2、至Qn(下面描述);及单位为+/-dB的|A1|、|A2|至|An|(下面描述)。显得类似于房间响应的小、低Q谐振常常具有声冲击。不象用于传 3统响应水准测量的试验麦克风,听众能四处运动,并且及时地能检测和知道消失于宽带谐振的信号衰减。共轭校正消除该困难,并且有助于改进来自辅助平衡系统的结果。
稳定谐振(WCC1、WCC2至WCCn)-使用多谐振器切口和加权侧能量增强的隐藏补偿过程按频率放置,并且由这些控制参数调节。减小或除去来自延迟节点谐振和驻波干扰的声结果。
耦合和损失因数(|A|0、|A|1至|A|n及O1、Q2、至Qn)-用于某些频率的Q参数能估计为材料、设计、及对于扬声器普通的结构材料尽力的缺省值。由于几乎不可能由响应线图或简单测量偶然确定Q,所以固定值是实际的,并且缺省值选择简化和减小调节的数量。
波干扰(Td)-扬声器壳体的有限尺寸能创建在辐射表面后的波相关干扰压力。通常因为校正响应的复杂性忽略该问题。昂贵扬声器用具有紧密磁耦合的大电机组件建造,以战胜回波干扰。这些系统常常具有内隔板、不同类型呼收材料的层、专门成形的腔、或传输线管,以便有助于除去干扰。典型扬声器呈现来自其简单箱型壳体的建设性/破坏性波干扰,这些壳体最终引起随频率增大出现的响应波纹。关于短接效应、和来自BL的阻尼的奇异性变坏由较小磁铁、还原钢和其它经济因素减小。校正由来自一个延迟和反馈环路过程的共轭相反响应进行。尽管模拟实施是可能的,但DSP方法更经济,并且通过其本性进行对于要固定的物理性能和问题进行良好平衡。类似校正能减小来自地板、台面、墙壁等的反射干扰。
倾斜(dB)-大多数同辈听众喜爱响应随增大频率稍微降低的扬声器。当使扬声器便宜时,其响应往往升高。补偿系统校正由减小磁铁重量发生的多个问题和变化,改进效率及扩展高频响应。然而,由这些共轭校正 创建的平声学平衡与当代音调标准相比可能听起来模糊或贫瘠。倾斜创建一个补偿响应斜率。倾斜参数象一种音调控制操作,并且用来实现希望的低音-高音平衡。LX和HX的内部操纵、以及传统响应水准测量方法或过程能创建该响应。
延迟或全通-该参数及时除去信号以补偿从不同地方辐射高和低频率的换能器。调节能减小群延迟失真,改进与次低音喇叭的相位匹配,及对准过渡响应。使用物理或电气测量能进行调节。
图8a至8f表示控制板显示和用来调节参数的菜单。测量数据、设计表示、及响应曲线提供有用的信息以对于扬声器调节或调谐系统。系统产生对于扬声器那些的共轭响应,并且静静地除去延迟或长稳定机械声音。经验已经表明与更复杂常规水准测量实践相比用于许多收听位置的较好性能。对于这些功能的实施能利用普通数字过程。示范已知的数字过程在附录A中表示。可选择的已知数字实施能用来实现完全类似的结果。
使用模拟电路也可以实施补偿系统。然而,多谐振器或耦合功能的部分不可能跟踪宽调节范围,除非他们是复杂的。所以对于其功能性和与熟知较好DSP平衡的相似性表示模拟电路。这些电路具有可调节参数控制,但他们要求元件变化以模拟关于数字系统固有的参量对准精度。如下例子是具半参量调节能力和产生象描述的那些共轭响应的传统电路。
截止滤波器-Sallen和Key电路能形成具有可调节波峰响应的有源高通和低通滤波器。图9表示配置成一个单op amp的两个滤波器。中带响应是平的,并且截止斜率是+和-18dB每八度。LP和HP的波峰振幅是可调节的,并且与图4b相对应。然而,对于该电路必须预置频率。对于该例子,两部分因为其宽频率分离不相互作用。
恒定斜率均衡器-在有源反馈电路中改变RC时间常数以创建象图4a的响应曲线。表示在图10中的电路是成熟参量音调控制的提升半。对于在搁置与交叉之间的良好参量独立限制其调节范围。
参量切口-图11和12表示具有宽调谐范围的简单模拟切口电路。切口深度保持恒定,但Q随频率设置增大。能选择元件值以对于实际调节范围向Q0、Q1至Qn提供合理近似。
加权补偿切口-一个合成滤波器元件由一个或多个尖锐切口组成,每个切口使能量添加到  抑制频率的一侧或两侧。当认真选择其抑制和提升能量和带宽时,滤波器系统能借助于对于声平衡的很小折衷或改变除去多余能量。用于此目的的抑制切口是尖锐的,具有高衰减及一般是高Q。侧带补偿或恢复最好由在抑制两侧处的提升响应进行。然而,单侧补偿可能更好地为具有组合响应滑离和干扰能量问题的扬声器工作。不对称提升有助于弄平频率响应。其它方面是相同的。补偿能非常小,具有低Q,及当过程是通或断时,在集中到校正的一半到一个八度带中的平均粉红噪声能量是恒定的。
来自声音的衰减感觉移动到低Q侧带频率。因此,用于较好立即过渡响应稳定的双调谐对准希望是一种单侧或单调谐提升方法。能认真调谐和定比例生成合成滤波器,从而它能静静地在有用频率范围上调谐。没有加权,在校正任一侧的小响应损失影响鼻音。着色可能是微妙的,但当使用较多校正时,损失能克服任何优点。如果仅使响应是平的则这特别真实,因为它可能具有标准实际平衡。加权消除折衰,并且允许多重校正更有效而没有声相互作用,及当无意校正应用于具有不同性能性质的扬声器时,也消除损失。
对于任一种实施,适中加权响应切口能由添加到信号上的谐振和反谐 振响应组成。参照图13,校正元件可能包括单高Q切口,其频率集中在性能模式上。一个低Q提升响应放置在相同频率处以提供补偿等重量能量。图13的电路部分表示在反馈路径中有源电路切口和无源LRC提升谐振器的实际结合。两部分都创建加权响应切口。然而,限制调谐范围,并且低Q提升可能是可听的,因为人类听觉能分辨衰减到低Q谐振的过渡声音。
一个更好的选择例是使用两个低Q谐振提升响应,每个调谐并且放置在高Q切口的一侧或两侧处。图14表示由四个可调谐双象限(bi-quad)谐振器或状态可变滤波器组成的例子。滤波器的两个创建封闭隔开的高Q切口,而其它两个提供在外部高和低侧处的提升低Q能量。这些状态可变滤波器容易用DSP处理器创建,并且它们在宽调谐范围上保持恒定的Q和切口深度。创建图15中表示的响应的模拟系统具有在单轴上联接的八个精度可变电阻器,以调谐WCC1或加权切口参数。图13表示用于四部分之一的一个电路。图15表示用于两个不同Q设置的响应曲线,并且这些与图4d中的那些相关。能对准双调谐提升以对于过渡产生较快和较小的设置响应。象来自图的那样的双调谐切口提供类似的优点,并且也提供死带或带抑制能力,以容纳从一个扬声器到另一个的制造公差。仍然需要侧频率提升,并且最好使用双调谐谐振器。
当相邻性能模式具有类似性能时能进行其它变化和简化,就象对于大多数扬声器可能的那样。两个或多个抑制切口能分享Q和振幅设置以及补偿提升。组合包括具有三次提升的两个切口、具有两次非对称提升的两个切口、具有两次的三个切口等。能使用在两个切口之间有频率减半(halfway)的单低Q提升。具有频率在下面、在上面和在其之间的三次低Q提升是一种较好的变化。对于所有这些实施,切口深度常常较大,并 且侧频率提升通常较小。通常,使对于关于补偿区域平均的随机噪声的整体能量响应相同或稍高于没有校正。
延迟干扰或全通-一个混合模数CCD设备能创建一个较小、便利的可调谐延迟。尽管性能可能较差,但它们能象图16中的例子那样连接或配置,以提供干扰状性能。该电路能创建对于来自墙壁、桌子及扬声器壳体内部或者传输路径或系统的其它部分的波长有关反射和传输性能的近似共轭响应。电路能设置成创建一个倒相梳状滤波器或辅助干扰状响应,该响应在时间、相位及振幅方面与来自反射表面的下层干扰损失相反。校正提升消除干扰的地方。该电路也能调节成具有象响应的梳状滤波器以抵消来自扬声器壳体内的反射的辅助能量。由DSP过程能形成较好时间延迟干扰滤波器或梳状滤波器状响应。模拟和DSP都能配置成与物理反射模型相关,并且校正系统的类似其它部分由与物理性能相关的参量调节控制。延迟干扰路径滤波器具有关于尺寸、表面吸收、及需要的干扰校正量的控制。
参照图16,Td与在从扬声器到听众的直接路径与也从扬声器到听众的较长跳回路径之间的差有关。Td也与在扬声器与壳体内的相反表面之间的出去和返回路径有关。同样能特征化在扬声器后面的壁。较大Td给出较大距离。RC与表面粗糙度或在高频下的吸收有关。RC乘积越大,上部频率梳状滤波器响应和校正的损失越大或衰减越快。控制R1调节响应或校正的数值。CW方向增大下层响应,同时靠近至op amp的+输入的CCW位置给出最大辅助响应。该电路产生一个其振幅随频率减小的干扰响应。这匹配或模拟实际扬声器吸收材料的损失。对于显得更容易由补偿系统处理的物体,能试验地改变来自小扬声器的不规则响应的大部。通常,实现这点的延迟设置匹配从扬声器壳体期望的后到达波关系。 当它做时,这样一个可调节等于常规响应水准测量过程的一个数值。
图17是一个全通或相位移动网络。其频率响应是平的,然而其输出在高频下同相而在低频下异相。电路改变过渡响应而不改变频率响应。可变控制增大过渡频率,因为它转向CW。该元件是有用的以校正群延迟或其它过渡相关响应。
如上所述,由扬声器产生的机械干扰常常是可听的、而是不可见的或者仅以由使用频率扫描和麦克风进行的响应测量难以译码。使用深切口的传统补偿方法通常导致鼻音或有害平衡象差。本发明的加权补偿切口滤波器解决该问题,并且也产生一些其它优点。当两个驱动器(低音喇叭和高音喇叭)仅由一个电容器或由重叠频率的电路横穿时,一个或两个驱动器能具有干扰补偿而没有对于其它的感觉损失。同样适用于不同的收听位置。能补偿具有坏响应的一个位置而不折衷用于其它收听位置的声音。校正由加权侧能量隐藏。由于良好的收听位置不会由校正折衷,所以宽范围的收听位置能具有良好声学。这种特征对于用于剧场声音的喇叭形扬声器特别有用,其中从一种安装到另一种需要稍微不同的校正。通过对于一类扬声器或建造特征使用缺省优化,参量控制和调节是简单和直观的。
扬声器最重要性能的一些(相对于声学可感觉效应)不能由传统方法模型化或实施。这样的性能包括干扰和谐振耦合、以及来自这样的性能的非线性结果。另外,需要考虑与运动部分的刚度和用于远离驱动音圈的运动的高频去耦有关的其它空间因素。任何这些能创建源运动、延迟能量释放和对于双耳听觉的相位误差。常常是,这样的破坏性响应可能是不可见的,或者非常难以由传统麦克风和频谱分析仪校准方法解释。
参量寻址对于特定物理效应的补偿的一个例子是对于在大全范围扬声 器中机械去耦的补偿。这样的扬声器通常设计成在低频下具有全部锥运动。在高频下,只有驱动器的内部是主要有源辐射器。锥的其余部分是有意去耦以衰减其节点分散。这种设计选择改变一个等效辐射源的位置。及时向前运动高频辐射的一种线性校正使用混通滤波器以创建较低频率的频带限制延迟。然后,当频率增大时,潜在延迟减小,由此保持对于扬声器的响应级的相位匹配。这样能除去一些群延迟失真。来自扬声器的物理尺寸以及锥的衰减和声速性质能产生规定来自专用滤波器过程的校正的信息。然而,能试验确定延迟效应和去耦频率以产生参数值。如果扬声器部分的一些改变尺寸或衰减性质,则能外推新的值。
难以或不可能使用传统方法补偿的一种参量寻址补偿的一个例子是在小扬声器中对Doppler调制的补偿。计算机和多通道声音系统需要小扬声器奏得非常响亮。快速、高位移锥运动的生成组合能把辅助或减缩速度传给复制的声音。扬声器锥的低频运动通过运动有效高频辐射区域传递Doppler调制效应。该效果十分烦人,并且创建象征着小扬声器努力奏得响亮的声音。当辐射区域、频率、及声学功率输出已知时,能进行生成锥运动和Doppler辐射因数的合理准确计算(见图5)。为了校正扬声器响应创建一种相反交替时间延迟。这种倍增或非线性过程能使等效辐射源更稳定,从而减小非线性失真。扬声器的一个良好性能模型和一个单尺寸参数能规定校正。任何这样的开环或前向非线性校正非常难以实现。模型化时间延迟调制在它提供准确的共轭响应校正时要好得多。例子包括在这里,因为来自低音驱动器的锥运动由模型合理地预测,并且来自DSP方法的瞬时校正将及时变得更实际。通过使用由电压控制振荡器时钟操作的CMOS型模拟延迟进行试验。一条路径补偿来自两个“斗链式”器件的等待时间,而另一条接收可变时钟以产生延迟调制。
对于节点弯曲、波干扰及非线性运动情形,通过使用加权切口过程的性能响应的除去或衰减是一种良好的折衷。加权补偿能参量运动到需要它的地方。如果需要,则能调制其严重性,以最好地匹配程序动力学、来自扬声器的失真、及人类临界频带听觉。
当声频信号的动力学被探测和用来改变参数或隐藏补偿时,辅助低音输出能力和响应扩展可能较差。这种技术能为由改进方法操作的任何扬声器系统工作。
然而,如果把扬声器的部分设计成要求动态补偿,则辅助性能特征是可能的。目的在于特定系统的调节列表或位图能具有与一般目的系统相同的参数和调节,即控制具有共同的特征。因而带有补偿系统的电子系统能够接收指令,以补偿和优化能附加到其上的各种扬声器模型和产品,两种通用扬声器和专为具有补偿系统的用途设计的那些。当需要时,系统能改进清晰度、成象、及低音扩展而不改变声平衡,即保持生产线的声印记。
参数创建的调节效应由包括在上述表格中的符号或缩写词描述或表示。以这种方式,数学命题、电路、扬声器设计特征和其它特定语言统一到程序员或用户能直观解释的列表。然后,响应曲线、性能特征、波长关系、以及对于人类感觉重要的其它东西,变得与用于扬声器系统的设计和/或补偿的过程模型有关。简化补偿,因为在设计和性能变化与基基本关系之间的相互作用是有意义的和直观的。
稳定和节点补偿参数调节包括单位为Hz的频率、作为一个数的Q、及单位为dB的抑制。由于多阶节点性能是可能的,所以Q和抑制调节对于多于一个的补偿频率更可能具有类似值。能链接控制,从而单位为Hz的两个或多个频率能规定对于共同共享机械或干扰性质的节点性能的 校正。
用于扬声器锥的钟形模式补偿提供一个良好例子。几种方法能确定这些频率。使用正弦波激励和光学干涉测量法能观察多节点或波相关干扰。能解释来自图7中所示的MLSSA型刺激、或微分麦克风探针的瀑布图线,以揭示来自分散的稳定能量。这些性能是可听的,并且在频率中能人工或缓慢地扫描隐藏补偿过程,以揭示在粉红色噪声复制期间的声变化。试验方法需要小心和经验,因为室内回声能模拟机械声音。在三种技术之间的相关是良好的,并且当确定来自类似原因的几个频率时,类似Q和共享提升参数的合成加权切口简化校正。
以上参数和其调节改变用于扬声器特定性能的配置补偿。一些过程固有地限制到一个窄频率范围,其中特定种类的性能最可能从扬声器系统发生。影响时间和响应斜率的其它覆盖一个宽频谱。这些专用操作彼此足够隔离,从而在他们之间的相互作用较小。能改变选择参数而不影响其它。另外,数据要求对于有用的调节分辨率是合适的。
如在以上扬声器例子中描述的那样,调节补偿系统的控制与扬声器的物理部分和声学性质有关。以相同方式能改进类似、但不准确设计或构造的其它扬声器。这样做的控制或规格信息具有相同简单、直观的语言。一个较小便宜扬声器能借助于16次参数调节和几个缺省设置显著改进。为了匹配来自该系统的复杂响应,传统多频带或图形均衡器需要远超过100频带、和多得多的控制信息。
补偿系统使用斜率、交叉、和其它数学函数创建对于扬声器特性的预计校正。这些操作由系数或点、和由过程命令控制,代替来自对于线性线图的证明和计算响应。由于每个过程具有一个特定本性,所以频率范围、振幅、Q等把参数范围限制到一个控制空间的较小部分。一个三字 +代码能创建一个精确放置的谐振器或复杂加权的响应切口子系统。在8位代码字的情况下,该图或信息序列给出用于一个对数频率十进制的128个点、在用于振幅的1/2dB步长中的+/-20dB、及16个Q设置、以及用于过程命令和控制格式化的空间。对于该例子,在声频带中的384个点或频率适用于设置尖锐抑制切口和加权补偿。用于其它参量控制和过程命令的位图可能要求较小分辨率,因而提供甚至更大的经济性。这种紧凑规格特征能用于校正特定扬声器设计的补偿系统的条码安装,或用于来自在诸如用在HDCD系统中之类的数据流中隐藏的代码的过程的动态控制。如下面详细描述的那样,当减小处理信息范围时,诸如助听器和通信系统之类的可携带设备受益。
对于多种用途,对于在包括十个基本操作,即搁置、切口、补偿、截止滤波器、延迟等的成功过程可以选择在声频带中的384个点或频率。过程规模随分辨率非常迅速地增大:抑制切口可能是尖锐的并且需要准确调谐,干扰补偿固有地复杂,及来自传统测量实施的扬声器响应揭示简化处理的很少有用信息。如果不把补偿系统设计成识别和处理来自曲线的子系统或模型化响应,就必须在一点一点的基础上进行校正。即使进行良好的响应校正,这种方式也要求显著的过程功率。当考虑时间、相位及稳定问题时,常规处理的范围加宽。对于这种情形,分辨在三维栅格(如瀑布线图)中的任何地方的有用校正响应需要的滤波器或过程的数量可能是不实际的。当把滤波器或处理功率分配到要求较高分辨率和较多校正活动的栅格的那些部分时,一些经济性是可能的。即使这些努力没能实现,隐藏或补偿校正也有利于补偿系统。
这种困难的一个良好例子由图6是显然的。补偿系统具有8个切口、用于切点校正的一个加权切口、及低频提升交叉和搁置。高频降低把交 叉提供给高音喇叭。显然,画出点创建响应合成的困难是显然的。补偿系统由24次调节(LX、LS、LP、W0、Q0、|A|0、W1至W7、|A|1至|A|7、WCC1、及一个缺省Q设置)创建这种共轭。
与补偿带中信号去除类似的策略能用于最高和最低频率。例如,由来自低音能量的过分锥运动引起的失真通过减小至扬声器的输入可能是有害的。实现这点的一种方法是把低频响应限制到一个实际值。十分可能的是,扬声器已经能够进行在截止下面的弱低音复制,条件是程序材料不会掩蔽较低的低音信号。宽动态范围程序材料能强迫扬声器在这些频率下产生可感觉输出。不幸的是,生成弱输出频繁地由在人听觉的相同感觉频带中的其它声音覆盖。所以,多半时间来自扬声器的扩展响应是无用的,并且仅添加失真和消耗放大器功率。
补偿系统的加权响应校正能应用于低或高频宽带或者截止抑制或滤波器的可听侧。如果认真地做,则感觉响应显得未改变,并且能使扩展声音象它在滤波之前那样。打算复制大功率、次可听或次声能量的大系统需要一种不同的方法,尽管相同的方法适用。
补偿系统把一个扬声器模型与共轭过程组合,创建一个其声学输出具有低群延迟失真的零相位位滤波器。对于这种用途,波峰响应不仅遵守标准实践,而且用在对准中以帮助改进群延迟,并且成为允许频带限制特征接通或断开的隐藏补偿的部分。
当象选择上述那样的中性时,能使补偿系统改变其截止深度和具有最小听力的补偿能量。这种特征允许补偿系统由音量的变化跟踪或调制控制设置、功率级、或竞争感觉频带的程序条件。以这种方式,在失真插入之前,带宽限制能迫使较多功率到扬声器。由于现在定量可听能量,所以较小放大器能产生相同的重放音量。
这些因数具有经济重要性。扬声器具有这样设计的部分,从而系统能从补偿系统受益。它们具有较短音圈和较小重量的锥以从放大器产生较高声学输出。效率较高,但机械性能常常折衷,并且来自这样一种设计的声学输出往往随频率升高。没有校正,扬声器听起来刺耳和尖叫,并因此必须补偿。然而,一旦这些变化由补偿系统校正,扬声器就奏得更响亮,能更小,并且能使用更低功率的放大器。
如果选择虚拟低音扩展,则在频率中借助于认真制订的策略运动波峰或补偿响应。在频带边缘处的过程设置和有关声学波峰频率变得取决于程序材料的低音含量、放大器的功率保存、及扬声器的运动能力。当重放级较高,并且低频能量较强时,波峰响应在频率中向上运动,以保持合理的锥运动和失真性能。
大多数娱乐系统带有均衡器、音调控制、及其它用户操作或启动的特征。需要声学可见性。补偿系统最好与这些级联工作,并且能改进其性能。一旦扬声器系统具有由补偿系统提供的更理想化辐射性能,各种响应水准测量系统就不必分类或推测从麦克风取出的测量响应的哪部分源于扬声器或源于室内。补偿系统能更有效地从可能损坏相位响应或不适于其它听众位置的这些响应水准测量程序,消除不适当的均衡。级联操作也保证除去由传统方法不可辨别的响应引起的扰乱机械声音。人双耳听觉擅长感觉、识别、及定位这些声音。一旦除去它们,传统均衡方法就能提升没有刺耳声的高频、和没有箱隆隆声或最小构造的模糊声音特性的低频。
对于补偿系统,特定模拟功能块电路能形成简单的实用系统。用于其可调节部分的响应范围能由共轭模型预计,从而平行信号路径和多个共享功能是可能的。在单条路径中需要少得多的有源设备,由此减小成本 和失真。一些时间有关校正由全通滤波器是可能的,而其它延迟操作是不实际的。
在扬声器上下文中的补偿系统的示范模拟和DSP实施分别提供在附录B和C中。补偿系统的其它用途的描述如下。
通信系统-通信系统可能经受多余的窄带噪声或在固定或变化频率下的音调。十分经常的是,一些时间等待适用于允许子系统辨别和跟踪这样的音调。当创建除去干扰的异相信号不实际或不可能时,补偿系统实现一种有效结果。常常是,有可能用参量可运动加权响应切口跟踪干扰。如果不是信息信号具有与受抑制的相同的频率,则校正将是有效的而不降低或改变声音。常常是,通信系统具有换能器,如作为声音复制系统部分的麦克风、耳机和扬声器。这些元件能具有能作为一个系统个别或集体补偿的多余响应。一个或多个处理器能放置在信号链中的任何处。它们能控制或编程成补偿许多元件部分混合物,如换能器、信号路径、人听觉要求等。为了建立这样一种系统,控制参数信息可以由在信号路径中的隐藏代码辨别或估计。辅助通道、以及其他装置,能用来传送该信息。由于补偿系统有效地使用该信息创建非常复杂的响应,所以校正过程能建立在多个系统中。例子包括计算机扬声器、用于听力损伤的电话系统、及移动通信。对于这些系统,处理器能在外部或不是未端用户器具的部分。所以,补偿系统能编程为器具的一种具体模型,并且外部致动。处理器的部分、全部能随器具存在或不随其存在。
助听器-许多听力困难产生于对听觉神经内茸毛细胞的损坏。常常人们受耳鸣或头晕(head ringing)之害,并且具有理解在拥挤嘈杂房间中的对话的困难。有时与一个窄频带相对应的一个封闭空间群细胞已经有机械损伤,引起对高强度刺激的过分神经响应。这种作用常常听起来不和谐 和疼痛。它可能引起至和来自大脑的听觉反馈路径的中断,从而启动过早保护功能,由此加重不愉快感觉。由于引起机械运动的刺激是在由医学试验例行程序容易定义的频率范围中,所以能容易地把参量加权切口滤波器调谐到相同频率,以阻塞刺激这些细胞的声音传输。如果对于个人适当地建立辅助加权,则减小对于其它声音的感觉损失。在一种典型情况下,切口必须具有可能必须随声音压力级变宽的带抑制特性。补偿侧能量跟踪这些变化以对于其它声音减小清晰度损失。设计成进行这种校正的系统能更有效,并且其特定处理可能吸收比通用响应造型方法少的电池功率。
水印辨别-一种记录能借助于由一个尖锐切口除去的已知频率形成。如果相同记录需要以后辨别,则能使系统查寻已知的丢失频率。人们能期望颤动、噪声、及未预计时钟速率,以便移动死频带和创建多种困难。记录可以使用音乐信号定义操作频率和编码安全切口的计时。减小时钟依赖性,并且使用数码键防止某人找到这些频率和改变目的。在重放期间,程序的键辨别部分启动用于确认的译码参数。象上述的通信系统那样,记录切口应该尽可能好地安静或隐藏,并且可能从一个频率跳到另一个。参量控制加权补偿方法对于这种用途是理想的,并且键入频率跳跃和隐藏的组合为一种有效安全系统提供。
从声音系统消除反馈-涉及声音的同时获得和复制的较大声音增强设施、电话、和其它系统经受反馈。通常,一个麦克风拾波复制声学信号的某一部分,并且添加到引起振荡的信号上。扬声器电话的成熟DSP部分能分类房间回声和串音的相位关系,以使声音传输清晰并且消除反馈。频移器随机化反馈相位以防止嗥鸣或高Q松散耦合振荡的缓慢建立。有时,来自这些方法的潜伏与级性能或同步干扰。能把可调谐加权切口设 置到灵敏频率以消除振荡而没有对于声音的显著损失。双或多调谐样式彼此没有什么相互作用,并且固有死带使调出反馈容易得多。
CD唱机-一种以数字或模拟域(或两者)操作的典型电子系统可以组合有意用户调节和补偿系统。部分描述、数学模型、测量数据、及人类喜好信息可以组合,并且并入其设计中。一旦定义参数,并且确定其系数值,一个组织群数码就能编程电气或数学系统,以对于扬声器的不同形状和尺寸进行特定校正响应。参数列表、和甚至个别校正模型能下载到在CD唱机或其它设备中的一个数字信号处理器。这种操作能在任何时间进行,从而它提供可编程升级。它能由条码、远程控制致动,从计算机下载,或安装到专用唱机/扬声器组合上。
尽管已经表明和描述了本发明的几种具体形式,但显然,能进行各种修改而不脱离本发明的精神和范围。
                       附录A
图A1、A2和A3表示用于低通滤波器(LP)和高通滤波器(HP)截止滤波器的可能实施。这些具体滤波器的量级保持得较小以支持低MIPS实施。图A4表示用于高和低搁置均衡器的可能实施。这些均衡器用于LS和HS。图A5表示可用于提升或切口实施的参量均衡器实施。这样的均衡器的组合能结合,如图A6和A7中所示,以建立补偿切口效应。定义传递函数(第一列是在传递函数中的分子系数,而第二列是在传递函数中的分母系数),所以该滤波器是一个二阶IIR。 D : = B 1 B - ( 2 - F · Q - F 2 ) 0 ( 1 - F · Q ) D = 1.411 1 1.411 0.991 0 0.832 画出滤波器的频率和相位响应x:=0,.001...5G(x):=|gain(D,x)|
                                 图A1
Figure A0081155600421
定义传递函数(第一列是在传递函数中的分子系数,而第二列是在传递函数中的分母系数)。所以该滤波器是一个二阶IIR。 D : = 1 1 - 2 - 2 ( 2 - F · Q - F 2 ) 1 ( 1 - F · Q ) D = 1 1 - 2 - 1.777 1 0.858 计算增益补偿 PK : = 4 ( 4 - 2 · F · Q - F 2 ) K : = 1 PK K=0.909画出滤波器的频率和相位响应x:=0,.001...5G(x):=K|gain(D,x)|
                          图A2
Figure A0081155600431
定义传递函数(第一列是在传递函数中的分子系数,而第二列是在传递函数中的分母系数)。所以该滤波器是一个二阶IIR。 D : = 0 1 B - ( 2 - F · Q - F 2 ) 0 ( 1 - F · Q ) D = 0 1 0.04 - 1 . 891 0 0.972 画出滤波器的频率和相位响应x:=0,.001...5G(x):=|gain(D,x)|
                                   图A3
Figure A0081155600441
定义传递函数(第一列是在传递函数中的分子系数,而第二列是在传递函数中的分母系数)。所以该滤波器是一个一阶IIR。
Figure A0081155600442
在DSP实施中,按以上信号流程计算滤波器输出。下面我们通过必要地变换全通部分的分子计算以上系统的整体传递函数。
                           图4A(第1页,共2页)
Figure A0081155600451
                      图4A(第2页,共2页)
Figure A0081155600461
                        图5A(第1页,共2页)
Figure A0081155600471
                          图5A(第2页,共2页) 加权切口#1数字实施包括使用在“基于全通部分的切口/参量EQ部分”中描述的程序设计的3参量EQ部分2低Q增益部分围绕临界频率切口对于补偿部分#1和#2(分别为D1和D2)Q是2而k是1.5,导致下面的传递函数。生成滤波器是两个2阶IIR滤波器,其中列0表示分子,而列1表示分母。 D 1 : = 1.076 1 - 1.283 - 1.283 0.619 0 . 695 D 2 : = 1.089 1 - 1.079 - 1.079 0.554 0.643 对于临界频率部分#3(下面的D3)Q是10而k是0。生成滤波器是一个二阶IIR滤波器,其中列0表示分子,n0而而列1表示分母。 D 3 : = 0.962 1 - 1.363 - 1.363 0.962 0.925 级联的3IIR滤波器的整体频率响应的线图x:=0,.001_0.5G1(x):=|gain(D1,x)|G2(x):=|gain(D2,x)|G3(x):=|gain(D3,x)|H(x):=20-log(G1(x)·G2(x)·G3(x))
Figure A0081155600484
                    图A6 加权切口#2的数字实施包括使用在“基于全通部分的切口/参量EQ部分”中描述的程序设计的3参量EQ部分一个中Q增益补偿绕两个切口对中对于补偿部分#1(下面的D1)Q是2而k是的4,导致下面的传递函数。生成滤波器是两个2阶IIR滤波器,其中列0表示分子,而列1表示分母。 D 1 : = 1.268 1 - 1.29 - 1.29 0.553 0.821 对于临界频率切口部分#2和#3(下面分别是D2和D3)Q是10而k是0。生成滤波器是一个二阶IIR滤波器,其中列0表示分子,而而列1表示分母。 D 2 : = 0.963 1 - 1.383 - 1.383 0.963 0.926 D 3 : = 0 . 962 1 - 1.343 - 1.343 0.962 0.923 级联的3IIR滤波器的整体频率响应的线图x:=0,.0001_0.5G1(x):=|gain(D1,x)|G2(x):=|gain(D2,x)|G3(x):=|gain(D3,x)|H(x):=20·log(G1(x)·G2(x)·G3(x))     (级联响应)
                图A7
                          附录B
图B1是用来补偿一个带有5英寸低音驱动器和3英寸高音喇叭的小书架扬声器的补偿系统的方块图。扬声器的特征如下:低音唔喇叭:圆顶=4.33k(带有LC的切口)
        锥=4.9k(仅有补偿切口)
        锥的边缘=2.8k(有源切口)高音唔喇叭:圆顶=15.1k(没有补偿)
        锥cr=11.6k(有源切口)
        锥cr=9.32k/9.45k(阻尼复合)
        W0=1.38k(LCR切口)
提供十四种调节。图B2表示用来创建LX、HX、LS、HS、LP、和HP滤波器和参量调节的电路。添加较低频率截止波峰,以创建一个8英寸书架系统的响应特征。对于该电路,Q和波峰振幅由方框标记的元件设置。图B3和B4表示W0切口部分和用于扬声器的代表性调谐。dB为单位的W0…和|A|是可调节的,而一个电阻器设置Q。这些的两组进行四种调节。图B5表示一个单低Q提升。用于提升和频率的调节由op amp部分提供。图B6是用于时间校正的全通均衡器。全通均衡器组合来自六个有源过程电路的输出。
Figure A0081155600511
                                    图B1
                调节的斜率EQ和带通滤波器
                 WL=65Hz,44Hz(平行引出头)
                 WH=17kHz
                 WLX=400Hz->20Hz
                 WHX=3kHz->25kHz
Figure A0081155600521
                         图B2
Figure A0081155600531
                       图B30.0015=3.2-3.6k(2.5k->6.8k)0.0033=1.4->1.7k(1.2k->3.3k)0.0047≌900-1.2k(800->2.2k)0.15=120(80-220)LOWQ R|A|=47k||33k
 RQ=68k||100kVOUT=10VppMAX
   (+6dB)
Figure A0081155600532
                     图B4
                          图B50.033=270->1.4k0.0068
     700Hz opt
     @3/4 max W0
                        附录C
使用一个标准PC和一个Motorola EVM56362 DSP估计板实施一个计算机调节DSP补偿器。源代码和应用提示如下。
                扬声器调谐应用程序提示
扬声器调谐应用程序写作使用目标取向MFC应用程序框架的Windows OS 32位应用程序(请参照对于Microsoft Visual C++开发环境包括的MFC的文件编制)。该应用程序带有一个对话接口。主对话类,CTabDialog,是MFC CDialog类的一个子类。CTabDialog类实现一个“标记”对话接口。在对话中的每个标签是MFC CPropertypage类的子类。每个标签表示扬声器校正算法的不同方面。如下是标签类的列表:
●CMainpage,尤其实施用于前和后音量控制的UI
●CShelvpage,实施用于低和高搁置均衡滤波器的UI控制
●CCutoffpage,实施用于低和高波峰截止滤波器的UI控制
●CNotchpage1和CNotchpage2,实施用于多个切口滤波器的UI控制(为了例如限制在扬声器中的谐振)
●CStWaveRijecetpage,实施用于能限制在扬声器箱中的驻波的一组滤波器的UI控制
●CDBNotch,实施用于双调谐切口滤波器的UI控制
●CAllpasspage,实施用于二阶全通滤波器的UI在每个标签页上的每个可调节参数由CSlider类的实例表示。每个UI滑动器具有4096个分立值的范围。当用户操纵UI滑动器时,把一条消息从标签页送到CDSP56Manager类的实例。在该类中,适当的计算发生以把线性输入值转换成计算由用户设置表示的传递函数必需的一个或多个值。使用一个I2C串行连接把这些计算值传输到DSP。DSP执行对于上述传递函数的实时实施必需的计算。DSP能够实时地计算一系列滤波器计算,以允许实现所有扬声器校正滤波器的总级联传递函数。DSP能接收模拟或数字数据,并且传输处理的模拟或数字输出数据。
Figure A0081155600571
// COMPortChooser.cpp:implementation file
//
#include"stdafx.h"
#include"sa.h"
#include"COMPortChooser.h"
#ifdef_DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] =__FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CCOMPortChooser dialog
CCOMPortChooser::CCOMPortChooser(CWnd*pParent/*=NULL*/) 
  :CDialog(CCOMPortChooser::IDD. pParent)
{
  //{{AFX_DATA_INIT(CCOMPortChooser)

    // NOTE:the ClasWizard will add member initialization here
  //}}AFX_DATA_INIT
}
void CCOMPortChooser::DoDataExchange(CDataExchange* pDX)
{
  CDialog::DoDataExchange(pDX);
  //{{AFX_DATA_MAP(CCOMPortChooser)

    // NOTE:the ClassWizard will add DDX and DDV calls here
  //}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CCOMPortChooser,CDialog)
  //{{AFX_MSG_MAP(CCOMPortChooser)
  ON_BN_CLICKED(IDC_RADIO1,OnRadio1)
  ON_BN_CLICKED(IDC_RADIO2,OnRadio2)
  ON_BN_CLICKED(IDC_RADIO3,OnRadio3)
  ON_BN_CLICKED(IDC_RADIO4,OnRadio4)
  //})AFX_MSG_MAP
END_MESSAGE_NAP()
/////////////////////////////////////////////////////////////////////////////
// CCOMPortChooser message handlers
void CCOMPortChooser::OnRadio1()
{
  // TODO:Add your control notification handler code here
  which_port=1;
}
void CCOMPortChooser::OnRadio2()
{
  // TODO:Add your control notification handler code here
  which_port=2;
}
void CCOMPortChooser::OnRadio3()
  // TODO:Add your control notification handler code here
  which_port=3;
}
void CCOMPortChooser::OnRadio4()
  // TODO:Add your control notification handler code here
  which_port=4;
				
				<dp n="d52"/>
}
BOOL CCOMPortChooser::OnInitDialog()
{
   CDialog::OnInitDialog();
   // TODO:Add extra initialization here
   which_port=3;
   return TRUE; // return TRUE unless you set the focus to a control

                 // EXCEPTION:OCX Property Pages should return FALSE
}
				
				<dp n="d53"/>
// CutoffPage.cpp:implementation file
//    
#include"stdafx.h"
#include"sa.h"
#include"CutoffPage.h"
#include"DSP56kManager.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#endif    
/////////////////////////////////////////////////////////////////////////////
// CCutoffPage property page
IMPLEMENT_DYNCREATE(CCutoffPage,CPropertyPage)
CCutoffPage::CCutoffPage():CPropertyPage(CCutoffPage::IDD)
{
    //{{AFX_DATA_INIT(CCutoffPage)

    //}}AFX_DATA_INIT
}
CCutoffPage::-CCutoffPage()
{
}
void CCutoffPage::DoDataExchange(CDataExchange* pDX)
{

    CPropertyPage::DoDataExchange(pDX);

    //{{AFX_DATA_MAP(CCutoffPage)

  DDX_Control(pDX,IDC_CHECK6,m_BypassSecondButton);

  DDX_Control(pDX,IDC_CHECK5,m_BypassFirstButton);

  DDX_Control(pDX,IDC_SLIDER6,m_HiBoostSlider);

  DDX_Control(pDX,IDC_SLIDER5,m_HiQSlider);

  DDX_Control(pDX,IDC_SLIDER4,m_HiFreqSlider);

  DDX_Control(pDX,IDC_SLIDER3,m_LoBoostSlider);

  DDX_Control(pDX,IDC_SLIDER2,m_LoQSlider);

  DDX_Control(pDX,IDC_SLIDER1,m_LoFreqSlider);

  //})AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CCutoffPage,CPropertyPage)
  //{{AFX_MSG_MAP(CCutoffPage)
  ON_WM_VSCROLL()
  ON_BN_CLICKED(IDC_CHECK5,OnBypassFirst)
  ON_BN_CLICKED(IDC_CHECK6,OnBypassSecond)
  //}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CCutoffPage message handlers
BOOL CCutoffPage::OnInitDialog()
{

  CPropertyPage::OnInitDialog();

  // TODO:Add extra initialization here

  m_LoFreqSlider.SetRange(0,CONTROL_RANGE);

  m_LoFreqSlider.SetPos(CONTROL_RANGE-g_DSPManager->GetParamValue(kNotch6Freq));

  m_LoFreqSlider.SetTicFreq((CONTROL_RANGE+1)/16);

  m_LoQSlider.SetRange(0,CONTROL_RANGE);

  m_LoQSlider.SetPos(CONTROL_RANGE-g_DSPManager->GetParamValue(kNotch6Q));

  m_LoQSlider.SetTicFreq((CONTROL_RANGE+1)/16);

  m_LoBoostSlider.SetRange(0,CONTROL_RANGE);    

  m_LoBoostSlider.SetPos(CONTROL_RANGE-g_DSPManager->GetParamValue(kNotch6Boost));

  m_LoBoostSlider.SetTicFreq((CONTROL_RANGE+1)/16);

  m_HiFreqSlider.SetRange(0,CONTROL_RANGE);

  m_HiFreqSlider.SetPos(CONTROL_RANGE-g_DSPManger->GetParamValue(kNotch7Freq));
				
				<dp n="d54"/>
  m_HiFreqSlider.SetTicFreq((CONTROL_RANGE+1)/16);

  m_HiQSlider.SetRange(0,CONTROL_RANGE);

  m_HiQSlider.SetPos(CONTROL_RANGE-g_DSPManager->GetParamValue(kNotch7Q));

  m_HiQSlider.SetTicFreq((CONTROL_RANGE+1)/16);

  m_HiBoostSlider.SetRange(0,CONTROL_RANGE);

  m_HiBoostSlider.SetPos(CONTROL_RANGE-g_DSPManager->GetParamValue(kNotch7Boost));

  m_HiBoostSlider.SetTicFreq((CONTROL_RANGE+1)/16);
//    g_DSPManager->SetCutoff1Freq(CONTROL_RANGE-m_LoFreqSlider.GetPos());
//    g_DSPManager->SetCutoff1Q(CONTROL_RANGE-m_LoQSlider.GetPos());
//    g_DSPManager->SetCutoff1Boost(CONTROL_RANGE-m_LoBoostSlider.GetPos());
//    g_DSPManager->SetCutoff2Freq(CONTROL_RANGE-m_HiFreqSlider.GetPos());
//    g_DSPManager->SetCutoff2Q(CONTROL_RANGE-m_HiQSlider.GetPos());
//    g_DSPManager->SetCutoff2Boost(CONTROL_RANGE-m_HiBoostSlider.GetPos());

  return TRUE;// return TRUE unless you set the focus to a control

               // EXCEPTION:OCX Property Pages should return FALSE
}
void CCutoffPage::OnVScroll(UINT nSBCode,UINT nPos,CScrollBar*pScrollBar)
{

  // TODO:Add your message handler code here and/or call default

  CPropertyPage::OnVScroll(nSBCode,nPos,pScrollBar);

  Sleep(50);

  if((CSliderCtrl*)pScrollBar==&amp;m_LoFreqSlider)

    g_DSPManager->SetCutoff1Freq(CONTROL_RANGE-m_LoFreqSlider.GetPos());

  else if((CSliderCtrl*)pScrollBar==&amp;m_LoQSlider)

    g_DSPManager->SetCutoff1Q(CONTROL_RANGE-m_LoQSlider.GetPos());

  else if((CSliderCtrl*)pScrollBar==&amp;m_LoBoostSlider)

    g_DSPManager->SetCutoff1Boost(CONTROL_RANGE-m_LoBoostSlider.GetPos());

  else if((CSliderCtrl*)pScrollBar==&amp;m_HiFreqSlider)

    g_DSPManager->SetCutoff2Freq(CONTROL_RANGE-m_HiFreqSlider.GetPos());

  else if((CSliderCtrl*)pScrollBar ==&amp;m_HiQSlider)

    g_DSPManager->SetCutoff2Q(CONTROL_RANGE-m_HiQSlider.GetPos());

  else if((CSliderCtrl*)pScrollBar==&amp;m_HiBoostSlider)

    g_DSPManager->SetCutoff2Boost(CONTROL_RANGE-m_HiBoostSlider.GetPos());
)
void CCutoffPage::OnBypassFirst()
{
  // TODO:Add your control notification handler code here
  int state=m_BypaasFirstButton.GetState() &amp; 0x3;
  g_DSPManager->SetBypassSection(state,kBypassHipass);
}
void CCutoffPage::OnBypassSecond()
{
  // TODO:Add your control notification handler code here
  int state=m_BypassSecondButton.GetState() &amp; 0x3;
  g_DSPManager->SetBypassSection(state,kBypassLopass);
}
				
				<dp n="d55"/>
#if !defined(AFX_COMPORTCHOOSER_H__BSD510E7_F7D5_11D2_96EE_006097CDB9E2_INCLUDED_)
#define AFX_COMPORTCHOOSER_H__BSD510E7_F7D5_11D2_96EE_006097CDB9E2__INCLUDED
#if_MSC_VER>=1000
#pragma once
#endif // _MSC_VER>=1000
// COMPortChooser.h:header file
//
/////////////////////////////////////////////////////////////////////////////
// CCOMPortChooser dialog
class CCOMPortChooser:public CDialog
{
//Construction
public:

  CCOMPortChooser(CWnd*pParent=NULL); //standard constructor

  int which_port;
// Dialog Data

  //{{AFX_DATA(CCOMPortChooser)

  enum{IDD=IDD_DIALOG3};

  // NOTE:the ClassWizard will add data members here
  //}}AFX_DATA
// Overrides

  // ClassWizard generated virtual function overrides

  //{{AFX_VIRTUAL(CCOMPortChooser)

  protected:

  virtual void DoDataExchange(CDataExchange*pDX);    //DDX/DDV support

  //))AFX_VIRTUAL
// Implementation
protected:
  // Generated message map functions
  //{{AFX_MSG(CCOMPortChooser)
  afx_msg void OnRadio1();
  afx_msg void OnRadio2();
  afx_msg void OnRadio3();
  afx_msg void OnRadio4(); 
  virtual BOOL OnInitDialog();
  //})AFX_NSG
  DECLARE_MESSAGE_MAP()
};
//{{AFX_IMSERT_LOCATION}}
// Microsoft Developer Studio will insert additional declarations immediately before the previous line.
#endif // !defined(AFX_COMPORTCHOOSER_H__B5D510E7_F7D5_11D2_96EE_006097CDB9E2_INCLUDED_)
				
				<dp n="d56"/>
#if !defined(AFX_CUTOFFPAGE_H__6F151625_D84D_11D2_96EE_006097CDB9E2_INCLUDED_)
#define AFX_CUTOFFPAGE_H__6F151625_D84D_11D2_96EE_006097CDB9E2__INCLVDED_
#if_MSC_VER>=1000
#pragma once
#endif // _MSC_VER>=1000
//CutoffPage.h :header file
//
/////////////////////////////////////////////////////////////////////////////
// CCutoffPage dialog
class CCutoffPage :public CPropertyPage
{
  DECLARE_DYNCREATE(CCutoffPage)
// Construction
public:
  CCutoffPage();
  -CCutoffPage();
// Dialog Data
  //((AFX_DATA(CCutoffPage)
  enum {IDD=IDD_PP7};
  CButton m_BypassSecondButton;
  CButton m_BypassFirstButton;
  CSliderCtrl m_HiBoostSlider;
  CSliderCtrl m_HiQSlider;
  CSliderCtrl m_HiFreqSlider;
  CSliderCtrl m_LoBoostSlider;
  CSliderCtrl m_LoQSlider;
  CSliderCtrl m_LoFreqSlider;
  //})AFX_DATA
// Overrides

  // Classwizard generate virtual function overrides

  //{{AFX_VIRTUAL(CCutoffPage)

  protected:

  virtual void DoDataExchange(CDataExchange* pDX; //DDX/DDV support

  //})AFX_VIRTUAL
// Implementation
protected:

  // Generated message map functions

  //{{AFX_MSG(CCutoffPage)

  virtual BOOL OnInitDialog();

  afx_msg void OnVScroll(UINT nSBCode,UINT nPos,CScrollBar* pScrollBar);

  afx_msg void OnBypassFirst();

  afx_msg void OnBypassSecond();

  //}}AFX_MSG

  DECLARE_MESSAGE_MAP()
};
//{{AFX_INSERT_LOCATION}}
// Microsoft Developer Studio will insert additional declarations immediately before the previous line.
#endif//!defined(AFX_CUTOFFPAGE_H_6F151625_D84D_11D2_96EE_006097CDB9E2_INCLUDED_)
				
				<dp n="d57"/>
#if !defined(AFX_ALLPASSPAGE_H_F4767B24_11B3_11D3_96EE_006097CDB9E2__INCLUDED_)
#define AFX_ALLPASSPAGE_H_F4767B24_11B3_11D3_96EE_006097CDB9E2_INCLUDED_
#if_MSC_VER>=1000
#pragma once
#endif //_MSC_VER>=1000
// AllpassPage.h:header file
//
/////////////////////////////////////////////////////////////////////////////
// CAllpassPage dialog
class CTabDialog;
class CAllpassPage:public CPropertyPage
{
  DECLARE_DYNCREATE(CAllpassPage)
// Construction
public:
  CAllpassPage();
  -CAllpassPage();
// Dialog Data
  //{{AFX_DATA(CAllpassPage)
  enum{IDD=IDD_PP10};
  CDutton m_BypassButton;
  CSliderCtrl m_QSlider;
  CSliderCtrl m_FrequencySlider;
  //}}AFX_DATA
// Overrides
  // ClassWizard generate virtual function overrides
  //{{AFX_VIRTUAL(CAllpassPage)
  protected:
  virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV support
  //}}AFX_VIRTUAL
// rmplementation
protected :
  // Generated message map functions
  //{{AFX_MSG(CAllpassPage)
  afx_msg void OnBypass();
  virtual BOOL OnInitDialog();
  afx_msg void OnVScroll(UINT nSBCode,UINT nPos,CScrollBar* pScrollBar);
  afx_msg void OnPaint();
  //})AFX_MSG
  DECLARE_MESSAGE_MAP()
  CTabDialog *m_ParentWindow;
  void SendStringToUI(int which);
};    
//{{AFX_INSERT_LOCATION}}
//Microsoft Developer Studio will insert additional declarations immediately before the previous line.
#endif //!defined(AFX_ALLPASSPAGE_H__F4767B24_11B3_11D3_96EE_006097CDB9E2__INCLUDED_)
				
				<dp n="d58"/>
// AllpassPage.cpp:implementation file
//
#include"stdafx.h"
#include"sa.h"
#include"AllpassPage.h"
#include"TabDialog.h"
#include"DSP56kManager.h"
#ifdef_DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
//CAllpassPage property page
IMPLEMENT DYNCREATE(CAllpassPage,CPropertyPage)
CAllpassPage::CAllpassPage():CPropertyPage(CAllpassPage::IDD)
{

  //{{AFX_DATA_INIT(CAllpassPage)

  //})AFX_DATA_INIT
}
CAllpassPage::-CAllpassPage()
{
}
void CAllpassPage::DoDataExchange(CDataExchange"pDX)
{

  CPropertyPage::DoDataExchange(pDX);

  //{{AFX_DATA_MAP(CAllpassPage)

  DDX_Control(pDX,IDC_CHECK1,m_BypassButton);

  DDX_Control(pDX,IDC_SLIDER3,m_QSlider);

  DDX_Control(pDX,IDC_SLIDER1,m_FrequencySlider);

  //}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CAllpassPage,CPropertyPage)
  //{{AFX_MSG_MAP(CAllpassPage)
  ON_BN_CLICED(IDC_CHECK1,OnBypass)
  ON_WM_VSCROLL()
  ON_WM_PAINT()
  //}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CAllpassPage message handlers
void CAllpassPage::OnBypass()
{

  // TODO:Add your control notification handler code here

  int state=m_BypassButton.GetState()  &amp; 0x3;

  g_DSPManager->SetBypassSection(state,kBypassAllpass);
}
BOOL CAllpassPage::OnInitDialog()
{

  CPropertyPage::OnInitDialog();

  // TODO:Add extra initialization here

  m_FrequencySlider.SetRange(0,CONTROL_RANGE);

  m_FrequencySlider.SetPos(CONTROL_RANGE-g_DSPManager->GetParamValue(kAllpassFreq));

  m_FrequencySlider.SetTicFreq((CONTROL_RANGE+1)/16);

  m_QSlider.SetRange(0,CONTROL_RANGE);

  m_QSlider.SetPos(CONTROL_RANGE-g_DSPManager->GetParamValue(kAllpassQ));

  m_QSlider.SetTicFreq((CONTROL_RANGE+1)/16);
				
				<dp n="d59"/>
  m_ParentWindow=(CTabDialog*)GetParent()->GetParent();
  return TRUE;// return TRUE unless you set the focus to a control

            // EXCEPTION:OCX Property Pages should return FALSE
}    
void CAllpassPage::OnVScroll(UINT nSBCode,UINT nPos,CScrollBar* pScrollBar)
{
  // TODO:Add your message handler code here and/or call default
  CSliderCtrl*slider=(CSliderCtrl*)pScrollBar;
  iht which; 
  CPropertyPage::OnVScroll(nSBCode,nPos,pScrollBar);
  Sleep(50);
  if(slider==&amp;m_FrequencySlider)

  which=kAllpassFreq;
  else if(slider==&amp;m QSlider)

  which=kAllpassQ;
  else

  return;
  g_DSPManager->SetParamValue(CONTROL RANGE-slider->GetPos(),which);
  SendStringToUI(which);
}
void CAllpassPage::SendStringToUI(int which)
{

  CString str;

  g_DSPManager->GetStringValue(which,str);

  m_ParentWindow->SetStatusString(0,str);
}
void CAllpassPage::OnPaint()
{
  CPaintDC dc(this);// device context for painting
  // TODO:Add your message handler code here
  m_FrequencySlider.SetPos(CONTROL_RANGE-g_DSPManager->GetParamValue(kAllpassFreq));
  m_QSlider.SetPos(CONTROL_RANGE-g_DSPManager->GetParamValue(kAllpassQ));
  m_BypasaButton.SetCheck(g_DSPManager->GetBypassSection(kBypassAllpass));
  // Do not call CPropertyPage::OnPaint()for painting messages
}
				
				<dp n="d60"/>
// DSPComm.h:interface for the DSPComm class.
//    
//////////////////////////////////////////////////////////////////////
#if !defined(AFX_DSPCOM_H__33F9EF05_F6EF_11D2_96EE_006097CDB9E2_INCLUDED_)
#define AFX_DSPCOMM_H_33F9EF05_F6EF_11D2_96EE_006097CDB9E2__INCLUDED_
#if_MSC_VER>=1000
#pragma once
#endif //_MSC_VER>=1000
class DSPComm
{
public:

  virtual BOOL IsTransmitting();

  virtual long GetDetectState(void);

  virtual BOOL CheckState(void);

  virtual long SendDSPMemory(char *,long);

  virtual long SendDSPWord(long);

  DSPComm();

  virtual-DSPComm();
};
#endif //!defined(AFX_DSPCOMM_H__33F9EF05_F6EF_11D2_96EE_006097CDB9E2_INCLUDED_)
				
				<dp n="d61"/>
//DSPComm.cpp:implementation of the DSPComm class.
//
//////////////////////////////////////////////////////////////////////
#include"stdafx.h"
#include"sa.h"
#include"DSPComm.h"
#ifdef_DEBUG
#undef THIS_FILE
static char THIS_FILE[]=_FILE_;
#define new DEBUG_NEW
#endif
/////////////////// ///////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
{
}
DSPComm::-DSPComm()
{
}
long DSPComm::SendDSPWord(long)
{
  return(0L);
}
long DSPComm::SendDSPMemory(char *data,long len)
{
  return(0L);
}
BOOL DSPComm::CheckState()
{
  return(true);
}
long DSPComm::GetDetectState()
{
  return(0L);
}
BOOL DSPComm::IsTransmitting()
{
   return(false);
}
				
				<dp n="d62"/>
// DSP56kManager.h:interface for the CDSP56kManager class.
//
//////////////////////////////////////////////////////////////////////
#if !defined(AFX_DSP56KMANAGER_H_0CF7E204_D790_11D2_96EE_006097CDB9E2__INCLUDED_)
#define AFX_DSP56KMANAGER_H__0CF7E204_D790_11D2_96EE_006097CDB9E2__INCLUDED_
#if_MSC_VER>=1000
#pragma onCe
#endif//_MSC_VER>=1000
#include "DSP56Equates.h"
#include"DSPComm.h"
#define CONTROL_RANGE_L2  12
#define CONTROL_RAGE  ((1L<<CONTROL_RANGE_L2)-1)
#define PG_CONTROL_AMT(CONTROL_RANGE/64)
#define CONTROL_RANGE_SC (23-CONTROL_RANGE_L2)
#define DSP_CONTROL_MAX 8388608.
class CDSP56kManager
{
  long m_DSPReturn;
  long m_Raw2DSPVals[kUIArraySize);
  long m_RawVals[kUIArraySize);
  long m_DSPVals[kDSPArraySize);
  double m_pi;
  DSPComm *m_Comm;
public:
  void GetPureStringValue(int which,CString &amp;str);
  void GetFilterBlob(CStringArray &amp;array);
  virtual BOOL GetBypassSection(int which);
  virtual void SetBypassSection(BOOL value,int which);
  virtual BOOL IsBusy();
  virtual void GetStringValue(int which,CString &amp;str);
  virtual BOOL IsReady(void);
  virtual void SetAnalogInput(long);
  virtual int GetHDCDMode(void);
  virtual void ResetAll(void);
  virtual void SetHDCDGainScale(long);
  virtual void SetHDCDBypass(long);
  virtual void SetDDXCompBypass(long);
  virtual void SetBypass(long value);
  virtual void GetDSPSettings(CStringArray &amp;array);
  virtual void SetDSPSettings(CStringArray &amp;array);
  virtual void SetParamValue(long value,long which);
  virtual long GetParamValue(long which);
  void DownloadDSPCode(void);
  CDSP56kManager(HWND p);
  virtual-CDSP56kManager();
private:
  void SetNotchQ(long value,long which,long freqwhich);
  void SetNotchFreq(long value,long which);
  void SetShelvFreq(long value,long which);
  void SetBoostCut(long value,long which);
  void SetRawValue(long value,long which);
  double DoConvertFreqRange(double in,double top,double bottom);
  double ConvertFreqRange(int which);
  double ConvertQRange(long val);
  double ConvertBoostCutRange(long val);
  virtual void SendDSPValue(long which);
  int ChecksumSREC(char *lineptr,int N);
  void GetSRecordAddressRange(char"s,long"start,long *end,char **data);
protected:
  virtual void SetDelay(long value);
  void SetLoCutoff(void);
				
				<dp n="d63"/>
  void SetHiCutoff(void);
  void SetHiCutoff2(void);
  virtual void SetHiCutoff2Q(long value);
  virtual void SetHiCutoff2Freq(long value);
  virtual void SetHiCutoffQ(long value);
  virtual void SetHiCutoffFreq(long value);
  virtual void SetLoCutoffQ(long value);
  virtual void SetLoCutoffFreq(long value);
  virtual void SetPreVolume(long value);
  virtual void SetAnalogVolume(long value);
//  virtual void SetCutoff1Freq(long value);
//  virtual void SetCutoff1Q(long value);
//  virtual void SetCutoff1Boost(long value);
//  virtual void SetCutoff2Freq(long value);
//  virtual void SetCutoff2Q(long value);
//  virtual void SetCutoff2Boost(long value);
  virtual void SetShelv1Freq(long value);
  virtual void SetShelv1Boost(long value);
  virtual void SetShelv2Freq(long value);
  virtual void SetShelv2Boost(long value);
  virtual void SetNotch1Cut(long value);
  virtual void SetNotch1Q(long value);
  virtual void SetNotch1Freq(long value);
  virtual void SetNotch2Cut(long value);
  virtual void SetNotch2Q(long value);
  virtual void SetNotch2Freq(long value);
  virtual void SetNotch3Cut(long value);
  virtual void SetNotch3Q(long value);
  virtual void SetNotch3Freq(long value);
  virtual void SetNotch4Cut(long value);
  virtual void SetNotch4Q(long value);
  virtual void SetNotch4Freq(long value);
  virtual void SetNotch5Q(long value);
  virtual void SetNotch5Boost(long value);
  virtual void SetNotch6Cut(long value);
  virtual void SetNotch6Q(long value);
  virtual void SetNotch6Freq(long value);
  virtual void SetNotch7Cut(long value);
  virtual void SetNotch7Q(long value);
  virtual void SetNotch7Freq(long value);
  virtual void SetNotch9Freq(long value);
  virtual void SetMainVolume(long value);
};
extern  CDSP56kManager *g_DSPManager;
#endif // !defined(AFX_DSP56KMANAGER_H__0CF7E204_D790_11D2_96EE_006097CDB9E2__INCLUDED_)
				
				<dp n="d64"/>
  // DSP56kManager.cpp:implementation of the CDSP56kMananger class.
  //
  //////////////////////////////////////////////////////////////////////
  #include"stdafx.h"
  #include"sa.h"
  #include"DSP56kManager.h"
  #include <math.h>
  #include <stdlib.h>
  #include <string:h>
  #if 0
  #include"unit_ppi.h"
  #include"functs.h"
  #endif
  #ifdef    SPI
  #include"SPIPEMicroComm.h"
  #endif
  #include"I2CIPortComm.h"
  #include"sapmem.h"
  #include"SSTParams.h"
  #ifdef_DEBUG
  #undef THIS_FILE
  static char THIS_FILE[]=__FILE__;
  #defiene new DEBUG_NEW
  #endif
  #if 0
  static    int cmd_delay=1000;
  static    int io_delay=50;
  #endif
  #define   FILE_VERSION    2    // file version
  #define   GAIN_SCALE 8.
  // volume
  #define   VOLTOP    1.
  #define   VOLBOT    3.909e-6
  #define   VOLRANGE  (VOLTOP-VOLBOT)
  // hi and lo cutoff and shelving ranges
  #define    FLCTOPRANGE       0.149        // 1000/22050
  #define    FLCBOTRANGE       0.001769     // 10/22050
  #define    FLCRANGE (FLCTOPRANGE-FLCBOTRANGE)
  #define    FHCTOPRANGE       1            // 22050/22050
  #define    FHCBOTRANGE       0.63         // 8000/22050
  #define    FNCBOTRANGE2      0.42         // 4000/22050
  #define    FHCRANGE (FHCTOPRANGE-FHCBOTRANGE)
  #define    FHCRANGE2 (FHCTOPRANGE-FHCBOTRANGE2)
  #define    QLCTOPRANGE       1.0          // 1
  #define    QLCBOTRANGE       0.003891     // 0.001
  #define    QLCRANGE (QLCTOPRANGE-(QLCBOTRANGE))
  #define    SAMPLING_FREQ     44100
  #define    DELAY_LENGTH      128.
  // convsrts frequency range to log scale
  #define    FTOPRANGE         1.
  #define    FBOTRANGE         0.134
  #define    FRANGE (FTOPRANGE-FBOTRANGE)
  #define    FTOPRANGE2 0.585         // about 2205 top.
  #define    FBDTRANGE2 3.531E-3
				
				<dp n="d65"/>
// new ranges using actual frequencies
#define FTOPRANGE3  4.431   // 3000Hz
#define FBOTRANGE3  2.433   // 30Hz
// hi  cutoff  filter ranges
#define  QHC2BOT    0.74
#define  QHC2TOP    2.258
#define  FHC2BOT    3.954   // 1000Hz
#define  FHC2TOP    5.255   // 20kHz
#define  FHCTOPRANGE3   5.13      // 15000
#define  FHCBOTRANGE3   FHC2BOT
static char"m_ParamNames[kUIArraySize} = {"MainVolume",

  "LoShelfFreq",

  "LoShelfGain",

  "HiShelfFreq",

  "HiShelfGain",

  "Notch1Freq",

  "Notch1Q",

  "Notch1Cut",

  "Notch2Freq",

  "Notch2Q",

  "Notch2Cut",

  "Notch3Freq",

  "Notch3Q",

  "Notch3Cut",

  "Notch4Freq",

  "Notch4Q",

  "Notch4Cut",

  "Notch5freq",

  "Notch5Q",

  "Notch5Cut",

  "PreVolume",

  "Bypass",

  "LoCutoffFreq",

  "LoCutoffQ",

  "HiCutoffFreq",

  "HiCutoffQ",

  "HDCDBypass",

  "HDCDGainScaleOff",

  "DDXCompBypass",

  "Notch6Freq",

  "Notch6Q",

  "Notch6Cut",

  "Notch7Freq",

  "Notch7Q",

  "Notch7Cut",

  "AnalogIn",

  "AnalogVolume",

  "Delay",

  "AllpassFreq",

  "AllpassQ",

  "BypassMask",

  "HiCutoff2Freq",

  "HiCutoff2Q",

  "Notch8Freq",

  "Notch8Q",

  "Notch8Cut",

  "Notch9Freq",

  "Notch9Q",

  "Notch9Cut",

  "NotchAFreq",

  "NotchAQ",

  "NotchACut",

  "DBNotchWidth"};
//////////////////////////////////////////////////////////////////////
// SREC code
//////////////////////////////////////////////////////////////////////
				
				<dp n="d66"/>
  int CDSP56kManager::ChecksumSREC(char *lineptr,int N)
  {    

  unsigned char curbyte,sum=0xff;

  for(int x=2;x<N-2;x+=2)

  {

    sscanf(lineptr+x,"%2x",&amp;curbyte);

    sum-=curbyte;

  }

  // last one is checksum

  sscanf(lineptr+x,"%2x",&amp;curbyte);

  return (curbyte==sum);
  }
  void CDSP56kManager::GetSRecordAddressRange(char *s,long"start,  long"end,char"*data)
  {

  long address,count,soffset;

  *start=-1L;

  *end=-1L;

  if(*s !=′S′) // not a srec

       return;

  // Let′s check the checksum for this line

  ASSERT(ChecksumSREC(s,strlen(s)) );

  switch(s[1])

    {

  case′1′:

      soffset=8;

      sscanf(&amp;(s(4)),"%4x",&amp;address);

      break;

  case′2′:

      soffset=10;

      sscanf(&amp;(s[4]),"%6x",&amp;address);

      break;

  case′3′:

      soffset=12 ;

      sscanf(&amp;(s[4]),"%8x",&amp;address);

      break;

      default:

      return;

      break;

      }

  count=strlen(s)-soffset-2;

  *start=address;

  "end=address+(count/6);    // each word is 6 characters

  *data=s+soffset;
  }
  void CDSP56kManager::DownloadDSPCode()
  {

    char **r=pmem;

    int count=PRECORDS;

    long start,end;

    long ts,te;

    char **recs;

    char *srecdata,"td;

    char *data,"dptr,*rdata,c;

    long size,bsize;

    long taddress,recstart,recend;

    long value;
				
				<dp n="d67"/>
// get starting and ending addresses
start = 0x7FFFFFFFL;
end=0;
recs=r;
for(int i=0;i <count;i++)
{
   GetSRecordAddressRange(*recs++,&amp;ts,&amp;te,&amp;srecdata);
   if(ts<0L)continue;
   start=min(start,ts);
   end=max(end,te);
}
size=end-start;
bsize=size * 3;
rdata=(char *)malloc(bsize+6);    // 3 bytes per word plus length and address
ASSERT(data !=NULL);
data=rdata+6;
dptr=data;
for(i=0 ;i<bsize;i++)   // clear memory
  *dptr++=0;
taddress=start;
while(taddress < end)
{

  recstart=0x7FFFFFFFL;

  recs=r;

  for(int i=0;i<count;i++)    // search for next address

  {

    GetSRecordAddressRange(*recs,&amp;ts,&amp;te,&amp;td);

    if(ts>=0L )

    {

      if(ts>=taddress)

      {

        if(ts<recstart)

        {

          recstart=ts;

          recend=te;

          srecdata=td;

      }

    }

  }

  recs++;
  }
  ASSERT(recstart<=end);
  // copy record
  dptr=data+((recstart-start)*3);
  while(recstart !=recend)
  {

  sscanf(srecdata,"%2x",&amp;value);

  *dptr++=(char) value;

  srecdata+=2;

  sscanf(srecdata,"%2x",&amp;value);

  *dptr++=(char) value;

  srecdata +=2;

  sscanf(srecdata,"%2x",&amp;value);

  *dptr++=(char) value;

  srecdata +=2;

  recstart++;
  }
  taddress = recend;
}
// copy size and address
dptr=rdata;
c=(size>>16) &amp; 0xFF;
*dptr++=c;
c=(size>>8) &amp; 0xFF;
*dptr++=c;
c=size &amp; 0xFF;
*dptr++=c;
c = (start >> 16)&amp; 0xFF;
				
				<dp n="d68"/>
  *optr++=c;

  c=(start>> 8)&amp; 0xFF;

  *dptr++=c;

  c=start &amp; 0xFF;

  *dptr++=c;

  // send data to DSP

  // m_Comm->SendDSPWord(size);

  // m_Comm->SendDSPWord(start);  

  m_Comm->SendDSPMemory(rdata,bsize+6);

  free(rdata);
}
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
CDSP56kManagsr[]CDSP56kManager(HWND p)
{
#if 0

  if(load_dll()==false)

  {

    MessageBox(NULL,"UNIT_PPI not found in the system directory. Fix this and rectart application

      Will Robinson",MB_OK | MB_ICONSTOP);
  }    
  else
  {

  init_port_spi(1);

  set_cmd_delay_cnt_value(cmd_delay);

  set_io_delay_cnt_value(io_delay);
  }
#endif
  m_pi-acos(-1.);
  m_Comm-new I2CIPortCommm(p);
//  DownloadDSPCode();
  int i;    
  for(i=0;i < kUIArraySize;i++)
  {

  m_Raw2DSFVals(i) =i;
  }
  m_Raw2DSPVals[kNotch6Freq]=kDSPNotch6Freq;
  m_Raw2DSPVal=[kNotch6Q]=kDSPNotch6Q;
  m_Raw2DSPVal=[kNotch7Cut]=kDSPNotch6Cut;
  m_Raw2DSPVal=[kNotch7Freq]=kDSPNotch6Freq;
  m_Raw2DSPVal=[kNotch7Q]=kDSPNotch7Q;
  m_Raw2DSPVal=[kNotch7Cut]=kDSPNotch7Cut;
  m_Raw2DSPVal=[kDelay]=kDSPDelay;
  m_Raw2DSPVal=[kAllpassFreq]=kDSPAllpassFreq;
  m_Raw2DSPVal=[kAllpassQ]=kDSPAllpassQ;

  m_Raw2DSPVal=[kNotch8Freq]=kDSPNotch8Freq;
  m_Raw2DSPVal=[kNotch8Q]=kDSPNotch8Q;
  m_Raw2DSPVal=[kNotch8Cut]=kDSPNotch8Cut;
  m_Raw2DSPVal=[kNotch9Freq]=kDSPNotch9Freq;
  m_Raw2DSPVal=[kNotch9Q]=kDSPNotch9Q;
  m_Raw2DSPVal=[kNotch9Cut]=kDSPNotch9Cut;
  m_Raw2DSPVal=[kNotchAFreq]=kDSPNotchAFreq;
  m_Raw2DSPVal=[kNotchAQ]=kDSPNotchAQ;
  m_Raw2DSPVal=[kNotchACut]=kDSPNotchACut;
  ResetAll();
				
				<dp n="d69"/>
CDSP56kManager::-CDSP56kManager()
{
  if(m_Comm)

  delete m_Comm;
}
void CDSP56kManager::SetMainVolume(long value)
{
  double fvalue;
  if(value >= 0)

  SetRawValue(value,kMainVolume);
  if(m_RawVals[kMainVolume] == DSP_CONTROL_MAX)

  m_DSPVals(kDSPMainVolume] = -m_RawVals(kMainVolume];
  else if(m_RawVals(kMainVolume]  == 0)

  m_DSPVals[kDSPMainVolume]=0;
  else

  {

    fvalue =m_RawVals[kMainVolume};

    fvalue /=DSP_CONROL_MAX;    // normalize

    fvalue *=VOLRANGE;

    fvalue +=VOLBOT;

    fvalue =(pow(10.,fvalue)-1.}/(10.-1.);

    fvalue *=DSP_CONTROL_MAX;

    m_DSPVals[kDSPMainVolume] = (long) -fvalue;

  }
  SendDSPValue(kDSPMainVolume);
}
void CDSP56kManager::SendDSPValue(long which)
{
  long value=m_DSPVals[which];
#if 0    
  // transmitted value has parameter value in top 16 bits and parameter identifier in 8 LSBs
  value = (value &amp; 0xFFFF00) | (which &amp; 0xFF);
//  m_DSPReturn=spi_xchng24(value);

  m_DSPReturn=m Comm->SendDSPWord(value);
#endif

  // changed protocol around to send index followed by data

  char buffer[6];

  buffer[0]=(which>>16) &amp; 0xFF;

  buffer[1]=(which>>8) &amp; 0xFF;

  buffer[2]=which &amp; 0xFF;

  buffer[3]=(value>>16) &amp; 0xFF;

  buffer[4]=(value>>8) &amp; 0xFF;

  buffer[5]=value &amp; 0xFF;

  m_DSPReturn=m_Comm->SendDSPMemory(buffer,6);
}
void CDSP56kManager::SetNotchFreq(long ivalue,long which)
{    
  double value;
  int dspindex=m_Raw2DSPVals[which];    

  if(ivalue>=0)

  SetRawValue(ivalue,which);

  value=ConvertFreqRange(which);

  value=-cos(m_pi*value);

  value*=DSP_CONTROL_MAX;

  m_DSPVals(dspindex)=(long) value;
				
				<dp n="d70"/>
  SendDSPValue(dspindex);

  SetNotchQ(-1L,which+1,which);
}
#ifdef LEGACY
void CDSP56kManager::SetShelvFreq(long ivalue,long which)
{

  double value,wc;

  int dspindex=m_Raw2DSPVals[which];

  if(ivalue>=0)

  SetRawValue(ivalue,which);

  value=ConvertFreqRange(which);

  wc=m_pi*value;

  value=(tan(wc/2)-1)/(tan(wc/2)+1);

  value *=DSP_CONTROL_MAX;

  m_DSPVals[dspindex]=(long) value;

  SendDSPValue(dspindex);
}
#endif
void CDSP56kManager::SetNotchQ(long ivalue,long which,long rawfreq)
{
  double beta,tbeta,q,wc;   
  int dspindex=m_Raw2DSPVals[which];
  if(ivalue>= 0)
  SetRawValue(ivalue,wich);
  wc=ConvertFreqRange(rawfreq);
  wc=m_pi*wc;
  q=ConvertQRange(m_RawVals[which]);
  tbeta=wc/(2*q);
  if(tbeta>m_pi/4)
  tbeta=m_pi/4;
  beta=(1.-tan(tbeta))/(1.+tan(tbeta));
  beta*=DSP_CONTROL_MAX;
  m_DSPVals[dspindex]=(long)beta;
  SendDSPValue(dspindex);
}
void CDSP56kManager::SetBoostCut(long ivalue,long which)
{
  double value;
  int dspindex=m_Raw2DSPVals[which];
  if(ivalue>=0)
  SetRawValue(ivalue,which);
  value=ConvertBoostCutRange(m_RawVals[which]);
  value=pow(10.,value);
  value/=GAIN_SCALE;
  value*=DSP_CONTROL_MAX;
  m_DSPVals[dspindex]=(long)value;
  SendDSPValue(dspindex);
}
void CDSP56kManager::SetShelv1Freq(long ivalue)
{
//  SetShelvFreq(value,kLoShelfFreq);
  double value,wc;
  if(ivalue>=0)
  SetRawValue(ivalue,kLoShelfFreq);
  value=m_RawVals[kLoShelfFreq);
  value/=DSP_CONTROL_MAX;  // normalize
				
				<dp n="d71"/>
  value *= FLCRANGE;    
  value += FLCBOTRANGE;
  value = (pow(10.,value) -1.)/(10.-1.);
  wc = m_pi*value;
  value = (tan(wc/2 )-1)/(tan(wc/2)+1);
  value *= DSP_CONTROL_MAX;
  m_DSPVals[kLoShelfFreq] = (long) value;
  SendDSPValue(kLoShelfFreq);
}
void CDSP56kManager::SetShelv1Boost(long value)
{
  SetBoostCut(value,kLoShelfGain);
}
void CDSP56kManager::SetShelv2Freq(long ivalue)
{
//  SetShelvFreq(value,kHiShelfFreq);
  double value,wc;
  if(ivalue >= 0)

  SetRaValue(ivalue,kHiShelfFreq);
  value=m_RawVals[kHiShelfFreq];
  value /=DSP_CONTROL_MAX; // normalize
  value*=FHCRANGE2;
  value +=FHCBOTRANGE2;
  value=(pow(10.,value) -1.)/(10.-1.);
  wc=m_pi*value;
  value=(tan(wc/2)-1)/(tan(wc/2)+1);
  value *=DSP_CONTROL_MAX;
  m_DSPVals[kHiShelfFreq)=(long)value;
  SendDSPValue(kHiShelfFreq);
}
void CDSP56kManager::SetShelv2Boost(long value)
{
  SetBoostCut(value,kHiShelfGain);
}
void CDSP56kManager::SetNotchlFreq(long value)
{
  SetNotchFreq(value,kNotch1Freq);
}
void CDSP56kManager::SetNotch1Q(long value)
{
  SetNotchQ(value,kNotch1Q,kNotch1Freq);
}
void CDSP56kManager::SetNotch1Cut(long value)
{
  SetBoostCut(value,kNotch1Cut);
}
void CDSP56kManager::SetNotch2Freq(long value)
{
  SetNotchFreq(value,kNotch2Freq);
				
				<dp n="d72"/>
 void CDSP56kManager::SetNotch2Q(long value)
{
   SetNotchQ(value,Notch2Q,kNotch2Freq);
}
 void CDSP56kManager::SetNotch2Cut(long value)
{
   SetBoostCut(value,kNotch2Cut);
}
 void CDSP56kManager::SetNotch9Freq(long value)
{
   double q,f,nf;
   SetNotchFreq(Value,kNotch9Freq);
   f=ConvertFreqRange(kNotch9Freq);
   q=ConvertQRange(m_RawVals[kNotch9Q]);
   nf=f-(f/(5,*q));
   if(nf<0,)
   nf=0,;
   nf=pow(nf,0.5);
   nf=log10((nf*(10.-1.))+1.);
   nf-=FBOTRANGE;
   nf/=(FTOPRANGE-FBOTRANGE);
   nf*=DSP_CONTROL_MAX;   // normalize
   m_RawVals[kNotch8Freq] =(long) nf;
   nf=f+(f/(5.*q));
   if(nf>1.)

   nf=1.;
   nf=pow(nf,0.5);
   nf=log10((nf * (10.-1.))+1.);
   nf-=FBOTRANGE;
   nf/=(FTOPRANGE-FBOTANGE);
   nf*=DSP_CONTROL_MAX;   // normalize
   m_RawVals(kNotchAFreq]=(long)nf;
   SetNotchFreq(-1L,kNotch8Freq);
   SetNotchFreq(-1L,kNotchAFreq);
}
 void CDSP56kManager::SetNotch3Freq(long value)
{
   SetNotchFreq(value,kNotch3Freq);
   m_RawVals[kNotch5Freq]=(m_RawVals[kNotch4Freq]+m_RawVals[kNotch3Freq)/2;
   SetNotchFreq(-1L,kNotch5Freq);
}
void CDSP56kManager::SetNotch3Q(long value)
{
  SetNotchQ(value,kNotch3Q,kNotch3Freq);
}
void CDSP56kManager::SetNotch3Cut(long value )
{
  SetBoostCut(value,kNotch3Cut);
}
				
				<dp n="d73"/>
void CDSP56kManaqer::SetNotch4Freq(long value)
{
  SetNotchFreq(value,kNotch4Freq);
  m_RawVals[kNotch5Freq] = (m_RawVals[kNotch4Freq] + m_RawVals[kNotch3Freg])/2;
  SetNotchFreq(-1L,kNotch5Freq);
}
void CDSP56kManager::SetNotth4Q(long value)
{
  SetNotchQ(value,kNotch4Q,kNotch4Freq);
}
void CDSP56kManager::SetNotch4Cut(long value)
{
  SetBoostCut(value,kNotch4Cut);
}
void CDSP56kManager::SetNotchSQ(long value)
{
  SetNotchQ(value,kNotch5Q,kNotch5Freq);
}
void CDSP56kManager[]SotNotch5Booat(long value)
{    
  SetBoostCut(value,kNotch5Cut);
}
double CDSP56kManager::DoConvertFreqRange(double val,doubls top,double bottom)
{
  val /=DSP_CONTROL_MAX;     // normalize
  val *=top-bottom;
  val +=bottom;
  val =[pow(10.,val)-1.)/(10.-1.);
  return(val);
}
double CDSP56kManager::ConvertFreqRange(int which)
{
  double fval;
  switch(which)

  {

    case kNotch1Freq:

    case kNotch2Freq:

      fval=DoConvertFreqRange(m_RawVals[which].FTOPRANGE3,FBORANGE3);  // top frequency is 0.1 * Nyquis
t

      fval /- SAMPLIG_FREQ/2;

      break ;

    default ;

      fval=DoConvertFreqRange(m_RawVals[which],FTOPRANGE.FBOTRANGE];

      // square log scale

      fval=fval * fval;

      break:

  }
  return(fval);
}
				
				<dp n="d74"/>
// converts Q range to log scale
#define QTOPRANGE 2.258
#define QBOTRANGE 0.037
#define QRANGE(QTOPRANGE-QBOTRANGE)
double CDSP56kManager::ConvertQRange(long ival)
{
  double val;
  val=ival;
  val /=DSP_CONTROL_MAX;    // normalize
  val *=QRANGE;
  val +=QBOTRANGE;
  val=(pow(10.,val)-1.)/(10.-1.);
  return(val);
}
// converts input value to log gain value
//#define LOG8 0.9031
#define LOGGAINSCALE(log10(GAIN_SCALE))
double CDSP56kManager::ConvertBoostCutRange(long ival)
{
  double val;
  val=ival;
  val /=DSP_CONTROL_MAX;  // normalize
  val=(2.*val*LOGGAINSCALE)  - LOGGAINSCALE;
  return(val);
}    
void CDSP56kManager::SetRawValue(long value,long which)
{
  if(value)
  value +=1;
  value <<=CONTROL_RANGE_SC;
  m_RawVals[which]=value;
}
long CDSP56kManager::GetParamValue(long which)
{
  long value;
  if(which >=kUIArraySize)
  value=0x400000L >>CONTROL_RANGE_SC;
  else
  value=m_RawVals[which] >>CONTROL_RANGE_SC;
  value--;
  if(value < 0)

  value=0;
  return(value);
}
void CDSP56kManager::SetParamValue(long value,long which)
{

  switch(which)

  {

  case kHiCutoff2Freq:

    SetHiCutoff2Freq(value);

    break;

  case kHiCutoff2Q:

    SetHiCutoff2Q(value);

    break;

  case kHiCutoffFreq:
				
				<dp n="d75"/>
  SetHiCutoffFreq(value);
  break;
case kHiCutoffQ:
  SetHiCutoffQ(value);
  break;
case kLoCutoffFreq:
  SetLoCutoffFreq(value);
  break;
case kLoCutoffQ:
  SetLoCutoffQ(value);
  break;
case kBypass:
  SetBypass(value);
  break;
case kDDXCompBypass:
  SetDDXCompBypass(value);
  break;
case kHDCDBypass:
  SetHDCDBypass(value);
  break;
case kHDCDGainScaleQff:
  SetHDCDGainScale(value);
  break;
case kAnalogVolume:
  SetAnalogVolume(value);
  break;
case kMainVolume:
  SetMainVolume(value);
  break;
case kPreVolume:
  SetPreVolume(value);
  break;
case kLoShelfFreq:
  SetShelvlFreq(value);
  break;
case kHiShelfFreq:
  SetShelv2Freq(value);
  break;
case kNotch8Cut:
  SetBoostCut(value,which);
  SetBoostCu(value,kNotchCut);    // same value for both notches
  break;
case kNotch1Cut;
case kNotch2Cut:
case kNotch3Cut:
case kNotch4Cut:
case kNotch5Cut:
case kNotch6Cut:
case kNotch7Cut:
case kLoShelfGain:
case kHiShelfGain:
  SetBoostCut(value,which);
  break;
case kNotch9Cut:
  m_DSPVals[kDSPNotch9Cut]=0;    // fixed notch
  SendDSPValue(kDSPNotch9Cut);
  break;
case kNotch3Freq:
  SetNotch3Freq(value);
  break;
case kNotch4Freq:
  SetNotch4Freq(value);
  break;
case kNotch9Freq:
  SetNotch9Freq(value);
  break;
case kNotch1Freq:
case kNotch2Freq:
case kNotch5Freq:
case kNotch6Freq:
case kNotch7Freq:
case kAllpaseFreq:
				
				<dp n="d76"/>
    SetNotchFreq(value,which);

  break;
  case kNotch8Q:

  SetNotchQ(value.which,which-1);

  SetNotchQ(value,kNotchAQ,kNotchAQ-1);    // same value for both notches

  break;
  case kNotch9Q:

  SetNotchQ(value,which,which-1);

  SetNotch9Freq(-1) ;

  break;
  case kNotch1Q:
  case kNotch2Q:
  case kNotch3Q:
  case kNotch4Q:
  case kNotch5Q:
  case kNotch6Q:
  case kNotch7Q:
  case kAllpassQ:

  SetNotchQ(value,which,which-1);

  break;
  case kDelay:

  SetDelay(value);

  break;
//  case kDBNotchWidth:
//    SetDelay(value);

  break;
  case kNotch8Freq:
  case kNotchAFreq:
  case kNotchACut:
  case kNotchAQ:

  break;

  }
}
void CDSP56kManager::SetDSPSettings(CStringArray &amp; array)
{
  int i;
  CString string;
  int index;
  long value;
  int fileversion=0:
  int j=0;
  double fvalue;
  const char *sptr;
  // reset all parameters
  ResetAll();
  // first check for comment at head
  string=array.GetAt(0);
  sptr=string;
  if(strcmp(sptr,"# VERSION")==0)
  {

   string=array.GetAt(1);

   sptr=string;

   sscanf(sptr,"%d",&amp;fileversion);

   j=2;

  }
  for(i=j;i<array.GetSize();i++)

  {

     string=array.GetAt(i);

     sptr=string;

     if(sptr[0]==′#′)continue;    // skip comments
     sscanf(sptr,"%d\t0x%x",&amp;index,&amp;value);

     if(index>=kUIArraySize)continue;

     // Add any special treatment of parameters here

     if(fileversion ==0L)

    {

      switch(index)
				
				<dp n="d77"/>
 {
 case kNotch1Freq:
 case kNotch2Freq:
   fvalue=DoConvertFreqRange(value,FTOPRANGE,FBOTRANGE);
   fvalue=fvalue * fvalue;
   fvalue *=SAMPLING_FREQ/2 ;
   fvalue=log10((fvalue * (10.-1.))+1.);
   fvalue -= FBOTRANGE3;
   fvalue /=(FTOPRANGE3-FBOTRANGE3);
   if(fvalue > 1.0)

   fvalue=1.0;
   fvalue *=DSP_CONTROL_MAX;    // normalize
   value=(long)fvalue;
   break;
   // increased low frcquency
case kHiShelfFreq:
  fvalue=DoConvertFreqRange(value,FHCTOPRANGE,FHCBOTRANGE);
  fvalue=log10((fvalue* (10.-1.)) +1.);
  fvalue -=FHCBOTRANGE2;
  fvalue /=(FHCTOPRANGE-FHCBOTRANGE2);
  if(fvalue > 1.0)

  fvalue=1.0;
  fvalue *= DSP_CONTROL_MAX:    // normalize
  value=(long) fvalue;
  break;
case kHiCutoffFreq:
  fvalue=DoConvertFreqRange(value,FHCTOPRANGE,FHCBOTRANGE);
  fvalue*=SAMPLING_FREQ/2;    
  fvalue=log10((fvalue * (10.-1.))+1.);
  fvalue-=FHCBOTRANGE3;
  fvalue/=(FHCTOPRANGE3-FHCBOTRANGE3);
  if(fvalue>1.0)

  fvalue=1.0;
  fvalue *=DSP_CONTROL_MAX;    // normalize
  value=(long) fvalue;
  break;
  }
}
else if(fileversion==1L)
{
  switch(index)
  {
  case kNotch1Freq:
  case kNotch2Freq:

  fvalue=DoConvertFreqRange(value,FTOPRANGE2,FBOTRANGE2);

  fvalue *=SAMPLING_FREQ/2;

  fvalue=log10((fvalue *(10.-1.))+1.);

  fvalue -=FBOTRANGE3;

  fvalue /=(FTOPRANGE3-FBOTRANGE3);

  if(fvalue>1.0)

    fvalue=1.0;    

  fvalue *=DSP_CONTROL_MAX;    // normalize

  value=(long)fvalue;

  break;
case kLoCutoffFreq:    

  fvalue=DoConvertFreqRange(value,FLCTOPRANGE,FLCBOTRANGE);

  fvalue *=SAMPLING_FREQ/2;

  fvalue=log10((fvalue *(10.-1.))+1.);

  fvalue -=FLCBOTRANGE2;

  fvalue /=(FLCTOPRANGE2-FLCBOTRANGE2);

  if(fvalue>1.0)

    fvalue=1.0; 

  fvalue*=DSP_CONTROL_MAX;    // normalize

  value=(long) fvalue;

  break;
  case kHiCutoff2Freq:

  fvalue=DoConvertFreqRange(value,FTOPRANGE,FBOTRANGE);

  fvalue *=SAMPLING_FREQ/2 ;

  fvalue=log10((fvalue *(10.-1.))+ 1.);

  fvalue *=FHC2BOT;

  fvalue /=(FHC2TOP-FHC2BOT);

  if(fvalue>1.0)
				
				<dp n="d78"/>
       fvalue=1.0;    

     fvalue *=DSP_CONTROL_MAX;    // normalize

     value=(long) fvalue;

     break;

   case kHiCutoffFreq:

     fvalue=DoConvertFreqRange(value,FHCTOPRANGE,FHCBOTRANGE2);

     fvalue *=SAMPLING_FREQ/2;

     fvalue=log10((fvalue *(10.-1.))+1.);

     fvalue -=FHCBOTRANGE3;

     fvalue /=(FHCTOPRANGE3-FHCBOTRANGE3):

     if(fvalue>1.0)

       fvalue=1.0;

     fvalue*=DSP_CONTROL_MAX;    // normalize

     value=(long) fvalue;

     break;

   }
   }
   m_RawVals(index) = value
 }
 // tell DSP of changes
 for(i=0 ; i<kUIArraySize;i++)
   {
   SetParamValue(-1,i);;
   }
 m_DSPVals[kDSPBypassMakl = m_RawVals[kBypassMask];
 SendDSPValue(DSPBypassMask);
}
void CDSP56kManager::GetDSPSettings(CStringArray &amp; array)
{
  char s{1000};
  int i,index;
  int j=0;
  CString cstr;
  // write header(so far only version number)
  cstr="# VERSION";
  array.SetAtGrow(j++,cstr);
  sprintf(s,"%d",FILE_VERSION);
  array.SetAtGrow(j++,s);
  cstr="# DATA";
  array.SetAtGrow(j++,cstr);
  for(i=0;i<kUIArraySize;i++)

  {

    index=kUIArraySize-1-i;

    if(index==kBypass)continue;

    if(index==kHDCDBypass)continue;

    if(index==kHDCDGainScaleOff)continue;

    if(index==kAnalogIn)continue;

    // MM 7/14/99 Added value in human readable form as comment

    GetStringValue(index,cstr);

    sprintf(s,"# %s %s",m_ParamNames[index],cstr);

    array.SetAtGrow(j++,s);

    sprintf(s,"%d\t0x%x",index,m_RawVals[index));

    array.SetAtGrow(j++,s);

  }
}
void CDSP56kManaqer::GetFilterBlob(CStringArray &amp; array)
{
  char s[1000];
  int param;
  int j=0;
  CString cstr;
  float v;
  // write version number
				
				<dp n="d79"/>
//  cstr="# VERSION";
//  array.SetAtGrow(j++.cstr);
  sprintf(s,"%d".BLOB_FILE_VERSION);
  array.SetAtGrow(j++,s);
  // output delay
  param=kDelay;
  GetPureStringValue(param,cstr);
  sscanf(cstr,"%f",&amp;v);
  if(v !=0.)
  {
//  cstr=m_ParamNames(param);    
//  array.SetAtGrow(j++,cstr);

  sprintf(s,"%d",BLOCK_DELAY);

  array.SetAtGrow(j++,s);

  cstr="1";

  array.SetAtGrow(j++.cstr);

  GetPureStringValue(param.cstr);

  array.SettGrow(j++,cstr);
  }
  // output pre-gain
  param=kPreVolume;
//  cstr=m_ParamNames[param];
//  array.SetAtGrow(j++,cstr);
  sprintf(s,"%d",BLOCK_GAIN);
  array.SetAtGrow(j++,s);
  cstr="1";
  array.SetAtGrow(j++,cstr);
  GetPureStringValueparam,cstr);
  array.SetAtGrow(j++,cstr);
  // lo-shelf
  if(!GetBypassSection(kBypassLoshelf) )
  {
//    cstr="Low-Shelf";
//    array.SetAtGrow(j++,cstr);

  sprintf(s,"%d",BLOCK_LS);

  array.SetAtGrow(j++,s);

  cstr="2";

  array.SetAtGrow(j++,cstr);

  GetPureStringValue(kLoShelfFreq,cstr);

  array.SetAtGrow(j++,cstr);

  GetPureStringValue(kLoShelfGain,cstr);

  array.SetAtGrow(j++,cstr);
  }
  // hi-shelf
  if(!GetBypassSection(BypassHiShelf) )
  {
//    cstr="High-Shelf*;
//    array.SetAtGrow(j++,cstr);

  sprintf(s,"%d",BLOCK_HS);

  array.SetAtGrow(j++,s );

  cstr="2";

  array.SetAtGrow(j++,cstr);

  GetPureStringValue(kHiShelfFreq,cstr);

  array.SetAtGrow(j++,cstr);

  GetPureStringValue(kHiShelfGain,cstr);

  array.SetAtGrow(j++,cstr);
  }
  // low peaking cutoff
  if( !GetBypassSection(kBypassHipae)  )
  {
//    cstr="Low Cutoff";
//    array.SetAtGrow(j++,cstr);

  sprintf(s,"%d",BLOCK_HP);

  array.SetAtGrow(j++,s);

  cstr="2":

  array.SetAtGrow(j++,cstr);

  GetPureStringValue(kLoCutoffFrcq,cstr);
				
				<dp n="d80"/>
  array.SetAtGrow(j++,cstr);

  GetPureStringValue(kLoCutoffQ,cstr);

  array.SetAtGrow(j++,cstr);
  }
  // high pcaking cutoff #1
  if(!GetBypassSection(kBypassLopass) )
  {
//    cstr="High Cutoff";
//    array.SetAtGrow(j++,cstr);

  sprintf(s,"%d",BLOCK_LP);

  array.SetAtGrow(j++,s);

  cstr="2";

  array.SetAtGrow(j++,cstr);

  GetPureStringValue(kHiCutoffFreq,cstr);

  array.SetAtGrow(j++,cstr);

  GetPureStringValue(kHiCutoffQ,cstr);

  array.SetAtGrow(j++,cstr);
  }
  // high peaking cutoff #2
  if( !GetBypassSection(kBypassNLopass) )
  {
//    cstr="High Cutoff #2";
//    array.SetAtGrow(j++,cstr);

  sprintf(s,"%d",BLOCK_LP2);

  array.SetAtGrow(j++,s);

  cstr="2";

  array.SetAtGrow(j++,cstr);

  GetPureStringValue(kHiCutoff2Freq,cstr);

  array.SetAtGrow(j++,cstr);

  GetPureStringValue(kHiCutoff2Q,cstr);

  array.SetAtGrow(j++,cstr);
  }
  // resonance comp #1
  if(!GetBypassSection(kBypassNotch1) )
  {
//    cstr= "Parametric EQ";
//    array.SetAtGrow(j++,cstr);

  sprintf(s,"%d",BLOCK_PEQ);

  array.SetAtGrow(j++,s);

  cstr="3";

  array.SetAtGrow(j++,cstr);

  GetPureStringValue(kNotch1Freq,cstr);

  array.SetAtGrow(j++,cstr);

  GetPureStringValue(kNotch1Q,cstr);

  array.SetAtGrow(j++,cstr);

  GetPureStringValue(kNotch1Cut,cstr);

  array.SetAtGrow(j++,cstr);
  }
  // resonance comp #2
  if(!GetBypassSection(kBypassNotch2) )
  {
//    cstr="Parametric EQ";
//    array.SetAtGrow(j++,cstr);

  sprintf(s,"%d",BLOCK_PEQ);

  array.SetAtGrow(j++,s);

  cstr ="3";

  array.SetAtGrow(j++,cstr);

  GetPureStringValue(kNotch2Freq,cstr);

  array.SetAtGrow(j++,cstr);

  GetPureStringValue(kNotch2Q,cstr);

  array.SetAtGrow(j++,cstr);

  GetPureStringValue(kNotch2Cut,cstr);

  array.SetAtGrow(j++,cstr);
  }
  // resonance comp #3
  if( !GetBypassSection(kBypassNotch3)  )
  {
				
				<dp n="d81"/>
//    cstr="Parametric EQ";
//    array.SetAtGrow(j++,cstr);

  sprintf(s,"%d",BLOCK_PEQ);

  array.SetAtGrow(j++,s);

  cstr="3";

  array.SetAtGrow(j++,cstr);

  GetPureStringValue(kNotch6Freq,cstr);

  array.SetAtGrow(j++,cstr);

  GetPureStringValue(kNotch6Q,cstr);

  array.SetAtGrow(j++,cstr);

  GetPureStringValue(kNotch6Cut,cstr);

  array.SetAtGrow(j++,cstr);    
  }
  // resonance comp #4
  if( !GetBypassSection(kBypassNotch4)  )
  {
//    cstr="Parametric EQ";
//    array.SetAtGrow(j++,cstr);

  sprintf(s,"%d",BLOCK_PEQ);

  array.SetAtGrow(j++,s);

  cstr ="3";

  array.SetAtGrow(j++,cstr);

  GetPureStringValue(kNotch7Freq,cstr);

  array.SetAtGrow(j++,cstr);

  GetPureStringValue(kNotch7Q,cstr);

  array.SetAtGrow(j++,cstr);

  GetPureStringValue(kNotch7Cut,cstr);

  array.SetAtGrow(j++,cstr);
  }
  // conecry
  if ( !GetBypassSection(kBypassConecry)  )
  {
//    cstr="Parametric EQ";
//    array.SetAtGrow(j++,cstr);

  sprintf(s,"%d",BLOC_PEQ);

  array.SetAtGrow(j++,s);

  cstr="3";

  array.SetAtGrow(j++,cstr);

  GetPureStringValue(kNotch3Freq,cstr);

  array.SetAtGrow(j++,cstr);

  GetPureStringValue(kNotch3Q,cstr);

  array.SetAtGrow(j++,cstr);

  GetPureStringValue(kNotch3Cut,cstr);

  array.SetAtGrow(j++,cstr);
//    cstr="Parametric EQ";
//    array.SetAtGrow(j++,cstr);

  printf(s,"%d",BLOCK_PEQ);

  array.SettGrow(j++,s);

  cstr ="3";

  array.SetAtGrow(j++,cstr);

  GetPureStringValue(kNotch4Freq,cstr);

  array.SetAtGrow (j++,cstr);

  GetPureStringValue(kNotch4Q,cstr);

  array.SetAtGrow(j++,cstr);

  GetPureStringValue(kNotch4Cut,cstr);

  array.SetAtGrow(j++,cstr);
//    cstr= "Parametric EQ";
//    array.SetAtGrow(j++,cstr);

  sprintf(s,"%d",BLOCK_PEQ);

  array.SetAtGrow(j++,s);

  cstr="3";

  array.SetAtGrow(j++,cstr);

  GetPureStringValue(kNotch5Freq,cstr);

  array.SetAtGrow(j++,cstr);

  GetPureStringValue(kNotch5Q,cstr);

  array.SetAtGrow(j++,cstr);

  GetPureStringValue(kNotch5Cut,cstr);

  array.SetAtGrow(j++,cstr);
				
				<dp n="d82"/>
  }
  // allpass
  if( !GetBypassSection(kBypassAllpass)  )
  {
//     cstr= "Parametric EQ";
//    array.SetAtGrow(j++,cstr);

  sprintf(s,"%d",BLOCK_AP);

  array.SetAtGrow(j++,s);

  cstr="2";

  array.SetAtGrow(j++,cstr);

  GetPureStringValue(AllpassFreq.cstr);

  array.SetAtGrow(j++,cstr);

  GetPureStringValue(kAllpassQ,cstr);

  array.SetAtGrow(j++,cstr);
  }
  // double-tuned notch
  if(!GetBypassSection(BypassDBNotch)  )
  {
//    cstr="Parametric EQ";
//    array.SetAtGrow(j++,cstr);

  sprintf(s,"%d",BLOCK_PEQ);

  array.SetAtGrow(j++,s);

  cstr="3";    

  array.SetAtGrow(j++,cstr);

  GetPureStringValue(kNotch8Freq,cstr);

  array.SetAtGrow(j++,cstr);

  GetPureStringValue(kNotch8Q,cstr);

  array.SetAtGrow(j++,cstr);

  GetPureStringValue(kNotch8Cut,cstr);

  array.SetAtGrow(j++,cstr);
//    cstr="Parametric EQ";
//    array.SetAtGrow(j++,cstr);

  sprintf(s,"%d",BLOCK_PEQ);

  array.SetAtGrow(j++,s);

  cstr="3";

  array.SetAtGrow(j++,cstr);

  GetPureStringValue(kNotch9Freq,cstr);

  array.SettGrow(j++,cstr);

  GetPureStringValue(kNotch9Q,cstr);

  array.SetAtGrow(j++,cstr);

  GetPureStringValue(kNotch9Cut,cstr);

  array.SetAtGrow(j++,cstr);
//    cstr="Parametric EQ";
//    array.SetGrow(j++,cstr);

  sprintf(s,"%d",BLOCK_PEQ);

  array.SetAtGrow(j++,s);

  cstr ="3";

  array.SetAtGrow(j++,cstr);

  GetPureStringValue(kNotchAFreq,cstr);

  array.SetAtGrow(j++,cstr);

  GetPureStringValue(kNotchAQ,cstr);

  array.SetAtGrow(j++,cstr);

  GetPureStringValue(kNotchACut,cstr);

  array.SetAtGrow(j++,cstr);
  }
  // output post-gain
  param=kMainVolume;
//  cstr = m_ParamNames[param];
//  array.SetAtGrow(j++,cstr);

  sprintf(s,"%d",BLOCK_GAIN);

  array.SetAtGrow(j++,s);

  cstr="1";

  array.SetAtGrow(j++,cstr);

  Get PureStringValue(param,cstr);

  array.SetAtGrow(j++,cstr);
				
				<dp n="d83"/>
  }
  void CDSP56kManager::SetPreVolume(long value)
  {

  double fvalue;

  if(value>=0)

    SetRawValue(value,kPreVolume);

  if(m_RawVals[kPreVolume] == DSP_CONTROL_MAX)

    m_DSPVals[kDSPPreVolume] = -m_RawVals[kPreVolume];

  else if(m_RawVals[kPreVolume]==0)

    m_DSPVals[kDSPPreVolume]=0;

  else

    {

      fvalue=m_RawVals[kPreVolume];

      fvalue /=DSP_CONTROL_MAX;  // normalize

      fvalue *=VOLRANGE;

      fvalue +=VOLBOT;

      fvalue=(pow(10.,fvalue)-1.)/(10.-1.);

      fvalue *=DSP_CONTROL_MAX;

      m_DSPVals[kDSPPIeVolume] = (long) -fvalue;

   }
   SendDSPValue(kDSPPreVolume);
  }
  void CDSP56kManager::SetAnalogVolume(long value)
  {

  double fvalue;

  if(value>=0)

    SetRawValue(value,kAnalogVolume);

  if(m_RawVals[kAnalogVolume] == DSP_CONTROL_MAX)

    m_DSPVals[kDSPAnalogVol) = -m_RawVals[kAnalogVolume];

  else if(m_RawVals[kAnalogVolume] == 0)

    m_DSPVals[kDSPAnalogVol] = 0;

  else

    {

      fvalue = m_RawVals[kAnalogVolume];

      fvalue /=DSP_CONTROL_MAX;    // normalize

      fvalue *=VOLRANGE;

      fvalue +=VOLBOT;

      fvalue=(pow(10.,fvalue)-1.)/(10.-1.);

      fvalue *=DSP_CONTROL_MAX;

      m_DSPVals[kDSPAnalogVol] = (long) -fvalue;

    }

  SendDSPValue(kDSPAnalogVol);
}
void CDSP56kManager::SetBypass(long value)
{
  if(value >=0 )

  SetRawValue(value,kBypass);
  if(m_RawVals[kBypass] )

  m_DSPVals[kDSPBypass] = 0x7FFFFF;
  else

  m_DSPVals[kDSPBypass) = 0;
  SendDSPValue(kDSPBypass);
}
void CDSP56kManager::SetLoCutoffFreq(long value)
{
  if(value >=0)
  SetRawValue(value,kLoCutoffFreq);
				
				<dp n="d84"/>
  SetLoCutoff():
}
void CDSP56kManager::SetLoCutoffQ(long value)
{
  if(value >=0 )

  SetRawValue(value,kLoCutoffQ);
  SetLoCutoff();
}
void CDSP56kManager::SetHiCutoffFreq(long value)
{
  if(value >=0)

  SetRawValue(value,kHiCutoffFreq);
  SetHiCutoff();
}
void CDSP56kManager::SetHiCutoffQ(long value)
{
  if(value >=0 )

  SetRawValue(value,kHiCutoffQ);
  SetHiCutoff();
}
void CDSP56kManager::SetHiCutoff2Freq(long value )
{
  if(value >= 0)

  SetRawValue(value,kHiCutoff2Freq);
  SetHiCutoff2();
}


void CDSP56kManager::SetHiCutoff2Q(long value)
{
  if(value >= 0)

  SetRawValue(value,kHiCutoff2Q);
  SetHiCutoff2();
}
void CDSP56kManager::SetHiCutoff()
{
  double f,q;
  double a1,a2,b0;
  q=m_RawVals[kHiCutoffQ];
  q /=DSP_CONTROL_MAX;    // normalize
  q *= QLCRANGE;
  q +=QLCBOTRANGE;   
  q=(pow(10..q)-1.)/(10.-1.);
  if(q >=1.)

  q=0.99999;
  /*f = m_RawVals[kHiCutoffFreq];
  f /= DSP_CONTROL_MAX;    // normalize
  f *= FHCRANGE2;
  f += FHCBOTRANGE2;
  f = (pow[10..f) -1.)/(10.-1.);*/
  f = DoConvertFreqRange(m_RawVals[kHiCutoffFreq],FHCTOPRANGE3,FHCBOTRANGE3);
  f /= SAMPLING_FREQ/2;
  f = 2.*sin(f * m_pi/2.);
				
				<dp n="d85"/>
  a2=1.-f*q;
  if(a2>=2.)

  a2=1.99999;
  else if(a2 <=-2.)

  a2=-1.99999;
  a1=-(2.-f*q-f*f);
  if(a1>=2.)

  a1=1.99999;
  else if(al <=-2.)

  a1=-1.99999;
  b0=f*f/2.;
  if(b0 >=8.)

  b0=7.99999;
  else if(b0 <=-8.)

  b0=-7.99999;
  m_DSPVals[kDSPHiCutoffA2]=(long)(a2*DSP_CONTROL_MAX/2.);
  SendDSPValue(kDSPHiCutoffA2);
  m_DSPVals[kDSPHiCutoffA1]=(long)(a1*DSP_CONTROL_MAX/2.);
  SendDSPValue(kDSPHiCutoffA1);
  m_DSPVals[kDSPHiCutoffScale]=(long)(b0*DSP_CONTROL_MAX/16.);
  SendDSPValue(kDSPHiCutoffScale);
}
void CDSP56kManager::SetHiCutoff2()
{    
  doublef,q;
  double a1,a2,b0;
  double gamma,beta,lambda,alpha;
  q=DSP_CONTROL_MAX-m_RawVals[kHiCutoff2Q];// invert scale
  q/=DSP_CONTROL_MAX                        // normalize
  q*=(QHC2TOP-QHC2BOT);
  q+=QHC2BOT;
  q=(pow(10.,q)-1.)/(10.-1.);
// f=ConvertFreqRange(kHiCutoff2Freq);
  f=DoConvertFreqRange(m_RawVals[kHiCutoff2Freq],FHC2TOP,FHC2BOT);
  f/=SAMPLING_FREQ/2;
  gamma=-cos(f*m_pi);
  beta=(1.-sin(f*m_pi/(2*q)))/(1.+sin(f*m_pi/(2*q)));
   if(beta>2.0)

   beta=2.0;
  lambda=4.*beta*(gamma/(1.+beta));
  if(lambda>2.0)

  lambda=2.0;
  alpha=1.+beta+lambda;
  a2=beta;
  a1=lambda;
  b0=alpha/4.;
  if(b0>=8.)

  b0=7.99999;
  else if(b0<=-8.)

  b0=-7.99999;
  m_DSPVals(kDSP2HiCutoffA2]=(long)(a2*DSP_CONTROL_MAX/2.);
  SendDSPValue(kDSP2HiCutoffA2);
  m_DSPVals[kDSP2HiCutoffA1]=(long)(a1 * DSP_CONTROL_MAX/2.);
  SendDSPValue(kDSP2HiCutoffA1);
  m_DSPVals(kDSP2HiCutoffScale)=(long)(b0 * DSP_CONTROL_MAX/16.);
  SendDSPValue(kDSP2HiCutoffScale);
}
void CDSP56Manager::SetLoCutoff()
{
  double f.q,scale_factor;
				
				<dp n="d86"/>
  q=m_RawVals(kLoCutoffQ];
  q /=DSP_CONTROL_MAX;    // nomalize
  q *=QLCRANGE;
  q *=QLCBOTRANGE;
  q=(pow(10.,q)-1.)/(10.-1.);
  if(q >=1.)

  q=0.99999;
  f=m_RawVals[kLoCutoffFreq);
  f /* DSP_CONTROL_MAX;    // normalize
  f *=(FLCTOPRANGE2-FLCBOTRANGE2);
  f +=FLCBOTRANGE2;    
  f=(pow)10.,f)-1.)/(10.-1.);
  f /=SAMPLING_FREQ/2;
  f=2.*sin(f*m_pi/2.);
  if(f>=1.)

  f=0.99999;
  scale_factor=(4.-2.*f*q-f*f)/4.;
  m_DSPVals[kDSPLoCutoffFc]=(long)(f * DSP_ONTROL_MAX);
  SendDSPValue(kDSPLoCutoffFc);
  m_DSPVals[kDSPLCutoffQc]=(long)(q * DSP_CONTROL_MAX);
  SendDSPValue(kDSPLoCutoffQc);
  m_DSPVals[kDSPLoCutoffffScale]=(long)(-0.5 * scale_factor * DSP_CONTOROL_MAX);
  SendDSPValue(kDSPLoCutoffScale);
}
void CDSP56kManager::SetDDXCompBypass(long value)
{
  if(value >=0)

  SetRawValue(value,kDDXCompBypass);
  if(m_RawVals[kDDXCompBypass])

  m_DSPVals[kDSPDDXCompBypass]=0x7FFFFF;
  else

  m_DSPVals[kDSPDDXCompBypass]=0;
  SendDSPValue[kDSPDDXCompBypass];
}
void CDSP56kManager::SetHDCDBypass(long value)
{
  if(value >=0)

  SetRawValue(value,kHDCDBypass);
  if(m_RawVals[kHDCDBypass])

  m_DSPVals[kDSPHDCDBypass]=0x7FFFFF;
  else

  m_DSPVals[kDSPHDCDBypass]=0;
  SendDSPValue[kDSPHDCDBypass);
}
void CDSP56kManager::SetHDCDGainScale(long value)
{
  if(value >=0)

  SetRawValue(value,kHDCDGainScaleOff);
  if(m_RawVals[kHDCDGainScaleOff] )

  m_DSPVals[kDSPHDCDGainScaleOff]=0x7FFFFF;
  else

  m_DSPVals[kDSPHDCDGainScaleOff]=0;
  SendDSPValue(kDSPHDCDGainScaleOff);
}
void CDSP56kManager::ResetAll()
{
				
				<dp n="d87"/>
  int i;

  for(i=0;i<kUIArraySize:i++)

    {

    m_RawVals[i]=0x400000L;

    }

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

    {

    m_DSPVals[i]=0;

    }

  m_RawVals[kAnalogVolume]=0x800000L;

  m_RawVals[kMainVolume]=0x800000L;

  m_RawVals[kPreVolume]=0x800000L;

  m_RawVals[kBypass]=0x000000L;

  m_RawVals[kHDCDBypass]=0x000000L;

  m_RawVals[kDDXComPBypass]=0x000000L;

  m_RawVals[kHDCDGainScaleOff]=0x000000L;

  m_RawVals[kAnalogIn]=0x000000L;

  m_RawVals(kDelay]=0x000000L;

  m_RawVals[kHiCutoff2Freq]=0x600000L;

  m_RawVals[kHiCutoff2Q]=0x200000L;

  m_RawVals[kHiCutoffFreq]=0x600000L;

  m_RawVals[kHiCutoffQ]=0x200000L;

  m_RawVals[kLoCutoffFreq]=0x40000L;

  m_RawVals[kLoCutoffQ]=0x200000L;

  m_DSPReturn=0;

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

  {

  SetParamValue(-1,i );

  }

  m_DSPVals[kDSPBypassMask]=m_RawVals(kBypasMask]=0L;

  SendDSPValue(kDSPBypassMask);
}
void CDSP56kManager::SetNotch6Freq(long value)
{
  SetNotchFreq(value,kNotch6Freq);
}
void CDSP56kManager::SetNotch6Q(long value)
{
  SetNotchQ(value,kNotch6Q,kNotch6Freq);
}
void CDSP56kManager::SetNotch6Cut(long value)
{
  SetBoostCut(value,kNotch6Cut);
}
void CDSP56kManager::SetNotch7Freq(long value)
{
  SetNotchFreq(value,kNotch7Freq);
}
void CDSP56kManager:;SetNotch7Q(long value)
{
  SetNotchQ(value,kNotch7Q,kNotch7Freq):
				
				<dp n="d88"/>
}
void CDSP56kManager::SetNotch7Cut(long value)
{
  SetBoostCut(value,kNotch7Cut);
}
int CDSP56kManager::GetHDCDMode()
{
//  SetParumValue(-1,kMainVolume);
//  return(m_DSPReturn);
  return(m_Comm->GetDetectState() );
}
void CDSP56kManager::SetAnalogInput(long value)
{
  if(value >=0)

  SetRawValue(value,kAnalogIn);
  if(m_Rawvals[knalogIn])

  m_DSPVals[kDSPAnalogIn]=0x7FFFFF;

  else

  m_DSPVals[kDSPAnalogIn]=0;

  SendDSPValue(kDSPAnalogIn);
}
BOOL CDSP56kManager::IsReady()
{    
  return(m_Comm->CheckState() );
}
void CDSP56kManager::GetPureStringValue(int which,CString &amp;str)
{

  int count;

  GetStringValue(which,str);

  str,TrimLeft();

  count=str.Find(′ ′);

  if(count >=0)

  str=str.Left(count);
}
void CDSP56kManager::GetStringValue(int which,CString &amp;str)
{

  double value;

  char s[100];

  switch(which)

  {

  case kAnalogVolume:

  case kMainVolume:

  case kPreVolume:

  value=m_RawVals[which];

  value /=DSP_CONTROL_MAX;

  value=20 * log10(value);

  sprintf(s,"%10.2f dB",value);

  str=s;

  break;
  case kHiCutoffFreq:

  /* value=m_RawVls[which];

  value /=DSP_CONTROL_MAX;    // normalize

  value*=FHCRANGE2;
				
				<dp n="d89"/>
  value +=FHCBOTRANGE2;
  value=(pow(10.,value)-1.)/(10.-1.);
  value *=SAMPLING_FREQ/2;*/
  value=DoConvertFreqRange(m_RawVals(kHiCutoffFreq),FHCTOPRANGE3,FHCBOTRANGE3);
  sprintf(s,"%10.2f Hz",value);
  str=s;
  break;
case kHiCutoff2Q:
  value=DSP_CONTROL_MAX-m_RawVals[kHiCutoff2Q);
  value /=DSP_CONTROL_MAX;    // normalize
  value *=QHC2TOP-QHC2BOT;
  value +=QHC2BOT;
  value=(pow(10.,value)-1.)/(10.-1.);
  sprintf(s,"%10.2f",value);
  str=s;
  break;
case kHiCutoffQ:

  value=m_RawVals[kHiCutoffQ];

  value /=DSP_CONTROL_MAX;    // normalize

  value *=QLCRANGE;

  value +=QLCBOTRANGE;

  value=(pow(10.,value)-1.)/(10.-1.);

  if(value >=1.)

    value=0.99999;

  sprintf(s,"%10.2f",value);

  str=s;

  break;
 case kLoCutoffFreq:

  value=mRawVals[kLoCutoffFreq];

  value /=DSP_CONTROL_MAX;    // normalize

  value *=(FLCTOPRANGE2-FLCBOTRANGE2);

  value +=FLCBOTRANGE2;

  value=(pow(10.,value)-1.)/(10.-1.);

  sprintf(s,"%10.2f Hz",value);

  str=s;

  break;
case kLoCutoffQ:

  value=m_RawVals[kLoCutoffQ];

  value /=DSP_CONTROL_MAX;    // normalize

  value +=QLCRANGE;

  value +=QLCBOTRANGE;

  value=(pow(10.,value)-1.)/(10.-1.);

  if(value >=1.)

    value=0.99999;

  sprintf(s,"%10.2f",value);

  str=s;

  break;
case kLoShelfFreq:

  value=m_RawVals[kLoShelfFreq];

  value /=DSP_CONTROL_MAX;    // normalize

  value *=FLCRANGE;

  value +=FLCBOTRANGE;

  value=(pow(10.,value)-1.)/(10.-1.);

  value *=SAMPLING_FREQ/2;

  sprintf(s,"%10.2f Hz",value);

  str=s;

  break;
case kHiShelfFreq:

  value=m_RawVals[kHiShelfFreq];

  value /=DSP_CONTROL_MAX;    // normalize

  value *=FHCRANGE2;

  value +=FHCBOTRANGE2;

  value=(pow(10.,value)-1.)/(10.-1.):

  value *=SAMPLING_FREQ/2;

  sprintf(s."%10.2f Hz",value);

  str=s;

  break;
case kNotch1Cut:
case kNotch2Cut:
case kNotch3Cut:
case kNotch4Cut:
case kNotch5Cut:
				
				<dp n="d90"/>
case kNotch6Cut:
case kNotch7Cut:
case kNotch8Cut:
case kNotch9Cut:
case kNotchACut:
case kLoShelfGain:
case kHiShelfGain:
  value=20*ConvertBoostCutRange(m_RawVals[which]);

  sprintf(s,"%10.2f dB",value);

  str=s;

  break;
case kNotch1Freq:
case kNotch2Freq:
case kNotch3Freq:
case kNotch4Freq:
case kNotch5Freq:
case kNotch6Freq:
case kNotch7Freq:
case kNotch8Freq:
case kNotch9Freq:
case kNotchAFreq:
case kAllpassFreq:
  value=ConvertFreqRange(which);
  value *=SAMPLING_FREQ/2;
  sprintf(s,"%10.2f Hz",value);
  str=s;
  break;
case kHiCutoff2Freq:
  value=DoConvertFreqRange(m_RawVals[kHiCutoff2Freq),FHC2TOP,FHC2BOT);
  sprintf(s,"%10.2f Hz".value);
  str=s;
  break;
case kNotch1Q:
case kNotch2Q:
case kNotch3Q:
case kNotch4Q:
case kNotchSQ:
case kNotch6Q:
case kNotch7Q:
case kNotch8Q:
case kNotch9Q:
case kNotchAQ:
case kAllpassQ:
  value=ConvertQRange(m_RawVals[which]);
  sprintf(s,"%10.2f",value);
  str=s:
  break:
case kDelay:
  value=m_RawVals[which];
  value /=DSP_CONTROL_MAX;
  value *=DELAY_LENGTH;
  value /=SAMPLING_FREQ;

  value *=1000.;

  sprintf(s,"%10.2f mS",value);

  str=s:

  break;
  default:

  str="fixed";

  break;
  }
}
BOOL CDSP56kManager::IsBusy()
{

  return(m_Comm->IsTransmitting());
}
void CDSP56kManager::SetBypassSection(BOOL value, int which)
{    
				
				<dp n="d91"/>
  long mask=1L << which;
  if(value)

  {

    m_RawVals[kBypassMask]  |= mask;

  }
  else

  {

    mask=-mask;

    m_RawVals[kBypassMask] &amp;=mask;

  }
  m_DSPVals[kDSPBypassMask]=m_RawVals[kBypassMask];
  SendDSPValue(kDSPBypassMask);
}
BOOL CDSP56kManager::GetBypassSection(int which)
{
  long mask=1L << which;
  return( (m_RawVals[kBypassMask] &amp; mask) !=0);
}
void CDSP56kManager::SetDelay(long value)
{
  if{value >=0)

  SetRawValue(value,kDelay);

  m_DSPVals[kDSPDelay]=m_Rawvals[kDelay];

  SendDSPValue(kDSPDelay);
}
				
				<dp n="d92"/>
// UI IDs
enum {

  kMainVolume,

  kLoShelfFreq,

  kLoShelfGain,

  kHiShelfFreq,

  kHiShelfGain,

  kNotch1Freq,

  kNotch1Q,

  kNotch1Cut,

  kNotch2Freq,

  kNotch2Q,

  kNotch2Cut,

  kNotch3Freq,

  kNotch3Q,

  kNotch3Cut,

  kNotch4Freq,

  kNotch4Q,

  kNotch4Cut,

  kNotch5Freq,

  kNotch5Q,

  kNotch5Cut,

  kPreVolume,

  kBypass,

  kLoCutoffFreq,

  kLoCutoffQ,

  kHiCutoffFreq,

  kHiCutoffQ,

  kHDCDBypass,

  kHDCDGainScaleOff,

  kDDXCompBypass,

  kNotch6Freq,

  kNotch6Q,

  kNotch6Cut,

  kNotch7Freq,

  kNotch7Q,

  kNotch7Cut,

  kAnalogIn,

  kAnalogVolume,

  kDelay,

  kAllpassFreq,

  kAllpassQ,

  kBypassMask,

  kHiCutoff2Freq,

  kHiCutoff2Q,

  kNotch8Freq,

  kNotch8Q,

  kNotch8Cut,

  kNotch9Freq,

  kNotch9Q,

  kNotch9Cut,

  kNotchAFreq,

  kNotchAQ,

  kNotchACut,

  kDBNotchWidth
};
#define kUIArraySize  (kDBNotchWidth+1)
// orphaned control IDs
/*
#define kNotch6Freq           (10000+20)
#define kNotch6Q              (10000+21)
#define kNotch6Boost          (10000+22)
#define kNotch7Freq           (10000+23)
#define kNotch7Q              (10000+24)
#define kNotch7Boost          (10000+25)
#define kLoShelf2Freq         (10000+26)
#define kLoShelf2Boost        (10000+27)
#define kHiShelf2Freq         (10000+28)
#define kHiShelf2Boost        (10000+29)
				
				<dp n="d93"/>
*/
// DSP IDs
enum {

   kDSPMainVolume,

   kDSPLoShelfFreq,

   kDSPLoShelfGain,

   kDSPHiShelfFreq,

   kDSPHiShelfGain,

   kDSPNotch1Freq,

   kDSPNotch1Q,

   kDSPNotch1Cut,

   kDSPNotch2Freq,

   kDSPNotch2Q,

   kDSPNotch2Cut,

   kDSPNotch3Freq,

   kDSPNotch3Q,

   kDSPNotch3Cut,

   kDSPNotch4Freq,

   kDSPNotch4Q,

   kDSPNotch4Cut,

   kDSPNotch5Freq,

   DSPNotch5Q,

   kDSPNotch5Cut,

   kDSPPreVolume,

   kDSPBypass,

   kDSPLoCutoffScale,

   kDSPLoCutoffFc,

   kDSPLoCutoffQc,

   kDSPHiCutoffScale,

   kDSPHiCutoffA2,

   kDSPHiCutoffA1,

   kDSPHDCDBypass,

   kDSPHDCDGainScaleOff,

   kDSPDDXCompBypass,

   kDSPNotch6Freq,

   kDSPNotcb6Q,

   kDSPNotch6Cut,
   kDSPNotch7Freq,

   kDSPNotch7Q,

   kDSPNotch7Cut,

   kDSPAnalogIn,

   kDSPAnalogVol,

   kDSPBypassMask,

   kDPDelay,

   kDSPAllpassFreq,

   kDSPAllpassQ,

   kDSP2HiCutoffScale:

   kDSP2HiCutoffA2,

   kDSP2HiCutoffA1,

   kDSPNotch8Freq,

   kDSPNotch8Q,

   kDSPNotch8Cut,

   kDSPNotch9Freq,

   kDSPNotch9Q,

   kDSPNotch9Cut,

   kDSPNotchAFreq,

   kDSPNotchAQ,

   kDSPNotchACut
  };


  #define kDSPArraySize(kDSPNotchACut+1)
  // bit definitions for kDSPBypassMask above
  enum {

   kBypassNotch1,

   kBypassNotch2,

   kBypassNotch3,

   kBypassNotch4,

   kBypassHipass,

   kBypassLpass,

   kBypassLoshelf,
				
				<dp n="d94"/>
   kBypassHiShelf,

   kBypassConecry,

   kBypassAllpass,

   kBypassDBNotch,

   kBypassNLopass
};
				
				<dp n="d95"/>
  #if !defined(AFX_DBNOTCH_H__241CC3C5_14D9_11D3_96EE_006097CDB9E2__INCLUDED_)
  #define AFX_DBNOTCH_H__241CC3C5_14D9_11D3_96EE_006097CDB9E2__INCLUDED_
  #if_MSC_VER >=1000
  #pragma once
  #endif // _MSC_VER >= 1000
  // DBNotch.h:header file
  //
  class CTabDialog;
  /////////////////////////////////////////////////////////////////////////////
  // CDBNotch dialog
  class CDBNotch:public CPropertyPage
  {

  DECLARE_DYNCREATE(CDBNotch)
  // Construction
  public:

  CDBNotch();

  -CDBNotch();
// Dialog Data

  //{{AFX_DATA(CDBNotch)

  enum{IDD=IDD_PP11};

  CButton m_Bypass;

  CSliderCtrl m_CompGainSlider;

  CSliderCtrl m_CompQSlider;

  CSliderCtrl m_QSlider;

  CSliderCtrl m_FreqSlider;

  //}}AFX_DATA
// Overrides

  // ClassWizard generate virtual function overrides

  //{{AFX_VIRTUAL(CDBNotch).

  Protected:

  virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV support

  //}}AFX_VIRTUAL
// Implementation
 protected:

  // Generated message map functions

  //{{AFX_MSG(CDBNotch)

  afx_msg void OnVScroll(UINT nSBCode,UINT nPos,CScrollBar* pScrollBar);

  afx_msg void OnPaint();

  virtual BOOL OnInitDialog();

  afx_msg void OnBypass();

  //}}AFX_MSG

  DECLARE_MESSAGE_MAP()

  CTabDialog *m_ParentWindow;

  void SendStringToUI(int which);
};
//{{AFX_INSERT_LOCATION}}
// Microsoft Developer Studio will insert additional deClarations immediately before the previous line.
#endif // !defined(AFX_DBNOTCH_H__241CC3C5_14D9_11D3_96EE_006097CDB9E2__INCLUDED_)
				
				<dp n="d96"/>
// DBNotch.cpp:implementation file
//    
#include"stdafx.h"
#include"sa.h"
#include"DBNotch.h"
#include"TabDialog.h"
#include"DSP56kManager.h"
#ifdef_DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] =__FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CDBNotch property page
IMPLEMENT_DYNCREATE(CDBNotch,CPropertyPage)
CDBNotch::CDBNotch() :CPropertyPage(CDBNotch;:IDD)
{
  //{{AFX_DATA_INIT(CDBNotch)

  // NOTE:the ClassWizard will add member initialization here
  //}}AFX_DATA_INIT
}
CDBNotch::-CDBNotch()
{
}
void CDBNotch::DoDataExchange(CDataExchange* pDX)
{

  CPropertyPage::DoDataExchange(pDX);

  //{{AAX_DATA_MAP(CDBNotch)

  DDX_Control(pDX,IDC_CHECK5,m_Bypass);

  DDX_Control(pDX,IDC_SLIDER6,m_CompGainSlider);

  DDX_Control(pDX,IDC_SLIDER5,m_CompQSlider);

  DDX_Control(pDX,IDC_SLIDER2,m_QSlider);

  DDX_Control(pDX,IDC_SLIDER1,m_FreqSlider);

  //}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CDBNotch,CPropertyPage)
  //{{AFX_MSG_MAP(CDBNotch)
  ON_WM_VSCROLL() 
  ON_WM_PAINT()
  ON_BN_CLICKED(IDC_CHECKS,OnBypass)
  //}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CDBNotch message handlers
void CDBNotch::OnVScroll(UINT nSBCode,UINT nPos,CScrollBar* pScrollBar)
{
  // TODO:Add your message handler code here and/or call default
  CSliderCtrl *slider=(CSliderCtrl*)pScrollBar;

  int which;

  CPropertyPage::OnVScroll(nSBCode,nPos,pScrollBar);

  Sleep(50);

  if(slider==&amp;m_FreqSlider)

    which=kNotch9Freq;

  else if(slider==&amp;m_QSlider)

    which=Notch9Q;

  else if(slider==&amp;m_CompQSlider)

    which=kNotch8Q;

  else if(slider==&amp;m_CompGainSlider)

    which=kNotch8Cut;
				
				<dp n="d97"/>
  else

    return;
  g_DSPManager->SetParamValue(CONTRoL_RANGE-slider->GetPos(),which);

  SendStringToUI(which);
}
void CDBNotch::OnPaint()
{    
  CPaintDC dc(this);// device context for painting
  // TODO:Add your message handler code here
  m_FreqSlider.SetPos(CONTROL_RANGE-g_DSPManager->GetParamValue(kNotch9Freq));
  m_QSlider.SetPos(CONTROL_RANGE-g_DSPManager->GetParamValue(kNotch9Q));
  m_CompQSlider.SetPosCONTROL_RANGE-g_DSPManager->GetParamValue(kNotch8Q));
  m_CompGainSlider.SetPos(CONTrOL_RANGE-g_DSPManager->GetParamValue(kNotch8Cut)):
  m_Bypass.SetCheck(g_DSPManager->GetBypassSection(kBypassDBNotch));
  // Do not call CPropertyPage::OnPaint() for painting messages
}
BOOL CDBNotch::OnInitDialog()
{
  CPropertyPage ::OnInitDialog();
  // TODO:Add extra initialization here
  m_FreqSlider.SetRange(0,CONTROL_RANGE);
  m_FreqSlider.SetPos(CONTROL_RANGe-g_DSPManager->GetParamValue(kNotch9Freq));
  m_FreqSlider.SetTicFreq((CONTROL_RANGE+1)/16);
  m_QSlider.SetRange(0,CONTROL_RANGE);
  m_QSlider.SetPos(CONTROL_RANGE-g_DSPManager->GetParamValue(kNotch9Q));
  m_QSlider.SetTicFreq((CONTROL_RANGE+1)/16);
  m_CompQSlider.SetRange(0,CONTROL_RANGE);
  m_CompQSlider.SetPos(CONTROL_RANGE-g_DSPManager->GetParamValue(kNotch8Q));
  m_CompQSlider.SetTicFreq((CONTROL_RANGE+1)/16);
  m_CompGainslider.SetRange(0,CONTROL_RANGE);
  m_CompGainSlider.SetPos(CONTROL_RANGE-g_DSPManager->GetParamValue(kNotch8Cut));
  m_CompGainSlider.SetTicFreq((CONTROL_RANGE+1)/16);


  m_ParentWindow=(CTabDialog*) GetParent()->GetParent();
  return RUE;// return TRUE unless you set the focus to a control

            // EXCEPTION:OCX Property Pages should return FALSE
}      
void CDBNotch::SendStringToUI(int which)
{

  CString str;

  g_DSPManager->GetStringValue(which,str);

  m_ParentWindow->SetStatusString(0,str);
}
void CDBNotch::OnBypass()
{
  // TODO:Add your control notification handler code here
  int state=m_Bypass.GetState() &amp; 0x3;
  g_DSPManager->SetBypassSection(state,kBypassDBNotch);
}
				
				<dp n="d98"/>
// MainPage.cpp:implementation file
#include"TabDialog.h"
#include"DSP56kManager.h"
#include <stdlib.h>
#ifdef_DEBUG
#define new DEBUG_NEW
#undef 7HIS_FILE
static char THIS_FILE[]=__FILE__;
/////////////////////////////////////////////////////////////////////////////
// CMainPage property page
IMPLEMENT_DYNCREATE(CMainPage,CPropertyPage)
CMainPage::CMainPage():CPropertyPage(CMainPage::IDD)
{
  //{{AFX_DATA_INIT(CMainPage)
  m_ypassCheckBox=FALSE;
  m_HDCDBypass=FALSE;
  m_GainScaleBypass=FALSE;
  m_AnalogInput=FALSE;
  //}}AFX_DATA_INIT
}
CMainPage::-CMainPage()
{
}
void CMainPage::DoDataExchange(CDataExchange* pDX)
{
  CPropertyPage::DoDataExchange(pDX);
  //{{AFX_DATA_MAP(CMainPage)
  DDX_Control(pDX,IDC_SLIDER8,m_Delay);
  DDX_Control(pDX,IDC_SLIDER7,m_AnalogVol);
  DDX_Control(pDX,IDC_BUTTON1,m_ResetAll);
  DDX_Control(pDX,IDC_SLIDER3,m_PreVolumeSlider);
  DDX_Control(pDX,IDC_SLIDER1,m_VolumeSlider);
  DDX_Check(pDX,IDC_CHECK1,m_BypassCheckBox);
  DDX_Check(pDX,IDC_CHECK2,m_HDCDBypass);    
  DDX_Check(pDX,IDC_CHECK3,m_GainScaleBypass);
  DDX_Check(pDX,IDC_CHECK4,m_AnalogInput);
  //}}AFX_DATA_MAP
}
BEGIN_MESSAGE MAP(CMainPage,CPropertyPage)
  //{{AFX_MSG_MAP(CMainPage)
  ON_WM_VSCROLL()
  ON_WM_SHOWWINDOW()
  ON_BN_CLICKED(IDC_CHECK1,OnBypassButton)
  ON_WM_PAINT()
  ON_BN_CLICKED(IDC_CHECK2,OnHDCDBypass)
  ON_BN_CLICKED(IDC_CHECK3,OnGainScaleBypass)
  ON_BN_CLICKED(IDC_BUTTON1,OnResetAll)
  ON_BN_CLICKED(IDC_CHECK4,OnAnalogInput)
  //}}AFx_MSG_MAP
END_MESSAG_MAP()
/////////////////////////////////////////////////////////////////////////////
// CMainPage message handlers
void CMainPage::OnVScroll(UINT nSBCode,UINT nPos,CScrollBar* pScrollBar)
				
				<dp n="d99"/>
{
  // TODO:Add your message handler code here and/or call default
  CSliderCtrl *slider=(CSliderCtrl*)pScrollBar;
  int which;
  CPropertyPage::OnVScroll(nSBCode,nPos,pScrollBar);
  Sleep(50);
  if(slider==&amp;m_VolumeSlider)

  which=kMainVolume;
  else if(slider==&amp;m_PreVolumeSlider)

  which=kPreVolume;
  else if(slider==&amp;m_AnalogVol)

  which=kAnalogVolume;
  else if(slider==&amp;m_Delay)

  which=kDelay;
  else

  return;
  g_DSPManager->SetParamValue(CONTROL_RANGE-slider->GetPos(),which);
  SendStringToUI(which);
}
BOOL CMainPage::OnInitDialog()
{
  CPropertyPage::OnInitDialog();
  // TODO:Add extra initialization here
  m_VolumeSlider.SetRange(0,CONTROL_RANGE);
  m_VolumeSlider.SetPos(CONTROL_RANGE-g_DSPManager->GetParamValue(kMainVolume));
  m_VolumeSlider.SetTicFreq((CONTROL_RANGE+1)/16);
  m_VolumeSlider.SetPageSize(PG_CONTROL_AMT);
  m_PreVolumeSlider.SetRange(0,CONTROL_RANGE);
  m_PreVolumeSlider.SetPos(CONTROL_RANGE-g_DSPManager->GetParamValue(kPreVolume));
  m_PreVolumeSlider.SetTicFreq((CONTROL RANGE+1)/16);
  m_PreVolumeSlider.SetPageSize(PG_CONTROL_AMT);
  m_AnalogVol.SetRange(0,CONTROL_RANGE);
  m_AnalogVol.SetPos(CONTROL_RANGE-g_DSPManager->GetParamValue(kAnalogVolume));
  m_AnalogVol.SetTicFreq((CONTROL_RANGE+1)/16);
  m_AnalogVol.SetPageSize(PG_CONTROL_AMT);
  m_Delay.SetRange(0,CONTROL_RANGE);
  m_Delay.SetPos(CONTROL_RANGE-g_DSPMnager->GetParamValue(kAnalogVolume));
  m_Delay.SetTicFreq((CONTROL_RANGE+1)/16);
  m_Delay.SetPageSize(PG_CONTROL_AMT);
  m_BypassCheckBox=false;
  m_ParentWindow=(CTabDialog *)GetParent()->GetParent();
  return TRUE:// return TRUE unless you set the focus to a control

             // EXCEPTION:OCX Property Pages should return FALSE
}
void CMainPage::OnShowWindow(BOOL bShow,UINT nStatus)
{
  CPropertyPage::OnShowWindow(bShow,nStatus);
  // TODO:Add your message handler code here
 }
void CMainPage::OnBypassButton()
{
  // TODO:Add your control notification handler code here
  m_BypassCheckBox= !m_BypassCheckBox;
  g_DSPManager->SetBypass(m_BypassCheckBox);
}
void CMainPage::OnPaint()
				
				<dp n="d100"/>
{
  CPaintDc dc(this);// device context for painting
  // TODO:Add your message handler code here
  m_VolumeSlider.SetPos(CONTROL_RANGE-g_DSPManager->GetFaramValue(kMainVolume));
  m_PreVolumeSlider.SetPos(CONTROL_RANGE-g_DSPManager->GetParamValue(kPreVolume));
  m_AnalogVol.SetPos(CONTROL_RANGE-g_DSPManager->GetParamValue(kAnalogVolue));
  m_Delay.SetPos(CONTROL_RaNCE-g_DSPManager-GetParamValuc(kDelay));
  // Do not call CPropertyPage::OnPaint() for painting messages
}
void CMainPage::OnRDCDBypass()
{
  // TODO:Add your control notification handler code here
  m_HDCDBypass=!m_HDCDBypass;
  g_DSPManager->SetHDCDBypass(m_HDCDBypass);
}
void CMainPage::OnGainScaleBypass()
{
  // TODO:Add your control notification handler code here
  m_GainScaleDypass=!m_GainScaleBypass;
  g_DSPManager->SetHDCDGainScale(m_GainScaleBypass);
}
void CMainPage::OnResetAll()
{
  // TODO:Add your control notification handler code here
  // MM 8/3/99 Added extra dialog warning.
  if(MessageBox("Are you sure you want to reset all parameters?","WARNING*,MB_YESNO) !=IDYES)

  return;
  g_DSPManager->ResetAll();
  m_VolumeSlider.SetPos(CONTROL_RANGE-g_DSPManager->GetParamValue(kMainVolume));
  m_PreVolumeSlider.SetPos(CONTROL_RANGE-g_DSPManager->GetParamValue(kPreVolume));
  m_AnalogVol.SetPos[CONTROL_RANGE-g_DSPManager->GetParamValue(kAnalogVolume));
  m_Delay.SetPos(CONTROL_RANGE-g_DSPManager->GetParamValue(kDelay));
}
void CMainPage::OnAnalogInput()
{    

  // TODO;Add your control notification handler code here

  m_AnalogInput=!m_AnalogInput;

  g_DSPManager->SetAnalogInput(m_AnalogInpit);
}
void CMainPage::SendStringToUI(int which)
{
  CString str;

  g_DSPManager->GetStringValue(which,str);

  m_ParentWindow->SetStatusString(0,str);
}
				
				<dp n="d101"/>
#if !defined(AFX_MAINPAGE_H_90463DA4_D52E_11D2_96EE_006097CDB9E2__INCLUDED_)
#define AFX_MAINPAGE_H_90463DA4_D52E_11D2_96EE_006097CDB9E2__INCLUDED_
#if_MSC_VER >=1000
#pragma once
#endif
//_MSC_VER >=1000
// MainPage.h:header file
//
class CTabDialog;
/////////////////////////////////////////////////////////////////////////////
// CMainPage dialog
class CMainPage:public CPropertyPage
{
  DECLARE_DYNCREATE(CMainPage)
// Construction    
public:
  CMainPage();
  -CMainPage();
// Dialog Data
  //{{AFX_DATA(CMainPage)
  enum {IDD=IDD_PP2};
  CSliderCtrl m_Delay;
  CSliderCtrl m_AnalogVol;
  CButton m_ResetAll;
  CSliderCtrl m_PreVolumeSlider;
  CSliderCtrl m_VolumeSlider;
  BOOL m_BypassCheckBox;
  BOOL m_HDCDBypass;
  BOOL m_GainScaleBypass;
  BOOL m_AualogInput;
  //}}AFX_DATA
// Overrides
  // ClassWizard generate virtual function overrides
  //{{AFX_VIRTUAL(CMainPage)
  protected:
  virtual void DoDataExchange(CDataExchange* pDX);  // DDX/DDV support
  //}}AFX_VIRTUAL
// Implementation
protected:    
  // Generated message map functions
  //{{AFX_MSG(CMainPage)  
  afx_msg void OnVScroll(UINT nSBCode,UINT nPos,CScrollBar* pScrollBar);
  virtual BOOL OnInitDialog();
  afx_msg void OnShowWindow(BOOL bShow,UINT nStatus);
  afx_msg void OnBypassButton();
  afx_msg void OnPaint();
  afx_msg void OnHDCDBypass();
  afx_msg void OnGainScaleBypass();
  afx_msg void OnResetAll();
  afx_msg void OnAnalogInput();
  //}}AFX_MSG
  DECLARE_MESSAGE_MAP()
  CTabDialog *m_ParentWindow;
  void SendStringToUI(int which);
private:
};
//{{AFX_INSERT_LOCATION}}
				
				<dp n="d102"/>
// Microsoft Developer Studio will insert additional declarations immediately before the previous line.
#endif // !defined(AFX_MAINPAGE_H_90463DA4_D52E_11D2_96EE_006097CDB9E2__INCLUDED_)
				
				<dp n="d103"/>
// I2CIPortComm.h;interface for the I2CIPortComm class.
//
//////////////////////////////////////////////////////////////////////
#if !defined(AFX_I2CIPORTCOMM_H__33F9EF07_F6EF_11D2_96EE_006097CDB9E2__INCLUDED_)
#define AFX_I2CIPORTCOMM_H__33F9EF07_F6EF_11D2_96EE_006097CDB9E2__INCLUDED_
#if _MSC_VER >=1000
#pragma once
#endif //_MSC_VER >=1000
#include"DSPComm.h"
enum{

  MI2C_STATE_CLOSED,

  MI2C_STATE_PENDING_OPEN,

  MI2C_STATE_OPEN,

  MI2C_STATE_PENDING_TX,

  MI2C_STATE_PENDING_RX
};
#define MI2_BUFFER_SIZE(3*3000)    // should be multiple of 3
class I2CIPortComm:public DSPComm
{
  int   m_state;
  int   m_error_code;
  long  m_TxReq;
  char  m_tx_buffer[MI2_BUFFER_SIZE];
  long  m_tx_write,m_tx_read;
  long  m_detect;
  BOOL  m_get_detect;
  long  m_retryCount;
  BOOL m_initialTry;
  HWND m_HWnd;
public:
  virtual BOOL IsTransmitting(void);
  virtual long GetDetectState(void);
  virtual void MessageHandler(WPARAM iPortEventCode);
  virtual BOOL CheckState(void);
  I2CIPortComm(HWND p);
  virtual-I2CIPortComm();
  virtual long SendDSPWord(long);
  virtual long SendDSPMemory(char *,long);
};
#endif // !defined(AFX_I2CIPORTCOMM_H__33F9EF07_F6EF_11D2_96EE_006097CDB9E2__INCLUDED_)
				
				<dp n="d104"/>
//  I2CIPortComm.cpp:implementation of the I2CIPortComm class.
//
//////////////////////////////////////////////////////////////////////
#include"stdafx.h"
#include"sa.h"
#include"I2CIPortComm.h"
#include"COMPortChooser.h"
#include"i2c200.h"
static struct I2C_PROP i2c;
static I2CIPortComm *g_I2CComm=NULL;
#define I2C_SLAVE_ADDRESS 0xs0
#define I2C_MAX_AMOUNT(5*3)    // don′t send more than this in one-shot
#define I2C_RETrY_COUNT 0
#ifdef_DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
//static int cb_message;
void iPortMsgHandler(WPARAM iPortEventCode)
{
  if(g_I2CComm)

  g_I2CComm->MessageHandler(iPortEventCode);
}
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
/*static BOOL wait_for_message(void)
{
  long count;
  while(cb_message==-1)
  {

  Sleep (100);

  count++;

  if(count>20)

    return(false);

  }

  return(true);
  }*/
  I2CIPortComm::I2CIPortComm(HWND p)
  {

  int r;

  CCOMPortChooser dlg;

  dlg.DoModal();

  m_error_code=0;

  m_state=MI2C_STATE_CLOSED;

  m_TxReq=0;

  m_tx write=m_tx_read=0;

  m_detect=0;

  m_get_detect=false;

  m_initialTry=false;

  m_HWnd=p;

  i2c.comport=dlg.which_port;
				
				<dp n="d105"/>
  i2c.WmMsgNo=0;

  i2c.pfCBF=iPortMsgHandler;
#ifdef    NDEBUG

  i2c.pcLogFileName=NULL;
#else

  i2c.pcLogFileName="log.txt";
#endif

  i2c.LogFileLevel=1;

  i2c.LogFileSize=1000;

  i2c.HostSlaveAddr=0x6E;

  i2c.BusTimeOut=1000;

  i2c.MasterBitRate=2;    // 100kHz

  i2c.MasterRxBufSize=512;

  i2c.MasterTxBufSize=MI2_BUFFER_SIZE;

  i2c.MasterArbRetry=0;

  i2c.SlaveRxGCEnable=1;

  i2c.SlaveRxBufSize=512;

  i2c.SlaveTxBufSize=512;

  r=I2COpen(m_HWnd,AfxGetInstanceHandle(),&amp;i2c);

  if(r)

     m_error_code=0x1000;

  m_state=MI2C_STATE_PENDING_OPEN;

  g_I2CComm=this;
}
I2CIPortComm::-I2CIPortComm()
{
  I2CClose();
  g_I2CComm=NULL;
}
long I2CIPortComm::SendDSPWord(long value)
{
  char  buffer[3];
  if(m_state<MI2C_STATE_OPEN)
  return(0L);
  buffer[0]=(value >> 16)&amp; 0xFF;
  buffer[1]=(value >> 8)&amp; 0xFF;
  buffer[2]=value &amp; 0xFF;
  return(SendDSPMemory(buffer,3) );
}
long I2CIPortComm::SendDSPMemory(char"data,long len)
{
  // make sure the link is valid
  if(m_state < MI2C_STATE_OPEN)

  return(0L);

  long rval=0L;

  long b;

  long tocopy,amount,freespace;

  // copy data into the tx buffer
  if(data )

  {

  freespace=m_tx_read-m_tx_write;

  if(freespace <= 0)

    freespace +=MI2_BUFFER_SIZE;

  ASSERT((len+3) <= freespace);// not enough space in the buffer

  for(tocopy=len;tocopy >0;tocopy -=amount)
{

  if(m_tx_write >=m_tx_read)

  {
				
				<dp n="d106"/>
        amount=MI2_BUFFER_SIZE-m_tx_write;

      }

      else

      {

        amount=m_tx_read-m_tx_write;

      }

      amount=min(amount.tocopy);

      memcpy(m_tx_buffer+m_tx_write.data.amount);

      data +=amount;

      m_tx_write +=amount;

      m_tx_write %=MI2_BUFFER_SIZE;

  }
  }
  // attempt to send it
  if(m_state==MI2C_STATE_OPEN)
  {

  amount=m_tx_write - m_tx_read;
//    ASSERT(amount==((amount/3)*3));

  if(amount <0)

    amount=MI2_BUFFER_SIZE-m_tx_read;    
//    amount=(amount/3)   *3;    // Send complete DSP Words.

  amount=min(amount.I2C_MAX_AMOUNT);     // throttle

  b=I2CMasterTx(I2C_SLAVE_ADDRESS.(unsigned char *)m_tx_buffer+m_t_read.amount,1);

  if(b==0)

    {

     m_state=MI2C_STATE_PENDING_TX;

     m_TxReq=amount;

     if((im_initialTry)

     {

       m_retryCount=0;

       m_initialTry=true;

      }

    }

  else

  {

    if(m_error_code==0)

      m_error_code=b;

    ASSERT(b==0);

  }
  }
  return(rval);
}
void I2CIPortComm::MessageHandler(WPARAM iPortEventCode)
{

  struct I2C_PROP si2c;

int r;

  long tx_count;

  long val;

  unsigned char buffer[10];

  switch(m_state)

    {

      case MI2C_STATE_PENDING_OPEN:

        if(iPortEventCode==I2C_OPEN_SUCCESSFUL)

        {

         m_state=MI2C_STATE_OPEN;

         if(m_tx_read !=m_tx_write)

           SendDSPMemory(NULL.0L);

       }

       else

         m_error_code=iPortEventCode;

       break;

     case MI2C_STATE_PENDING_RX:

       if(iPortEventCode==I2C_MRX_COMPLETE)

       {

         r=I2CGctMasterRxMsg(3.buffer);

         if(r==3)
				
				<dp n="d107"/>
      val=buffer[0] &amp; 0xFF;

      val <<8;

      val=val |(buffer[1]&amp; 0xFF);

      val <<8;

      val=val |(buffer[2] &amp; 0xFF);

      m_detect=val;

    }

  }

  //else

  //   m_error_code=iPortEventCode;

  m_state=MI2C_STATE_OPEN;

  if(m_tx_read !=m_tx_write)

    SendDSPMemory(NULL.0L);

  break;
  case MI2C_STATE_PENDING_TX:

  if(iPortEventCode==I2C_MTX_COMPLETE)

  {

    // MM 5/20/99 Don′t call status here.
//      r=I2CGetStatus(&amp;si2c);//      tx_count=si2c.MasterTxByteCount;

    tx_count=m_TxReq;

    m_initialTry=false;

  }

  else

  {  

    m_retryCount++;

    if(m_retryCount > I2C_RETRY_COUNT)

    (

      m_initialTry=false;

      if(m_error_code==0)

        m_error_code=iPortEventCode;

      //ASSERT(m_retryCount <=I2C_RETRY_COUNT);

      I2CClose();

      r=I2COpen(m_HWnd.AfxGetInstanceHandle(),&amp;i2c);

      ASSERT(r==0);    

      m_state=MI2C_STATE_PENDING_OPEN;

      return;

    }

    tx_count=0;

  }

  m_state=MI2C_STATE_OPEN;

  m_tx_read +=tx_count;

  m_tx_read %=MI2_BUFFER_SIZE;

  if(m_get_detect)

  {

    m_get_detect=false;

    r=I2CMasterRxExt(I2C_SLAVE_ADDRESS,3.1.1);

    if(r)

    {

    if(m_error_code==0 )

      m_error_code=r;

  }

  else

    m_state=MI2C_STATE_PENDING_RX;

  }

  else if(m_tx_read !=m_tx_write)

    SendDSPMemory(NULL.0L);

  break;
/*    case MI2C_STATE_PENDING_TX;

  if(iPortEventCode==I2C_MTX_COMPLETE)

  {

    r=I2CGetStatus(&amp;si2c);

    if(m_TxReq==si2c.MasterTxByteCount)

    {

       m_state=MI2C_STATE_OPEN;

       m_tx_read +=m_TxReq;

       m_tx_read %=MI2_BUFFER_SIZE;

       if(m_tx_read !=m_tx_write)

          SendDSPMemory(NULL.0L);
				
				<dp n="d108"/>
    }

  }

  else

  {

    m_error_code=iPortEventCode;

    ;m_tx_read=m_tx_write=0;

    m_state=MI2C_STATE_OPEN;

    if(m_tx_read !=m_tx_write)

      SendDSPMemory(NULL.0L);

  }

  break;*/
  }
}
BOOL I2CIPortComm::CheckState()
{
  return(m_state==MI2C_STATE_OPEN);
}
long I2CIPortComm::GetDetectState()
{
   long r.rval=0;
   if(m_error_code)
   {

    rval=-m_error_code;

    m_error_code=0;
   }
   else
   {

   rval=(m_detect)?1:0;
   }
   /*if(m_state==MI2C_STATE_PENDING_TX)

   m_get_detect=true;

  else if(m_state==MI2C_STATE_OPEN)

  {

    r=I2CMasterRxExt(I2C_SLAVE_ADDRESS,3,1,1);

    if(r)

      m_error_code=r;

    else

      m_state=MI2C_STATE_PENDING_RX;

  }*/

  return(rval);
}
BOOL I2CIPortComm;:IsTransmitting()
{
  return(m_tx_write !=m_tx_read);
}
				
				<dp n="d109"/>
#if !defined(AFX_I2CDIALOG_H__B5D510E6_F7D5_11D2_96EE_006097CDB9E2__INCLUDED_)
#define  AFX_I2CDIALOG_H__B5D510E6_F7D5_11D2_96EE_006097CDB9E2_INCLUDED_
#if_MSC_VER>=1000
#pragma once
#endif // _MSC_VER >=1000
// I2CDialog.h :header file
//
/////////////////////////////////////////////////////////////////////////////
// CI2CDialog dialog
class CI2CDialog:public CDialog
{

  UINT           m_timerID;

  int            m_state;
// Construction
public:
  CI2CDialog(CWnd* pParent=NULL);    // standard constructor
// Dialog Data
  //{{AFX_DATA(CI2CDialog)    
  enum(IDD=IDD_DIALOG2);

  // NOTE:the ClassWizard will add data members here
  //}}AFX_DATA
// Overrides
   // ClassWizard generated virtual function overrides
   //{{AFX_VIRTUAL(CI2CDialog)
   public:
   virtual BOOL OnCmdMsg(UINT nID,int nCode,void* pExtra,AFX_CMDHANDLERINFO* pHandlerInfo);
   protected:virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV support
   //}}AFX_VIRTUAL
// Implementation
protected:
  // Generated message map functions
  //{{AFX_MSG(CI2CDialog)
  virtual BOOL OnInitDialog();
  afx_msg void OnTimer(UINT nIDEvent);
  afx_msg void OnClose();
  //)}AFX_MSG
  DECLARE_MESSAGE_MAP()
};
//{{AFX_INSERT_LOCATION}}
// Microsoft DeveloperStudio willinsert additional declarations immediately before the provlous line.
#endif // !defined(AFX_I2CDIALOG_H__B5D510E6_F7D5_11D2_96EE_006097CDB9E2__INCLUDED_)
				
				<dp n="d110"/>
  // I2CDialog.cpp:implementation file
  //
  #include"stdafx.h"
  #include"sa.h"
  #include "I2CDialog.h"
  #include"DSP56kManager.h"
  #define TIMERID 55
  #ifdef_DEBUG
  #define new DEBUG_NEW    
  #undef THIS_FILE
  static char THIS_FILE[] =__FILE__:
  #endif
  /////////////////////////////////////////////////////////////////////////////
  // CI2CDialog dialog
  CI2CDialog::CI2CDialog(CWnd* pParent /*=NULL*/)

  :CDialog(CI2CDialog::IDD,pParent)
  {

  //{{AFX_DATA_INIT(CI2CDialog)    

    //NOTE:the ClassWizard will add member initialization here

  //}}AFX_DATA_INIT
}
void CI2CDialog::DoDataExchange(CDataExchange* pDX)
{
  CDialog::DoDataExchange(pDX);
  //{{AFX_DATA_MAP(CI2CDialog)

  //NOTE:the ClassWizard will add DDX and DDV calls here
  //}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CI2CDialog,CDialog)
  //{{AFX_MSG_MAP(CI2CDialog)
  ON_WM_TIMER()
  ON_WM_CLOSE()
  //}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CI2CDialog message handlers
BOOL CI2CDialog::OnInitDialog()
{
  CDialog::OnInitDialog();
  // TODO:Add extra initialization here
  g_DSPManager=new CDSP56kManager(this->m_hWnd);
  m_timerID=0;
  m_timerID=SetTimer(TIMERID,50,NULL);
  m_state=0;
  return TRUE:// return TRUE unless you set the focus to a control

            // EXCEPTION:OCX Property Pages should return FALSE
}
void CI2CDialog::OnTimer(UINT nIDEvent)
{
  // TODO:Add your message handler code here and/or call default
  if(nIDEvent==TIMERID)

  {

   if(g_DSPManager->IsReady())    

   {

      switch(m_state)
				
				<dp n="d111"/>
        `     

        case 0 :

        g_DSPManager->DownloadDSPCode();

        m_state++;

        break:

      case 1:

        g_DSPManager->ResetAll();

        EndDialog(IDOK);

        break;

      default:

        EndDialog(IDOK);

        break;

      }

  }

  else if(g_DSPMananager->GetHDCDMode() < 0)

    EndDialog(IDABORT);

  }
  else

  {

    CDialog::OnTimer(nIDEvent);

  }
}
BOOL CI2CDialog::OnCmdMsg(UINT nID,int nCode,void* pExtra,AFX_CMDHANDLERINFO* pHandlerInfo)
  // TODO:Add your specialized code here and/or call the base class
  return CDialog::OnCmdMsg(nID,nCode,pExtra,pHandlerInfo);
}
void CI2CDialog::OnClose()
{
  // TODO:Add your message handler code here and/or call default
  if(m_timerID)

  KillTimer(m_timrID);
  CDialog::OnClose();.
}
				
				<dp n="d112"/>
#if !defined(AFX_I2CCOMMERRORDIALOG_H__76C389E8_F889_11D2_96EE_006097CDB9E2__INCLUDED_)
#define AFX_I2CCOMMERRORDIALOG_H__76C389E8_F889_11D2_96EE_006097CDB9E2_INCLUDED_
#if_MSC_VER >=1000
#pragma once
#endif // _MSC_VER >=1000
// I2CCommErrorDialog.h:header file
//
/////////////////////////////////////////////////////////////////////////////
// CI2CCommErrorDialog dialog
class CI2CCommErrorDialog:public CDialog
{
// Construction
public:
  CI2CCommErrorDialog[CWnd* pParent=NULL);// standard constructor
// Dialog Data
  //{{AFX_DATA(CI2CCommErrorDialog)
  enum{IDD=IDD_DIALOG4};
  CString m_ErrorCode;
  //}}AFX_DATA
// Overrides
  // ClaseWizard generated virtual function overrides
  //((AFX_VIRTUAL(CI2CCommErrorDialog)
  protected:
  virtual void DoDataExchange(CDataExchange* pDX);  // DDX/DDV support
  //}}AFX_VIRTUAL
// Implementation
protected:
  // Generated message map functions
  //{{AFX_MSG(CI2CCommErrorDialog)
  afx_msg void OnButton1();
  //}}AFX_MSG
  DECLARE_MESSAGE_MAP()
} ;
//[{AFX_INSERT_LOCATION}}
// Microsoft Developer Studio will insert additional declarations immediately before the previous line.
#endif //!defined(AFX_I2CCOMMERRORDIALOG_H_76C389E8_F889_11D2_96EE_006097CDE9E2__INCLUDED_)
				
				<dp n="d113"/>
// I2CCommErrorDialog.cpp:implementation file
//
#include"stdafx.h"
#include"sa.h"
#include"I2CCommErrorDialog.h"
#ifdef_DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CI2CCommErrorDialog dialog
CI2CCommErrorDialog::CI2CCommErrorDialog(CWnd* pParent /*=NULL*/)
  :CDialog(CI2CCommErrorDialog::IDD,pParent)
{
  //{{AFX_DATA_INIT(CI2CCommErrorDialog)
  m_ErrorCode=_T("");
  //}}AFX_DATA_INIT
}
void CI2CCommErrorDialog::DoDataExchange(CDataExchange* pDX)
{    
  CDialog::DoDataExchange(pDX);
  //{{AFX_DATA_MAP(CI2CCommErrorDialog)
  DDX_Text(pDX,IDC_EDITl,m_ErrorCode);
  //}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CI2CCommErrorDialog,CDialog)
  //{{AFX_MSG_MAP(CI2CCommErrorDialog)
  ON_BN_CLICKED(IDC_BUTTON1,onButton1)
  //}},AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CI2CCommErrorDialog message handlers
void CI2CCommErrorDialog::OnButton1()
{
  // TODO:Add your control notification handler code here
  EndDialog(IDCANCEL);
}
				
				<dp n="d114"/>
// PEQParam.h:interface for the CPEQParam class.
//
//////////////////////////////////////////////////////////////////////
#if !defined(AFX_PEQPARAM_H__733FB7AB_4A49_11D3_96EE_006097CDB9E2__INCLUDED_)
#define AFX_PEQPARM_H_733FB7AB_4A49_11D3_96EE_006097CDB9E2__INCLUDED_
#if_MSC_VER >=1000
#pragma once
#endif //_MSC_VER >=1000
typedef struct_biquadcoef
{
  float c[6];// b0,b1,b2,a0,a1,a2
} biquadcoef;
class CPEQParam
{
  float    m_Gain;         // in dB(+or-)

    float  m_Q;            // in Q units

  float  m_Frequency;    // in Hz

  float  m_SampleRate;   // in Hz

  double m_pi;
public:

  void GetCoef(biquadcoef *);

  void GetAllpassCoef(biquadcoef *);

  void SetQ(floatv){m_Q=v;}

  void SetQ(CString &amp;str);

  void SetGain(float v){m_Gain=v;}

  void SetGain(CString &amp;str);

  void SetFreq(float v){m_Frequency=v;}

  void SetFreq(CString &amp;str);

  CPEQParam();

  virtual_CPEQParam();
};
#endif // !defined(AFX PEQPARAM_H__733FB7AB_4A49_11D3_96EE_0006097CDB9E2_INCLUDED_)
				
				<dp n="d115"/>
// PEQParam.cpp:implementation of the CPEQParam class.
//    
//////////////////////////////////////////////////////////////////////
#include"stdafx.h"
#include"sa.h"
#include"PEQParam.h"
#include<stdio.h>
#include<math.h>
#ifdef_DEBUG
#undef THIS_FILE
static char THIS_FILE[]=_FILE_;
#define new DEBUG_NEW
#endif
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
CPEQParam::CPEQParam()
  :m_Frequency(0.5),m_Gain(0.0),m_Q(1.0),m_SampleRate(44100.)
{

  m_pi=acos(-1.);
}
CPEQParam::-CPEQParam()
{
}
void CPEQParam::SetGain(CString &amp; str)
{

  float v;

  sscanf(str,"%f",&amp;v);

  m_Gain=v;
}
void CPEQParam::SetFreq(CString &amp; str)
{

  float v;

  sscanf(str,"%f",&amp;v);

  m_Frequency=v;
}
void CPEQParam::SetQ(CString &amp; str)
{

  float v;

  sscanf(str,"%f",&amp;v);

  m_Q=v;
}
void CPEQParam::GetAllpassCoef(biquadcoef *f)
{
  double gamma,beta,wc,tbeta;
  double normFreq=m_Frequency/m_SampleRate;
  wc=m_pi*normFreq;
  gamma=-cos(wc);
  tbeta=wc/(2*m_Q);
  if(tbeta>m_pi/4)

  tbeta=m_pi/4;
  beta=(1.-tan(tbeta))/(1.+tan(tbeta));
  f->c[0]=(float)beta;            // b0
				
				<dp n="d116"/>
  f->c[1]=(float)(gamma*(1+beta));// b1

  f->c[2]=1.;                     // b2

  f->c[3]=1.;                     // a0

  f->c[4]=f->c[1];                // a1

  f->c[5]=(float)beta;            // a2
}
void CPEQParam::GetCoef(biquadcoef  *f)
{
  double M,L;
  biquadcoef af;
  double gain=(float) pow[10.,m_Gain/20.);
  GetAllpassCoef(&amp;af);
  M=(1.-gain)/2.;
  L=(1.+gain)/2.;
  f->c[0]=(float)(af.c[0]*M+L);           // b0
  f->c[1]=(float)(af.c[1]*M+af.c[4]*L); // b1
  f->c[2]=[float)(af.c[2]*M+af.c[5]*L); // b2
  f->c[3]=af.c[3];
  f->c[4]=af.c[4];
  f->c[5]=af.c[5];
}
				
				<dp n="d117"/>
#if !defined(AFX_NOTCHPAGE2_H__5C8994C7_E2A4_11D2_96EE_006097CDB9E2__INCLUDED_)
#define AFX_NOTCHPAGE2_H__5C8994C7_E2A4_11D2_96EE_006097CDB9E2_INCLUDED_
#if_MSC_VER >=1000
#pragma once
#endif //_MSC_VER >=1000
// NotchPage2.h :header file
//
class CTabDialog;
/////////////////////////////////////////////////////////////////////////////
// CNotchPage2 dialog
class CNotchPage2:public CPropertyPage
{
  DECLARE_DYNCREATE(CNotchPage2)
// Construction
public:
  CNotchPage2();
  -CNotchPage2();
// Dialog Data
  //{{AFX_DATA(CNotchPage2)
  enum{IDD=IDD_PP9};
  CButton m_BypassSecondButton;
  CButton m_BypassFirstButton;
  CSliderCtrl m_SliderCut4;
  CSliderCtrl m_SliderQ4;
  CSliderCtrl m_SliderFrequency4;
  CSliderCtrl m_SliderCut3;
  CSliderCtrl m_SliderQ3;
  CSliderCtrl m_SliderFrequency3;
  //}}AFX_DATA
// Overrides
  // ClassWizard generate virtual function overrides
  //{{AFX_VIRTUAL(CNotchPage2)
  protected:
  virtual void DoDataExchange(CDataExchange* pDX);   // DDX/DDV support
  //}}AFX_VIRTUAL
// Implementation
protected:
  // Generated message map functions
  //{{AFX_MSG(CNotchPage2)
  afx_msg void OnPaint();
  virtual BOOL OnInitDialog();
  afx_msg void OnVScroll(UINT nSBCode,UINT nPos,CScrollBar* pScrollBar);
  afx_msg void OnBypassFirst();
  afx_msg void OnBypassSecond();
  //}}AFX_MSG
  DECLARE_MESSAGE_MAP()
  CTabDialog *m_ParentWindow;
  void SendStringToUI(int which);
};
//{{AFX_INSERT_LOCATION}}
//Microsoft Developer Studiowill insertadditional declarations immediately before the previous line.
#endif //!defined(AFX_OTCHPAGE2_H__5C8994C7_E2A4_11D2_96EE_006097CDB9E2__INCLUDED_)
				
				<dp n="d118"/>
// NotchPage2.cpp:implementation file
//
#include"stdafx.h"
#include"sa.h"
#include"NotchPage2.h"
#include"TabDialog.h"
#include"DSP56kManager.h"
#ifdef_DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CNotchPage2 property page
IMPLEMENT_DYNCREATE(CNotchPage2,CPropertyPage)
CNotchPage2::CNotchPage2():CPropertyPage(CNotchPage2::IDD)
{
  //{{AFX_DATA_INIT(CNotchPage2)
  //}}AFX_DATA_INIT
}
CNotchPage2::-CNotchPage2()
{    
}
void CNotchPage2::DoDataExchange(CDataExchange* pDX)
{
  CPropertyPage::DoDataExchange(pDX);
  //{{AFX_DATA_MAP(CNotchPage2)
  DDX_Control(pDX,IDC_CHECK6,m_BypassSecondButton);
  DDX_Control(pDX,IDC_CHECK5,m_BypassFirstButton);
  DDX_Control(pDX,IDC_SLIDER6,m_SliderCut4);
  DDX_Control(pDX,IDC_SLIDER5,m_SliderQ4);
  DDX_Control(pDX,IDC_SLIDER4,m_SliderFrequency4);
  DDX_Control(pDX,IDC_SLIDER3,m_SliderCut3);
  DDX_Control(pDX,IDC_SLIDER2,m_SliderQ3);
  DDX_Control(pDX,IDC_SLIDER1,m_SliderFrequency3);
  //}}AFX_DATA_MAP
}
BEGIN_NESSAGE_MAP(CNotchPage2,CPropertyPage)
  //{{AFX_MSG_MAP(CNotchPage2)
  ON_WM_PAINT()
  ON_WM_VSCROLL()
  ON_BN_CLICKED(IDC_CHECKs,OnBypassFirst)
  ON_BN_CLICKED(IDC_CHECK6,OnBypassSecond)
  //}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CNotchPage2 message handlers
void CNotchPage2::OnPaint()
{
  CPaintDC dc(this);// device context for painting
  // TODO:Add your message handler code here
  m_SliderFrequency3.SetPos(CONTROL_RANGE-g_DSPManager->GetParamValue(kNotch6Freq));
  m_SliderQ3.SetPos(CONTROL_RANGE-g_DSPManager->GetParamValue(kNotch6Q));
  m_SliderCut3.SetPos(CONTROL_RANGE-g_DSPManager->GetParamValue(kNotch6Cut));
  m_SliderFrequency4.SetPos(CONTROL_RANGE-g_DSPManager->GetParamValue(kNotch7Freq));
  m_SliderQ4.SetPos(CONTROL_RANGE-g_DSPManager->GetParamValue(kNotch7Q));
  m_SliderCut4.SetPos(CONTROL_RANGE-g_DSPManager->GetParamValue(kNotch7Cut));
  m_BypassFirstButton.SetCheck(g_DSPManager->GetBypassSection(kBypassNotch3));
  m_BypassSecondButton.SetCheck(g_DSPManager->GetBypassSection(kBypassNotch4));
				
				<dp n="d119"/>
  // Do not call CPropertyPage::OnPaint() for painting messages
}
BOOL CNotchPage2::OnInitDialog()
{
  CPropertyPage::OnInitDialog();
  // TODO:Add extra initialization here
  m_SliderFrequency3.SetRange(0,CONTROL_RANGE);
  m_SliderFrequency3.SetPos(CONTROL_RANGE-g_DSPManager->GetParamValue(kNotch6Freq));
  m_SliderFrequency3.SetTicFreq((CONTROL_RANGE+1)/16);
  m_SliderFrequency3.SetPageSize(PG_CONTROL_AMT);
  m_SliderQ3.SetRange(0,CONTROL_RANGE);
  m_SliderQ3.SetPos(CONTROL_RANGE-g_DSPManager->GetParamValue(kNotch6Q));
  m_SliderQ3.SetTicFreq((CONTROL_RANGE+1)/16);
  m_SliderQ3.SetPageSize(PG_CONTROL_AMT);
  m_SliderCut3.SetRange(0,CONTROL_RANGE);
  m_SliderCut3.SetPos(CONTROL_RANGE-g_DSPManager->GetParamValue(kNotch6Cut));
  m_SliderCut3.SetTicFreq((CONTROL_RANGE+1)/16);
  m_SliderCut3.SetPageSize(PG_CONTROL_AMT);
  m_SliderFrequency4.SetRange(0,CONTROL_RANGE);
  m_SliderFrequency4.SetPos(CONTROL_RANGE-g_DSPManager->GetParamValue(kNotch7Freq));
  m_SliderFrequency4.SetTicFreq((CONTROL_RANGE+1)/16);
  m_SliderFrequency4.SetPageSize(PG_CONTROL_AMT);
  m_SliderQ4.SetRange(0,CONTROL_RANGE);
  m_SliderQ4.SetPos(CONTROL_RANGE-g_DSPManager->GetParamValue(kNotch7Q));
  m_SliderQ4.SetTicFreq((CONTROL_RANGE+1)/16);
  m_SliderQ4.SetPageSize(PG_CONTROL_AMT);
  m_SliderCut4.SetRange(0,CONTROL_RANGE);
  m_SliderCu4.SetPos(CONTROL_RANGE-g_DSPManager->GetParamValue(kNotch7Cut));
  m_SliderCut4.SetTicFreq((CONTROL_RANGE+1)/16);
  m_SliderCut4.SetPageSize(PG_CONTROL_AMT);
  m_ParentWindow=(CTabDialog*)GetParent()->GetParent();
  return TRUE; // return TRUE unless you set the focus to a control

              // EXCEPTION:OCX Property Pages should return FALSE
}
void CNotchPage2::OnVScroll(UINT nSBCode,UINT nPos,CScrollBar* pScrollBar)
{
  // TODO:Add your message handler code here and/or call default
  CSliderCtrl *slider=(CSliderCtrl*)pScrollBar;
  int which;
  CPropertyPage::OnVScroll(nSBCode,nPos,pScrollBar);
  Sleep(50);
  if(slider==&amp;m_SliderFrequency3)

   which=kNotch6Freq;
   else if(slider==&amp;m_SliderQ3)

   which=kNotch6Q;
   else if(slider==&amp;m_SliderCut3)

   which=kNotch6Cut;
   else if(slider==&amp;m_SliderFrequency4)

   which=kNotch7Freq;
   else if(slider==&amp;m_SliderQ4)

   which=kNotch7Q;
   else if(slider==&amp;m_SliderCut4)

   which=kNotch7Cut;
   else

   return;
   g_DSPManager->SetParamValue(CONTROL_RANGE-slider->GetPos(),which);
   SendStringToUI(which);
}
				
				<dp n="d120"/>
void CNotchPage2::SendStringToUI(int which)
{

  CString str;

  g_DSPManager->GetStringValue(which,Str);

  m_ParentWindow>SetStatusString(0,str);
}
void CNotchPage2::OnBypassFirst()
{
  // TODO:Add your control notification handler code here
  int state=m_BypassFirstButton.GetState() &amp; 0x3;
  g_DSPManager->SetBypassSection(state,kBypassNotch3);
}
void CNotchPage2::OnBypassSecond()
{
  // TODO:Add your control notification handler code here
  int state=m_BypassSecondButton.GetState() &amp; 0x3;
  g_DSPManager->SetBypassSection(state,kBypassNotch4);
}
				
				<dp n="d121"/>
  #if !defined(AFX_NOTCHPAGE1_H__0CF7E208_D790_11D2_96EE_006097CDB9E2__INCLUDED_)
  #define AFX_NOTCHPAGE1_H__0CF7E208_D790_11D2_96EE_006097CDB9E2_INCLUDED_
  #if_MSC_VER >=1000
  #pragma once
  #endif // _MSC_VER >=1000
  // NotchPage1.h :header file
  //
  /////////////////////////////////////////////////////////////////////////////
  // CNotchPage1 dialog
  class CTabDialog
  class CNotchPage1:public CPropertyPage
  {

  DECLARE_DYNCREATE(CNotchPage1)
  // Construction
  public:

  CNotchPage1();

  -CNotchPage1();
  // Dialog Data

  //{{AFX_DATA(CNotchPage1)

  enum{IDD=IDD_PP4};

  CButton m_BypassSecondButton;

  CButton m_BypassFirstButton;

  CSliderCtrl m_SliderCut2;

  CSliderCtrl m_SliderQ2;

  CSliderCtrl m_SliderFrequency2;

  CSliderCtrl m_SliderCut1;

  CSliderCtrl m_SliderQ1;

  CSliderCtrl m_SliderFrequency1;

  //}}AFX_DATA

  // Overrides

  // ClassWizard generate virtual function overrides

  //{{AFX_VIRTUAL(CNotchPage1)

  protected:

  virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV support

  //}}AFX_VIRTUAL

  // Implementation

  protected:

  // Generated message map functions

  //{{AFX_MSG(CNotchPage1)

  virtual BOOL OnInitDialog();

  afx_msg void OnVScroll(UINT nSBCode,UINT nPos,CScrollBar* pScrollBar);

  afx_msg void OnShowWindow(BOOL bShow,UINT nStatus);

  afx_msg void OnPaint();

  afx_msg void OnBypassFirst();

  afx_msg void OnBypassSecond();

  //}}AFX_MSG

  DECLARE_MESSAGE_MAP()

  CTabDialog *m_ParentWindow;

  void SendStringToUI(int which);
  };
  //{{AFX_INSERT_LOCATION}}
  // Microsoft DeveloperStudio willinsertadditional declarations immediately before the previous line
  #endif //!defined(AFX_NOTCHPAGE1_H__0CF7E208_D790_11D2_96EE_006097CDB9E2__INCLUDED_)
				
				<dp n="d122"/>
// NotchPage1.cpp:implementation file
//
#include"stdafx.h"
#include"sa.h"
#include "NotchPage1.h"
#include"TabDialog.h"
#include"DSP56kManager.h"
#ifdef_DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CNotchPage1 property page
IMPLEMENT_DYNCREATE(CNotchPage1,CPropertyPage)
CNotchPage1::CNotchPage1() :CPropertyPage(CNotchPage1::IDD)
{
  //{{AFX_DATA_INIT(CNotchPage1)
  //}}AFX_DATA_INIT
}
CNotchPage1::-CNotchPage1()
{    
}
void CNotchPage1::DoDataExchange(CDataExchange* pDX)
{
  CPropertyPage::DoDataExchange(pDX);
  //{{AFX_DATA_MAP(CNotchPage1)
  DDX_Control(pDX,IDC_CHECK6,m_BypassSecondButton);
  DDX_Control(pDX,IDC_CHECK5,m_BypassFirstButton);
  DDX_Control(pDX,IDC_SLIDER6,m_SliderCut2);
  DDX_Control(pDX,IDC_SLIDER5,m_SliderQ2);
  DDX_Control(pDX,IDC_SLIDER4,m_SliderFrequency2);
  DDX_Control(pDX,IDC_SLIDER3,m_SliderCut1);
  DDX_Control(pDX,IDC_SLIDER2,m_SliderQ1);
  DDX_Control(pDX,IDC_SLIDER1,m_SliderFrequency1);
  //}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CNotchPage1,CPropertyPage)
  //{{AFX_MSG_MAP(CNotchPage1)
  ON_WM_VSCROLL()
  ON_WM_SHOWWINDOW()
  ON_WM_PAINT()
  ON_BN_CLICKED(IDC_CHECK5,OnBypassFirst)
  ON_BN_CLICKED(IDC_CHECK6,OnBypassSecond)
  //}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CNotchPage1 message handlers    
BOOL CNotchPage1::OnInitDialog()
{
  CPropertyPage::OnInitDialog();
  // TODO:Add extra initialization here
  m_SliderFrequency1.SetRange(0,CONTROL_RANGE);
  m_SliderFrequency1.SetPos(CONTROL_RANGE-g_DSPManager->GetParamValue(kNotch1Freq));
  m_SliderFrequency1.SetTicFreq((CONTROL_RANGE+1)/16);
  m_SliderFrequency1.SetPageSize(PG_CONTROL_AMT);
  m_SliderQ1.SetRange(0,CONTROL_RANGE);
  m_SliderQ1.SetPos(CONTROL_RANGE-g_DSPManager->GetParamValue(kNotch1Q));
  m_SliderQ1.SetTicFreq((CONTROL_RANGE+1)/16);
				
				<dp n="d123"/>
  m_SliderQ1.SetPageSize(PG_CONTROL_AMT);

  m_SliderCut1.SetRange(0,CONTROL_RANGE);

  m_SliderCut1.SetPos(CONTROL_RANGE-g_DSPManager->GetParamValue(kNotch1Cut));

  m_SliderCut1.SetTicFreq((CONTROL_RANGE+1)/16);

  m_SliderCut1.SetPageSize(PG_CONTROL_AMT);

  m_SliderFrequency2.SetRange(0,CONTROL_RANGE);

  m_SliderFrequency2.SetPos(CONTROL_RANGE-g_DSPManager->GetParamValue(kNotch2Freq));

  m_SliderFrequency2.SetTicFreq((CONTROL_RANGE+1)/16);

  m_SliderFrequency2.SetPageSize(PG_CONTROL_AMT);

  m_SliderQ2.SetRange(0,CONTROL_RANGE);

  m_SliderQ2.SetPos(CONTROL_RANGE-g_DSPManager->GetParamValue(kNotch2Q));

  m_SliderQ2.SetTicFreq((CONTROL_RANGE+1)/16);

  m_SliderQ2.SetPageSize(PG_CONTROL_AMT);

  m_SliderCut2.SetRange(0,CONTROL_RANGE);

  m_SliderCut2.SetPos(CONTROL_RANGE-g_DSPManager->GetParamValue(kNotch2Cut));

  m_SliderCut2.SetTicFreq((CONTROL RANGE+1)/16);

  m_SliderCut2.SetPageSize(PG_CONTROL_AMT);

  m_ParentWindow=(CTabDialog*)GetParent()->GetParent();

  return TRUE; // return TRUE unless you set the focus to a control

                // EXCEPTION:OCX Property Pages should return FALSE
}
void CNotchPage1::OnVScroll(UINT nSBCode,UINT nPos,CScrollBar* pScrollBar)
{
  // TODO:Add your message handler code here and/or call default
  CSliderCtrl *slider=(CSliderCTrl*)pScrollBar;
  int which;
  CPropertyPage::OnVScroll(nSBCode,nPos,pScrollBar);
  Sleep(50);
  if(slider==&amp;m_SliderFrequency1)

  which=kNotch1Freq;
  else if(slider==&amp;m_SliderQ1)

  which=kNotch1Q;
  else if(slider==&amp;m_SliderCut1)

  which=kNotch1Cut;
  else if(slider==&amp;m_SliderFrequency2)

  which=kNotch2Freq;
  else if(slider==&amp;m_SliderQ2)

  which=kNotch2Q;
  else if(slider==&amp;m_SliderCut2)

  which=kNotch2Cut;
  else

  return;
  g_DSPManager->SetParamValue(CONTROL_RANGE-slider->GetPos(),which);
  SendStringToUI(which);
}
void CNotchPage1::OnShowWindow(BOOL bShow,UINT nStatus)
{
  CPropertyPage::OnShowWindow(bShow,nStatus);
  // TODO:Add your message handler code here
}
void CNotchPage1::OnPaint()
{
  CPaintDC dc(this);// device context for painting
  // TODO:Add your message handler code here
  m_SliderFrequency1.SetPos(CONTROL_RANGE-g_DSPManager->GetParamValue(kNotch1Freq));
  m_SliderQ1.SetPos(CONTROL_RANGE-g_DSPManager->GetParamValue(kNotch1Q));
  m_SliderCut1.SetPos(CONTROL_RANGE-g_DSPManager->GetParamValue(kNotch1Cut));
				
				<dp n="d124"/>
  m_SliderFrequency2.SetPos(CONTROL_RANGE-g_DSPManager->GetParamValue(kNotch2Freq));

  m_SliderQ2.SetPos(CONTROL_RANGE-g_DSPManager->GetParamValue(kNotch2Q));

  m_SliderCut2.SetPos(CONTROL_RANGE-g_DSPManager->GetParamValue(kNotch2Cut));

  m_BypassFirstButton.SetCheck(g_DSPManager->GetBypassSection(kBypassNotch1));

  m_BypassSecondButton.SetCheck(g_DSPManager->GetBypassSection(kBypassNotch2));

  // Do not call CPropertyPage::OnPaint() for painting messages
}
void CNotchPage1::SendStringToUI(int which)
{

  CString str;

  g_DSPManager->GetStringValue(which,str);

  m_Parentwindow->SetStatusString(0,str);
}
void CNotchPage1::OnBypassFirst()
{
  // TODO:Add your control notification handler code here
  int state=m_BypassFirstButton.GetState()&amp; 0x3;
  g_DSPManager->SetBypassSection(state,kBypassNotch1);
}
void CNotchPage1::OnBypassSecond()
{
  // TODO:Add your control notification handler code here
  int state=m_BypassSecondButton.GetState() &amp; 0x3;
  g_DSPManager->SetBypassSection(state,kBypassNotch2);
}
				
				<dp n="d125"/>
#if !defined(AFX_NEWCUTOFFPAGE_H_E2728226_E026_11D2_96EE_006097CDB9E2__INCLUDED_)
#define AFX_NEWCUTOFFPAGE_H__E2728226_E026_11D2_96EE_006097CDB9E2__INCLUDED_
#if_MSC_VER >=1000
#pragma once
#endif // _MSC_VER >=1000
// NewCutoffPage.h :header file
//
class CTabDialog;
/////////////////////////////////////////////////////////////////////////////
// CNewCutoffPage dialog
class CNewCutoffPage:public CPropertyPage
{
  DECLARE DYNCREATE(CNewCutoffPage)
// Construction
public:
  CNewCutoffPage();
  -CNewCutoffPage();
// Dialog Data
  //{{AFX_DATA(CNewCutoffPage)
  enum{IDD=IDD_PP8};
  CButton m BypassNLopassButton;
  CSliderCtrl m_NewHiQSlider;
  CSliderCtrl m_NewHiFreqSlider;
  CButton m_BypassLopassButton;
  CButton m_BypassHipassButton;
  CSliderCtrl m_HiQSlider;
  CSliderCtrl m_HiFreqSlider;
  CSliderCtrl m_LoQSlider;
  CSliderCtrl m_LoFreqSlider;
  //}}AFX_DATA
// Overrides

  // ClassWizard generate virtual  function overrides

  //{{AFX_VIRTUAL(CNewCutoffPage)

  public:

  virtual BOOL OnSetActive();

  protected:

  virtual void DoDataExchange(CDataExchange* pDX);   // DDX/DDV support

  //}}AFX_VIRTUAL
// Implementation
protected ;
  // Generated message map functions
  //{{AFX_MSG(CNewCutoffPage)
  afx_msg void OnVScroll(UINT nSBCode,UINT nPos,CScrollBar* pScrollBar);
  virtual BOOL OnInitDialog();
  afx_msg void OnShowWindow(BOOL bShow,UINT nStatus);
  afx_msg void OnPaint();
  afx_msg void OnBypassHipass();
  afx_msg void OnBypassLopass();
  afx_msg void OmypassNewLopass();
  //}}AFX_MSG
  DECLARE_MESSAGE MAP()
  CTabDialog *m_ParentWindow;
  void SendStringToUI(int which);
};
//{{AFX_INSERT_LOCATION}}
// Microsoft Developer Studio
will insert additional declarations immediately before the previous line.
#endif // !defined(AFX_NEWCUTOFFPAGE_H_E2728226_E026_11D2_96EE_006097CDB9E2__INCLUDED_)
				
				<dp n="d126"/>
// NewCutoffPage.cpp :implementation file
//
#include"stdafx.h"
#include"sa.h"
#include"NewCutoffPage.h*
#include"TabDialog.h"
#include "DSP56kManager.h"
#ifdef_DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CNewCutoffPage property page
IMPLEMENT_DYNCREATE(CNewCutoffPage,CPropertyPage)
CNewCutoffPage::CNewCutoffPage():CPropertyPage(CNewCutoffPage::IDD)
{
  //{{AFX_DATA_INIT(CNewCutoffPage)
  //}}AFX_DATA_INIT
}
CNewCutoffPage::-CNeWCutoffPage()
{
}
void CNewCutoffPage::DoDataExchange(CDataExchange* pDX)
{
  CPropertyPage::DoDataExchange(pDX);
  //{{AFX_DATA_MAP(CNewCutoffPage)
  DDX_Control(pDX,IDC_CHECK7,m_BypassNLopassButton);
  DDX_Control(pDX,IDC_SLIDER9,m_NewHiQSlider);
  DDX_Control(pDX,IDC_SLIDER8,m_NewHiFreqSlider);
  DDX_Control(pDX,IDC_CHECK5,m_BypassLopassButton);
  DDX_Control(pDX,IDC_CHECK4,m_BypassHipassButton);
  DDX_Control(pDX,IDC_SLIDER5,m_HiQSlider);
  DDX_Control(pDX,IDC_SLIDER4,m_HiFreqSlider);
  DDX_Control(pDX,IDC_SLIDER2,m_LoQSlider);
  DDX_Control(pDX,IDC_SLIDER1,m_LoFreqSlider);
  //}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CNewCutoffPage,CPropertyPage)
  //{{AFX_MSG_MAP(CNewCutoffPage)
  ON_WM_VSCROLL()
  ON_WM_SHOWWINDOW()    
  ON_WM_PAINT()
  ON_BN_CLICKED(IDC_CHECK4,OnBypassHipass)
  ON_BN_CLICKED(IDC_CHECK5,OnBypassLopass)
  ON_BN_CLICKED(IDC_CECK7,OnBypassNewLopass)
  //}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CNewCutoffPage message handlers
void CNewCutoffPage::OnVScroll(UINT nSBCode,UINT nPos,CScrollBar* pScrollBar)
{    
  // TODO:Add your message handler code here and/or call default
  CSliderCtrl *slider=(CSliderCtrl*)pScrollBar;
  int which;
  CPropertyPage::OnVScroll(nSBCode,nPos,pScrollBar);
  Sleep(50);
  if(slider==&amp;m_LoFreqSlider)
  which=kLoCutoffFreq;
				
				<dp n="d127"/>
  else if(slider==&amp;m_LoQSlider)

    which=kLoCutoffQ;

  else if(slider ==&amp;m_HiFreqSlider)

    which=kHiCutoffFreq;

  else if(slider==&amp;m_HiQSlider)

    which=kHiCutoffQ;

  else if(slider==&amp;m NewHiFreqSlider)

    which=kHiCutoff2Freq;

  else if(slider==&amp;m NewHiQSlider)

    which=kHiCutoff2Q;

  else

    return;

  g_DSPManager->SetParamValue(CONTROL_RANGE-slider->GetPos (),which);

  SendStringToUI(which);
}
void CNewCutoffPage::SendStringToUI(int which)
{

  CString str;

  g_DSPManager->GetStringValue(which,str);

  m_ParentWindow->SetStatusString(0,str);
}
BOOL CNewCutoffPage::OnInitDialog()
{
  CPropertyPage::OnInitDialog();
  // TODO:Add extra initialization here
  m_LoFreqSlider.SetRange(0,CONTROL_RANGE);
  m_LoFreqSlider.SetPos(CONTROL_RANGE-g_DSPManager->GetParamValue(kLoCutoffFreq));
  m_LoFreqSlider.SetTicFreq((CONTROL_RANGE+1)/16);
  m_LoFreqSlider.SetPageSize(PG_CONTROL_AMT);
  m_LoQSlider.SetRange(0,CONTROL_RANGE);
  m_LoQSlider.SetPos(CONTROL_RANGE-g_DSPManager->GetParamValue(kLoCutoffQ));
  m_LoQSlider.SetTicFreq((CONTROL_RANGE+1)/16);
  m_LoQSlider.SetPageSize(PG_CONTROL_AMT);
  m_HiFreqSlider.SetRange(0,CONTROL_RANGE);
  m_HiFreqSlider.SetPos(CONTROL_RANGE-g_DSPMamager->GetParamValue(kHiCutoffFreq));
  m_HiFreqSlider.SetTicFreq((CONTROL_RANGE+1)/16);
  m_HiFreqSlider.SetPageSize(PG_CONTROL_AMT);
  m_HiQSlider.SetRamge(0,CONTROL_RANGE);
  m_HiQSlider.SetPos(CONTROL_RANGE-g_DSPManager->GetParamValue(kHiCutoffQ));
  m_HiQSlider.SetTicFreq((CONTROL_RANGE+1)/16);
  m_HiQSlider.SetPageSize(PG_CONTROL_AMT);
  m_NewHiFreqSlider.SetRange(0,CONTROL_RANGE);
  m_NewHiFreqSlider.SetPos(CONTROL_RANGE-g_DSPManager->GetParamValue(HiCutofft2Freq));
  m_NewHiFreqSlider.SetTicFreq((CONTROL_RANGE+1)/16);
  m_NewHiFreqSlider.SetPageSize(PG_CONTROL_AMM);
  m_NewHiQSlider.SetRange(0,CONTROL_RANGE);
  m_NewHiQSlider.SetPos(CONTROL_RANGE-g_DSPManager->GetParamValue(kHiCutoff2Q));
  m_NewHiQSlider.SetTicFreq((CONTROL_RANGE+1)/16);
  m_NewHiQSlider.SetPageSize(PG_CONTROL_AMT);
  m_ParentWindow=(CTabDialog*)GetParent()->GetParent();
  return TRUE; // return TRUE unless you set the focus to a control

              // EXCEPTION:OCX Property Pages should return FALSE
}
void CNewCutoffPage::OnShowWindow(BOOL bShow,UINT nStatus)
{
  CPropertyPage::OnShowWindow(bShow,nStatus);
				
				<dp n="d128"/>
  // TODO:Add your message handler code here
}
BOOL CNewCutoffPage::OnSetActive()
{
  // TODO:Add your speciali zed code here and/or call the base class
  return CPropertyPage::OnSetActive();
}
void CNewCutoffPage::OnPaint()
{
   CPaintDC dc(this); // device context for painting
   // TODO:Add your message handler code here
   m_LoFreqSlider.SetPos(CONTROL_RANGE-g_DSPManager->GetParamValue(kLoCutoffFreq));
   m_LoQSlider.SetPos(CONTROL_RANGE-g_DSPManager->GetParamValue(kLoCutoffQ));
   m_HiFreqSlider.SetPos(CONTROL_RANGE-g_DSPManager->GetParamValue(kHiCutoffFreq));
   m_HiQSlider.SetPos(CONTROL_RANGE-g_DSPManager->GetParamValue(kHiCutoffQ));
   m_NewHiFreqSlider.SetPos(CONTROL_RANGE-g_DSPManager->GetParamValue(kHiCutoff2Freq));
   m_NewHiQSlider.SetPos(CONTROL_RANGE-g_DSPManager->GetParamValue(kHiCutoff2Q));
   m_BypassHipassButton.SetCheck(g_DSPManager->GetBypassSection(kBypassHipass));
   m_BypassLopassButton.SetCheck(g_DSPManager->GetBypassSection(kBypassLopass));
   m_BypassNLopassButton.SetCheck(g_DSPManager->GetBypassSection(kBypassNLopass));
   // Do not call CPropertyPage::OnPaint()for painting messages
}
void CNewCutoffPage::OnBypassHipass()
{
  // TODO:Add your control notification handler code here
  int state=m_BypassHipassButton.GetState()  &amp; 0x3;
  g_DSPManager->SetBypassSection(state,kBypassHipass);
}
void CNewCutoffPage::OnBypassLopass()
{
  // TODO:Add your control notification handler code here
  int state=m_BypassLopassButton.GetState() &amp; 0x3;
  g_DSPManager->SetBypassSection(state,kBypassLopass);
}
void CNewCutoffPage::OnBypassNewLopass()
{
  // TODO:Add your control notification handler code here
  int state=m_BypassNLopassButton.GetState() &amp; 0x3;
  g_DSPManager->SetBypassSection(state,kBypassNLopass);
}
				
				<dp n="d129"/>
// ShelfEQParam.h:interface for the CShelfEQParam class.
//
//////////////////////////////////////////////////////////////////////
#if !defined(AFX_ShelfEQPARAM_H__733FB7AB_4A49_11D3_96EE_006097CDB9E2__INCLUDED_)
#define AFX_ShelfEQPARAM_H__733FB7AB_4A49_11D3_96EE_006097CDB9E2__INCLUDED_
#if_MSC_VER >=1000
#pragma once
#endif //_MSC_VER>=1000
typedef struct_biquadcoef
{
  float c(6]; // b0,b1,b2,a0,a1,a2
} biquadcoef;
class CShelfEQParam
{
  float   m_Gain;          // in dB (+or-)
  float  m_Frequency;     // in Hz
  float   m_SampleRate;    // in Hz
  double  m_Pi;
  bool    m_HiShelf;
public:
  void GetCoef(biquadcoef *);
  void GetAllpassCoef(biquadcoef*);
  void SetGain(float v){m_Gain=v;}
  void SetGain(CString &amp;str):
  void SetFreq(float v){m_Frequency=v;}
  void SetFreq(CString &amp;str);
  CShelfEQParam(bool hi);
  virtual-CShelfEQParam();
};
#endif // !defined(AFX_ShelfEQPARAM_H_733FB7AB_4A49_11D3_96EE_006097CDB9E2_INCLUDED_)
				
				<dp n="d130"/>
// ShelfEQParam.cpp:implementation of the CShelfEQParam class.
//
//////////////////////////////////////////////////////////////////////
#include"stdafx.h"
#include"sa.h"
#include"ShelfEQParam.h"
#include<stdio.h>
#include<math.h>
#ifde_DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
CShelfEQParam::CShelfEQParam(bool hi)
  :m_Frequency(0.5),m_Gain(0.0),m_SampleRate(44100.),m_HiShelf(hi)
{

  m_Pi=acos(-1.);
}
CShelfEQParam::-CShelfEQParam()
{
}
void CShelfEQParam::SetGain(CString &amp; str)
{

  float v;

  sscanf(str,"%f",&amp;v);

  m_Gain=v;
}
void CShelfEQParam::SetFreq(CString &amp; str)
{

  float v;

  sscanf(str,"%f",&amp;v);

  m_Frequency=v;
}
void CShelfEQParam::GetAllpassCoef(biquadcoef *f)
{
  double gamma,wc;
  double normFreq = m_Frequency/m_SampleRate/2;
  wc=m_pi*normFreq;
  gamma=(tan(wc/2)-1)/(tan(wc/2)+1);
  if(m HiShelf)
  {

  f->c[0]  =(float)gamma;    // b0

  f->c[1]  =1.0;             // b1
  }
  else
  {

  f->c[0]  =(float)  -gamma;    // b0

  f->c[1]  =-1.0;               // b1
  }
  f->c[2]=0;                      // b2
  f->c[3]=1.;                     // a0
  f->c[4]=(float)gamma;           // a1
				
				<dp n="d131"/>
  f->c[5]=0;                    // a2
}
void CShelfEQParam::GetCoef(biquadcoef *f)
{
  double M.L;
  biquadcoef af;
  double gain=(float)pow(10.,m_Gain/20.);
  GetAllpassCoef(&amp;af);
  M=(1.-gain)/2.;
  L=(1.+gain)/2.;
  f->c[0]=(float)(af.c[0]*M+L);            // b0
  f->c[1]=(float)(af.c[1]*M+af.c[4]*L);  // b1
  f->c[2]=(float)(af.c[2]*M+af.c[5]*L);  // b2
  f->c[3]=af.c[3];
  f->c[4]=af.c[4];
  f->c[5]=af.c[5];
}
				
				<dp n="d132"/>
// saDlg.h:header file
//
#if !defined(AFX_SADLG_H_33D93B0B_D0B8_11D2_96EE_006097CDB9E2_INCLUDED_)
#define AFX_SADLG_H_33D93B0B_D0B8_11D2_96EE_006097CDB9E2_INCLUDED_
#if_MSC_VER >=1000
#pragma once
#endif // _MSC_VER >=1000
/////////////////////////////////////////////////////////////////////////////
// CSaDlg dialog
class CSaDlg:public CDialog
{
// Construction
public:
  CSaDlg(CWnd* pParent=NULL);// standard constructor
// Dialog Data
  //{{AFX_DATA(CSaDlg)
  enum{IDD=IDD_SA_DIALOG};

  // NOTE;the ClassWizard will add data members here
  //}}AFX_DATA
  // ClassWizard generated virtual function overrides
  //({AFX_VIRTUAL(CSaDlg)
  protected:
  virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV support
  //}}AFX_VIRTUAL
// Implementation
protected:
  HICON m_hIcon;
  // Generated message map functions
  //{{AFX_MSG(CSaDlg)
  virtual BOOL OnInitDialog();
  afx_msg void OnSysCommand(UINT nID,LPARAM lParam);
  afx_msg void OnPaint();
  afx_msg HCURSOR OnQueryDragIcon();
  afx_msg void OnButton1();
  afx_msg void OnButton2();
  //}}AFX_MSG
  DECLARE_MESSAGE_MAP()
};
//{{AFX_INSERT_LOCATION}}
// Microsoft Developer Studiowill insert additional declarations immediately before the previous line.
#endif // !defined(AFX_SADLG_H_33D93B0B_D0B8_11D2_96EE_006097CDB9E2__INCLUDED_)
				
				<dp n="d133"/>
  // saDlg.cpp:implementation file
  //
  #include"stdafx.h"
  #include"sa.h"
  #include"saDlg.h"
  #include "unit_ppi.h"
  #include"functs.h"
  #include"TabDialog.h"
  #ifdef_DEBUG
  #define new DEBUG_NEW
  #undef THIS_FILE
  static char THIS_FILE[]=__FILE__;
  #endif
  static    int cmd_delay=1000;
  static    int io_delay=50;
  /////////////////////////////////////////////////////////////////////////////
  // CAboutDlg dialog used for App About
  class CAboutDlg :public CDialog
  {
  public:
  CAboutDlg();
  // Dialog Data
  //{{AFX_DATA(CAboutDlg)
  enum{IDD=IDD_ABOUTBOX};
  //}}AFX_DATA
  // ClassWizard generated virtual function overrides
  //{{AFX_VIRTUAL(CAboutDlg)
  protected:
  virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV support
  //}}AFX_VIRTUAL
// Implementation
protected:
  //{{AFX_MSG(CAboutDlg)
  //}}AFX_MSG
  DECLARE_MESSAGE_MAP()
};
CAboutDlg::CAboutDlg():CDialog(CAboutDlg::IDD)
{
  //{{AFX_DATA_INIT(CAboutDlg)
  //}}AFX_DATA_INIT
}
void CAboutDlg::DoDataExchange(CDataExchange* pDX)
{
  CDialog::DoDataExchange(pDX);
  //{{AFX_DATA_MAP(CAboutDlg)
  //}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CAboutDlg,CDialog)
  //{{AFX_MSG_MAP(CAboutDlg)
  // No message handlers
  //}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CSaDlg dialog
CSaDlg::CSaDlg(CWnd* pParent /*=NULL*/)
  :CDialog(CSaDlg::IDD,pParent)
				
				<dp n="d134"/>
  //{{AFX_DATA_INIT(CSaDlg)

  //NOTE:the ClassWizard will add member initialization here
  //)}AFX_DATA_INIT
  // Note that LoadIcon does not require a subsequent DestroyIcon in winJI
  m_hIcon=AfxGetApp()->LoadIcon(IDR_MINFRAME);
}
void CSaDlg::DoDataExchange(CDataExchange* pDX)
{
  Coialog::DoDataExchange(pDX);
  //{{AFX_DATA_MAP(CSaDlg)
  // NOTE:the ClassWizard Will add DDX and DDV calls here
  //}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CSaDlg.CDialog)
  //{{AFX_MSG_MAP(CSaDlg)
  ON_WM_SYSCOMMAND()
  ON_WM_PAINT()
  ON_WM_QUERYDRAGICON()
  ON_BN_CLICKED(IDC_BUTTON1,OnButton1)
  ON_BN_CLICKED(IDC_BUTTON2,OnButton2)
  //}}AFX_MSG_MAP
END_ESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CSaDlg message handlers
BOOL CSaDlg::OnInitDialog()
{
  CDialog::OnInitDialog();
  // Add"About..."menu item to system menu.
  // IDM_ABOUTBOX must be in the system command range
  ASSERT((IDM_ABOUTBOX &amp; 0xFFF0)==IDM_ABOUTBOX);
  ASSERT(IDM_ABOUTBOX < 0xF000);
  CMenu* pSysMenu=GetSystemMenu(FALSE);
  if(pSysMenu !=NULL)
  {

  CString strAboutMenu;

  strAboutMenu.LoadString(IDS_ABOUTBOX);

  if(!strAboutMenu.IsEmpty())

  {

    pSysMenu->AppendMenu(MF_SEPARATOR);

    pSysMenu->AppendMenu(MF_STRING,IDM_ABOUTBOX,strADDucmenu);

  }
  }
  // Set the icon for this dialog. the framework does this automatically
  // when the application′s main window is not a dialog
  SetIcon(m hIcon,TRUE);    // Set big icon
  SetIcon(m hIcon,FALSE):   // Set small icon
  // TODO:Add extra initialization here
  if(load_dll()==false)
  {

  MessageBox("UNIT_PPI not found in the system directory. Fix this and restart application.");

  return false;
  }
  init_Port_spi(1);
  set_cmd_delay_cnt_value(cmd_delay);
  set_io_delay_cnt_value(io_delay);
  return TRUE: // return TRUE unless you set the focus to a control
}
void CSaDlg::OnSysCommand(UINT nID,LPARAM(Param)
{
  if((nID &amp; 0xFFF0)==IDM ABOUTBOX)
				
				<dp n="d135"/>
  {

  CAboutDlg dlgAbout;

  dlgAbout.DoModal();
  }
  else
  {

  CDialog::OnSysCommand(nID,lParam);
  }
}
// If you add a minimize button to your dialog,you will need the code below
// to draw the icon. For MFC applications using the document/view model,
// this is automatically done for you by the framework.
void CSaDlg::OnPaint()
{
  if (IsIconic())
  {

  CPaintDC dc(this);// device context for painting

  SendMessage(WM_ICONERASEBKGND,(WPARAM)dc.GetSafeHdc(), 0);

  // Center icon in client rectangle

  int cxIcon=GetSystemMetrics(SM_CXICON);

  int cyIcon=GetSystemMetrics(SM_CYICON);

  CRect rect;

  GetClientRect(&amp;rect);

  int x=(rect,Width()-cxIcon+1)/2;

  int y=(rect,Height()-cyIcon+1)/2;

  // Draw the icon

  dc.DrawIcon(x,y,m_hIcon);
  }
  else
  {

  CDialog::OnPaint();
  }
}
// The system calls this to obtain the cursor to display while the user drags
// the minimized window.
HCURSOR CSaDlg::OnQueryDragIcon()
{
  return(HCURSOR)m_hIcon;
}
void CSaDlg::OnButton1()
{
  long tlong;
  tlong=spi_xchng24(0xAA55AA);
  tlong=spi_xchng24(0x0);
}
void CSaDlg::OnButton2()
{
//  long tlong;
//
//  tlong=spi_xchng24(0x654321);
//  tlong=spi_xchng24(0x0);

  CTabDialog dlg;

  dlg DoModal();
}
				
				<dp n="d136"/>
// sa.h:main header file for the SA application
//
#if !definned(AFX_SA_H__33D93B09_D0B8_11D2_96EE_006097CDB9E2__INCLUDED_)
#define AFX_SA_H_33D93B09_D0B8_11D2_96EE_006097CDB9E2_INCLUDED_
#if_MSC_VER>=1000
#pragma once
#endif //_MSC_VER >=1000
#ifndef__AFXWIN_H__

  #error includ′estdafx.h′before including this file for PCH
#endif
#include"resource.h"    // main symbols
/////////////////////////////////////////////////////////////////////////////
// CSaApp;
// See sa.cpp for the implementation of this class
//
class CSaApp:public CWinApp
{
public:
  CSaApp();
// Overrides
  // ClassWizard generated virtual function overrides
  //{{AFX_VIRTUAL(CSaApp)
  public:
  virtual BOOL InitInstance();
  //}}AFX_VIRTUAL
//  Implementation
  //{{AFX_MSG(CSaApp)

  //NOTE-the ClassWizard will add and remove member functions here.

  //   DO NOT EDIT what you see in these blocks of generated code !
  //}}AFX_MSG
  DECLARE_MESSAGE_MAP()
};
/////////////////////////////////////////////////////////////////////////////
//{{AFX_INSERT_LOCATION}}
// Microsoft Developer Studio will insert additional declarations immediately before the previous line.
#endif // !defined(AFX_SA_H__33D93B09_D0B8_11D2_96EE_006097CDB9E2_INCLUDED_)
				
				<dp n="d137"/>
// sa.cpp :Defines the class behaviors for the application.
//
#include"stdafx.h"
#include"sa.h"
#include"saDlg.h"
#include"TabDialog.h"
#include"I2CDialog.h"
#include"DSP56kManager.h"
CDSP56kManager *g_DSPManager;
#ifdef_DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE{}=__FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CSaApp
BEGIN_MESSAGE_MAP(CSaApp,CWinApp)
  //{{AFX_MSG_MAP(CSaApp)

  // NOTE-the ClassWizard will add and remove mapping macros here.

  //    DO NOT EDIT what you see in these blocks of generated code!
  //}}AFX_MSG
  ON_COMMAND(ID_HELP,CWinApp::OnHelp)
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CSaApp construction
CSaApp::CSaApp()
{
  // TODO:add construction code here,
  // Place all significant initialization in InitInstance
}
/////////////////////////////////////////////////////////////////////////////
// The one and only CSaApp object
CSaApp theApp:
/////////////////////////////////////////////////////////////////////////////
// CSaApp initialization
BOOL CSaApp::InitInstance()
{
  AfxEnableControlContainer();
  // Standard initialization
  // If you are not using these features and wish to reduce the size
  // of your final executable,you should remove from the following
  // the specific initialization routines you do not need.
#ifdef_AFXDLL
  Enable3dControls();   // Call this when using MFC in a shared DLL
#else    
  Enable3dControlsStatic();// Call this when linking to MFC statically
#endif
  // Set dialog background color to black
//  SetDialogBkColor(RGB(0,0,0),RGB(255,255,255));
  int response;
  CI2CDialog  idlg;
  try
  {

  if((response=idlg.DoModal()) !=IDOK)

    {
				
				<dp n="d138"/>
     if(response==IDABORT)

     {

       AfxMessageBox("Trouble initializing");

       Sleep(1000);

     }
//       return FALSE;

    }
  }
  catch(CException"e)
  {
//        printf("Trouble initializing\n");
//        Sleep(1000);

      return FALSE;
  }
  //  CSaDlg dlg;
  CTabDialog  dlg;
  m_pMainWnd=&amp;dlg;
  int nResponse=dlg.DoModal();
  if(nResponse==IDOK)
  {

  // TODO:Place code here to handle when the dialog is

  //  dismissed with OK
  }
  else if(nResponse==IDCANCEL)
  (

  // TODO:Place code here to handle when the dialog is

  //  dismissed with Cancel
  }
  // Since the dialog has been closed,return FALSE so that we exit the
  // application,rather than start the application"s message pump.
  return FALSE;
}
				
				<dp n="d139"/>
//{{NO_DEPENDENCIES}}
// Microsoft Developer Studio generated include file.
// Used by sa.rc
//
#define IDM_ABOUTBOX                    0x0010
#define IDD_ABOUTBOX                    100
#define IDS_ABOUTBOX                    101
#define IDD_SA_DIALOG                   102
#define IDR_MAINFRAME                   128
#define IDD_DIALOG1                     129
#define IDD_PP1                         130
#define IDR_MENU1                       130
#define IDD_PP2                         131
#define IDD_PP3                         132
#define IDD_PP4                         133
#define IDD_PP5                         134
#define IDD_PP6                         135
#define IDD_PP7                         136
#define IDD_PP8                         137
#define IDD_PP9                         138
#define IDD_DIALOG2                     139
#define IDD_DIALOG3                     140
#define IDD_DIALOG4                     141
#define IDD_PP10                        142
#define IDD_PP11                        143
#define IDC_BUTTON1                     1001
#define IDC_BUTTON2                     1002
#define IDC_SLIDER1                     1004
#define IDC_CHECK1                      1005
#define IDC_SLIDER2                     1005
#define IDC_SLIDER3                     1006
#define IDC_RADIO1                      1006
#define IDC_SLIDER4                     1007
#define IDC_CHECK2                      1007
#define IDC_RADIO2                      1007
#define IDC_EDIT1                       1007
#define IDC_SLIDER5                     1008
#define IDC_CHECK3                      1008
#define IDC_RADlO3                      1008
#define IDC_SLIDER6                     1009
#define IDC_CHECK4                      1009
#define IDC_RADlO4                      1009
#define IDC_SLIDER7                     1010
#define IDC_CHECK5                      1010
#define IDC_SLIDER8                     1011
#define IDC_CHECK6                      1011
#define IDC_SLIDER9                     1012
#define IDC_CHECK7                      1013
#define ID_MENUITEM32771                32771
#define ID_MENUITEM32772                32772
#define ID_FILE_EXPORTPARAMFILE         32773
//Next default values for new objects
//
#ifdef APSTUDIO_INVOKED
#ifndef APSTUDIO_READONLY_SYMBOLS
#define _APS_NEXT_RESOURCE_VALUE         142
#define _APS_NEXT_COMMAND_VALUE          32774
#define _APS_NEXT_CONTROL_VALUE          1011
#define _APS_NEXT_SYMED_VALUE            103
#endif
#endif
				
				<dp n="d140"/>
#if !defined(AFX_TABDIALOG_H_5CB3DF04_D20F_11D2_96EE_006097CDB9E2__INCLUDED_)
#define AFX_TABDIALOG_H__5CB3DF04_D20F_11D2_96EE_006097CDB9E2__INCLUDED_
#if _MSC_VER >=1000
#pragma once
#endif // _MSC_VER >=1000
// TabDialog.h:header file
//
#include"Page1.h"
#include"MainPage.h"
#include"DDX.h"
#include"NotchPage1.h"
#include"NotchPage2.h"
#include"StWaveRejPage.h"
#include"ShelvPage.h"
#include"NewCutoffPage.h"
#include"AllpassPage.h"
#include"DBNotch.h"
/////////////////////////////////////////////////////////////////////////////
// CTabDialog dialog
class CTabDialog:public CDialog
{
// Construction
public:    
  void DisplayI2CState(lomg error);
  virtual void SetStatusString(int which,CString &amp;s);
  CTabDialog(CWnd* pParent=NULL):   // standard constructor
// Dialog Data
  //{{AFX_DATA(CTabDialog)
  enum{IDD=IDD_DIALOG1};

  // NOTE:the ClassWizard will add data members here
  //}}AFX_DATA
// Overrides
  // ClassWizard generated virtual function overrides
  //{{AFX_VIRTUAL(CTabDialog)
  protected:
  virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV support
  //}}AFX_VIRTUAL
// Implementation
protected:
  virtual void DisplayMode(int);
  CStatusBar      m_StatusBar;
  CPropertySheet  m_dlgPropSheet;
  HICON           m_hIcon;
//  CPage1         m_Page1;
  CMainPage     m_MainPage;
  CDDX            m_DDXPage;
  CNotchPage1     m_Notch1Page;
  CNotchPage2     m_Notch2Page:
  CStWaveRejPage  m_StWaveRejPage;
  CShelvPage      m_ShelvPage;
//  CCutoffPage     m_CutoffPage;
  CNewCutoffPage  m_CutoffPage;
  CAllpassPage    m_AllpassPage;
  CDBNotch        m_DBNotch;
  CBrush          m_brush;
  UINT         m_timerID;
  BOOL            m_HDCDDisplay;
  int             m_AIdx,m_ICnt;
  int             m_ErrorCounter;
  // Generated message map functions
  //{{AFX_MSG(CTabDialog)
				
				<dp n="d141"/>
  virtual BOOL OnInitDialog();

  afx_msg void OnSysCommand(UINT nID,LPARAM lParam);

  afx_msg void OnPaint();

  afx_msg HCURSOR OnQueryDragIcon();

  afx_msg void OnClose();

  afx_msg vois OnMove(int x,int y);

  afx_msg HBRUSH OnCtlColor(CDC* pDC,CWnd"pWnd,UINT nCtlColor);

  afx_msg void OnOpenMenu();

  afx_msg void OnSaveMenu();

  afx_msg void OnTimer(UINT nIDEvent);

  afx_msg void OnFileExportparamfile();

  //}}AFX_MSG

  DECLARE_MESSAGE_MAP()
};
//{{AFX_INSERT_LOCATION}}
// Microsoft Developer Studio will insert additional declarations immediately before the previous line.
#endif // !defined(AFX_TABDIALOG_H__5CB3DF04_D20F_11D2_96EE_006097CDB9E2__INCLUDED_)
				
				<dp n="d142"/>
// TabDialog.cpp:implementation file
//
#include"stdafx.h"
#include"sa.h"
#include"TabDialog.h"
#include"DSP56kManager.h"
#include"I2CCommErrorDialog.h"
#include<afxdlgs.h>
#ifdef_DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#endif
#define TIMERID 1
#define ID_HDCD_DETECT   56000
#define ID_ERROR_DISPLAY (ID_HDCD_DETECT+1)
static UINT auIDStatusBar[]={
  ID_SEPARATOR,
  ID_HDCD_DETECT,
  ID_SEPARATOR,
  ID_ERROR_DISPLAY
};
#define AARRAYSIZE 16
static  char   *Detect_Array[AARRAYSIZE]={
"            HDCD",
"           HDCD ",
"          HDCD  ",
"         HDCD   ",
"        HDCD    ",
"       HDCD     ",
"      HDCD      ",
"     HDCD       ",
"    HDCD        ",
"   HDCD         ",
"  HDCD          ",
" HDCD           ",
"HDCD            ",
"DCD            H",
"CD            HD",
"D            HDC"
};
/////////////////////////////////////////////////////////////////////////////
// CTabAboutDlg dialog used for App About
class CTabAboutDlg :public CDialog
{
public:
  CTabAboutDlg();
// Dialog Data
  //{{AFX_DATA(CTabAboutDlg)
  enum{IDD=IDD_ABOUTBOX};
  //}}AFX_DATA
  // ClassWizard generated virtual function overrides
  //{{AFX_VIRTUAL(CTabAboutDlg)
  protected:
  virtual void DoDataExchange(CDataExchange"pDX );  // DDX/DDV support
  //}}AFX_VIRTUAL
// Implementation
protected:
  //{{AFX_MSG(CTabAboutDlg)
				
				<dp n="d143"/>
  //}}AFX_MSG
  DECLARE_MESSAGE_MAP()
};
CTabAboutDlg::CTabAboutDlg() :CDialog(CTabAboutDlg::IDD)
{
  //{{AFX_DATA_INIT(CTabAboutDlg)
  //}}AFX_DATA_INIT
}
void CTabAboutDlg::DoDataExchange(CDataExchange* pDX)
{
  CDialog::DoDataExchange(pDX);
  //{{AFX_DATA_MAP(CTabAboutDlg)
  //}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CTabAboutDlg,CDialog)
  //{{AFX_MSG_MAP(CTabAboutDlg)

  //No message handlers
  //}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CTabDialog dialog
CTabDialog::CTabDialog(CWnd* pParent /*=NULL*/)
  :CDialog(CTabDialog::IDD,pParent)
{
  //{{AFX_DATA_INIT(CTabDialog)

  // NOTE:the ClassWizard will add member initialization here
  //}}AFX_DATA_INIT
  m_hIcon=AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}
void CTabDialog::DoDataExchange(CDataExchange* pDX)
{
  CDialog::DoDataExchange(pDX);
  //{{AFX_DATA_MAP(CTabDialog)

  // NOTE:the ClassWizard will add DDX and DDV calls here
  //}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CTabDialog,CDialog)
  //{{AFX_MSG_MAP(CTabDialog)
  ON_WM_SYSCOMMAND()
  ON_WM_PAINT()
  ON_WM_QUERYDRAGICON()
  ON_WM_CLOSE()
  ON_WM_MOVE()
  ON_WM_CTLCOLOR()
  ON_COMMAND(ID MENUITEM32771,OnOpenMenu)
  ON_COMMAND(ID_MENUITEM32772,OnSaveMenu)
  ON_WM_TIMER()
  ON_COMMAND(ID_FILE_EXPORTPARAMFILE,OnFileExportparamfile)
  //}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CTabDialog message handlers
#define PS_WIDTH  222
#define PS_HEIGHT 215
BOOL CTabDialog::OnInitDialog()
{
  int partsList[]=(50,100,150,-1};
				
				<dp n="d144"/>
CDialog::OnInitDialog();
// Add"About..."menu item to system menu.
// IDM_ABOuTBOX must be in the system command range.
ASSERT((IDM_ABOUTBOX &amp; 0xFFF0 )==IDM_ABOUTBOX);
ASSERT(IDM_ABOUTBOX < 0xF000);
CMenu* pSysMenu=GetSystemMenu(FALSE);
if(pSyaMenu !=NULL)
{
    CString strAboutMenu;
    strAboutMenu.LoadString(IDS_ABOUTBOX);
    if((strAboutMenu.IsEmpty())
  {

    pSysMenu->AppendMenu(MF_SEPARATOR);

    pSysMenu->AppendMenu(MF_STRING,IDM_ABOUTBDX,strAboutMenu);
  }
}
// Set the icon for this dialog,The framewok does this automatically
// when the application′s main window is not a dialog
SetIcon(m_hIcon,TRUE);    // Set big icon
SetIcon(m_hIcon,FALSE);   // Set small icon
// build brush
m_brush.CreateSolidBrush(RGB(0,0,0));
// build prop sheet
m_dlgPropSheet.AddPage(&amp;m_MainPage);
m_dlgPropSheet.AddPage(&amp;m_DDXPage);
m_dlgPropSheet.AddPage(&amp;m_ShelvPage);
m_dlgpropSheet.AddPage(&amp;m_CutoffPage);
m_dlgpropSheet.AddPage(&amp;m_Notch1Page);
m_dlgPropSheet.AddPage(&amp;m_Notch2Page);
m_dlgPropSheet.AddPage(&amp;m_StWaveRejPage);
m_dlgPropSheet.AddPage(&amp;m_AllpassPage);
m_dlgPropSheet.AddPage(&amp;m_DBNotch);
m_dlgPropSheet.Create(this,WS_CHILD | WS_VISIBLE,0);
m_dIgPropSheet.ModifyStyleEx(0,WS_EX_CONTROLPARENT);
m_dlgPropSheet.ModifyStyle(0,WS_TASBTOP);
m_dlgPropSheet.SetWindowPos(NULL,0,0,PS_WIDTH,PS_HEIGHT,SWP_NOZORDER | SWP_NOSIZE | SWP_NOACTIVATE);
  // resize dialog to fit propsheet exactly
RECT rect;
m_dlgPropSheet.GetWindowRect(&amp;rect);
//rect.bottom +=14;
//rect rioht +=14;
SetWindowPos(&amp;wndBottom,rect.left,rect.top,rect.right,rect.bottom,SWP_NOZORDER | SWP_NOMOVE);
// Add status bar
RECT sizerect;
sizerect.top=PS_HEIGHT;
sizerect.bottom=sizerect.top+20;
sizerect.left=0;
sizerect.right=PS_WIDTH;
//m_StatusBar.Create(WS_CHILD | WS_VISIBLE | CCS_BOTTOM,sizerect,this,AFX_IDW_STATUS_BAR);
//m_StatusBar.ShowWindow(SW_SHOWNA);
//m_StatusBar.SetSimple();
//m_StatusBar.SetText("Hello world".255.0);
m_StatuaBar.Create(this);
//m_StatusBar.SetIndicators(auIDStatusBar,sizeof(auIDStatusBar)/sizeof(UINT));
//m_StatusBar.SetPaneInfo(0,m_StatusBar.GetItemID(0),SBPS_STRETCH,NULL);
//m_StatusBar.GetStatusBarCtrl().SetText("Hello world!",0,0);
CRect rcClientStart;
CRect rcClientNow;
GetClientRect(rcClientStart);
				
				<dp n="d145"/>
  RepositionBars(AFX_IDW_CONTROLBAR_FIRST,AFX_IDW_CONTROLBAR_LAST,

           0,reposQuery,rcClientNow);

  // Now move all the controls so they are  in the same relative

  // position within the remaining client area as they would be

  // with no control bars.
  /*  CPoint ptOffset(rcClientNow.left - rcClientStart.left,

          rcClientNow.top - rcClientStart.top);

  CRect  rcChild;

  CWnd* pwndChild=GetWindow(GW_CHILD);

  while(pwndChild)

  {

    pwndChild->GetWindowRect(rcChild);

    ScreenToClient(rcChild);

    rcChild.OffsetRect(ptOffset);

    pwndChild->MoveWindow(rcChild,FALSE);

    pwndChild=pwndChild->GetNextWindow();

  } */

  // Adjust the dialog window dimensions

  CRect rcWindow;

  GetWindowRect(rcWindow);

  rcWindow.right +=rcClientStart.Width()-rcClientNow.Width();

  rcWindow.bottom +=rcClientStart.Height()-rcClientNow.Height();

  rcWindow.bottom +=5;

  MoveWindow(rcWindow,FALSE);

  // And position the control bars

  RepositionBars(AFX_IDW_CONTROLBAR_FIRST,AFX_IDW_CONTROLBAR_LAST,0);

  m_timerID=0;

  m_timerID=SetTimer(TIMERID,50,NULL);

  m_ErrorCounter=0;

  m_HDCDDisplay=false;

  DisplayMode(1);

  SetWindowText("Untitled");

  partsList[0] =rcClientNow.Width()/4;

  partsList[1] =partsList[0]+(rcClientNow.Width()/4);

  partsList[2] =partsList[1]+(rcClientNow.Width()/4);

  partsList[3] =-1;

  m_StatusBar.GetStatusBarCtrl().SetParts(sizeof(partsList)/sizeof(int),partsList);

  return TRUE; // return TRUE unless you set the focus to a control

                // EXCEPTION:OCX Property Pages should return FALSE
}
void CTabDialog::OnClose()
{
// if(m_Page1)
//   delete  m_Page1;
// if(m_Page2)
//   delete  m_Page2;
// if(m_Page3)
//   delete  m_Page3;
   if(m_timerID)

   KillTimer(m_timerID);
  delete g_DSPManager;
  CDialog::OnClose();
}
void CTabDialog::OnSysCommand(UINT nID,LPARAM lParam)
{
  if((nID &amp; 0xFFF0)==IDM_ABOUTBOX)
  {

  CTabAboutDlg dlgAbout;
				
				<dp n="d146"/>
  dlgAbout.DoModal();
  }
  else
  {

   CDialog::OnSysCommand(nID,lParam);
  }
}
void CTabDialog::OnPaint()
{
//  CPaintDC dc(this);// device context for painting

  // TODO:Add your message handler code here

  // Do not call CDialog::OnPaint() for painting messages

  if(IsIconic())

  {

    CPaintDC dc(this);// device context for painting

    SendMessage(WM_ICONERASEBKGND,(WPARAM)dc.GetSafeHdc(),0);

    // Center icon in client rectangle

    int cxIcon=GetSystemMetrics(SM_CXICON);

    int CyIcon=GetSystemMetrics(SM_CYICON);

    CRect rect;

    GetCliencRect(&amp;rect);

    int x=(rect.Width()-cxIcon+1)/2;

    inty=(rect.Height()-cyIcon+1)/2;

    // Draw the icon

    dc.DrawIcon(x,y,m_hIcon);

  }

  else

  {

    // m_StatusBar.RedrawWindow();

    CDialog::OnPaint();

  }
 }
 void CTabDialog::OnMove(int x,int y)
 {

  CDialog::OnMove(x,y);

  // TODO:Add your message handler code here
 }
 // The system calls this to obtain the cursor to display while the user drags
 // the minimized window.
 HCURSOR CTabDialog::OnQueryDragIcon()
 {

  return(HCURSOR) m_hIcon;
 }
 HBRUSH CTabDialog::OnCtlColor(CDC*pDC,CWnd*pWnd,UINT nCtlColor)
 {
   HBRUSH hbr=CDialog::OnCtlColor(pDC,pWnd,nCtlColor);
   // TODO:Change any attributes of the DC here
   // TODO:Return a different brush if the default is not desired
   return hbr;
#if 0
   return m_brush;
#endif
}
void CTabDialog::OnOpeMenu()
{
				
				<dp n="d147"/>
   // TODO;Add your command handler code here
//  char BASED_CODE szFilter()="Text Filrs(*.txt)|*.txt||";
//  CFileDialog fileDlg(TRUE,NULL,NULL,0L,szFilter,NULL);
//  CFileOialog fileDlg(TRUE);
  CFileDialog fikDlg(TRUE,"txt",NULL,OFN_HIDEREADONLY,"Text Files(".txt)|*.txt|All

                                  Files((*.*||*.*,this)
  if(fileDlg.DoModal()==IDOK)

  {

   int array_size=0;

   CString string;

   CStringArray array;

   CStdioFile file(fileDlg.GetPathName().CFile::modeRead| CFile::typeText);

   while(file.ReadString(string))

   {

     array.SetAtGrow(array_size. string);

     array_size++;

   }

   g_DSPManager->SetDSPSettings(array);

   SetWindowText(fileDlg.GetFileName());

   // MM 5/13/99 Invalidate the window so that window is redrawn

   Invalidate(false);

  }
}
void CTabDialog::OnSaveMenu()
{
  // TODO:Add your command handler code here
  CFileDialog fileDlg(FALSE,"txt",NULL,OFN_OVERWRITEPROMPT|OFN_HIDEREADONLY,"Text

  Files(*.txt)|*.txt||",this);
  if(fileDlg.DoModal()==IDOK)

  {

   int array_index=0;

   CString string.

   CStringArray array;

   g_DSPManager->GetDSPSettings(array);

   CStdioFile file(fileDlg,GetPathName(),CFile::modeCreate | CFile::modeWrite | CFile::typeText);

   while(array_index<array.GetSize())

   {

     string=array.GetAt(array_index);

     file.WriteString(string);

     file.WriteString("\n");

     array_index++;

   }

  }
}
void CTabDialog::OnFileExportparamfile()
{
  CFileDialoq fileDlq(FALSE,"prm",NULL,CFN_OVERWRITEPROMPT|OFN_HIDEREADONLY,"Parameter
   Files(*.prm)|*.prm||*,this);
  if(fileDlg.DoModal()==IDOK)

  {

   int array_index=0;

   CString string;

   CStringArray array;

   g_DSPManager->GetFilterBlob(array);

   CStdioFile file(fileDlg.GetPathName().CFile::modeCreate | CFile::modeWrite | CFile::tyPeBinary)

   while(array_index < array.GetSize() )

   {

     string=array.GetAt(array_index);

     file.WriteString(string);

     file.WriteString("\n");

     array_index++;
				
				<dp n="d148"/>
}
void CTabDialog::OnTimer(UINT nIDEvent)
{
  // TODO:Add your message handler code here and/or call default
  if(nIDEvent==TIMERID)

  {

   DisplayMode(g_DSPManager->GetHDCDMode());

   DisplayI2CState(0L);

  }
  else

  {

    CDialog::OnTimer(nIDEvent);

  }
}
void CTabDialog::DisplayMode(int value)
{
  if(value <0)

  {

   DisplayI2CState(-value);

   /* char s[100]:

  sprintf(s,"0x%x",-value);

  m_StatusBar.GetStatusBarCtrl().SetText(s,3,0);*/

  /* if(m_timerID)

    KillTimer(m_timerID);

  CI2CCommErrorDialog dlg;

  char s[100];

  sprintf(s,"0x%x",-value);

  dlg.m_ErrorCode=s;

  if(dlg.DoModal()==IDCANCEL)

    EndDialog(IDCANCEL);

  else

    m_timerID=SetTimer(TIMERID,50,NULL);*/

  }
  else if(value)

  {

    if((m_HDCDDisplay)

    {

      m_ICnt=0;

      m_AIdx=0;

      m_StatusBar,GetStatusBarCtrl(),SetText(Detect_Array[m_AIdx++],1,0);

     //SetWindowText(Detect_Array[m_AIdx++]);

   }

   else

   {

     m_ICnt++;

     if(m ICnt >5)

     {

       m_ICnt=0;

       m_StatusBar.GetStatusBarCtrl().SetText(Detect_Array[m_AIdx++],1,0);

       //SetWindowText(Detect_Array[m_AIdx++]);

       if(m_AIdx>=AARRAYSIZE)

         m_AIdx=0;

     }

   }

   m_HDCDDisplay=true ;
  }
else
  {

  if(m_HDCDDisplay)

    m_StatusBar.GetStatusBarCtrl|).SetText("BAD CD..NO DONUT",1,0);

    //SetwindowText("BAD CD.. NO DONUT");

  m_HDCDDisplay=false;
  }
				
				<dp n="d149"/>
void CTabDialog::SetStatusString(int which,CString &amp; s)
{
   m_StatusBar.GetStatusBarCtrl()SetText(s,0,0);
}    
void CTabDialog::DisplayI2CState(long error)
{
  if(error)
  {

  char s[100];

  sprintf(s,"0x%x",error);

  m_StatusBar.GetStatusBarCtrl().SetText(s,3,0);

  m_ErrorCounter=100;   // 5 seconds
  }
  else
  {

  if(m_ErrorCounter)

  {

    m_ErrorCounter--;

    if(m_ErrorCounter > 0)

      return;

  }   if(g_DSPManager->IsBusy())

    {

      m_StatusBar.GetStatusBarCtrl().SetText("Transmitting..",3,0);

    }

  else

    {

      m_StatusBar.GetStatusBarCtrl().SetText(""3,0);

    }
   }
}
				
				<dp n="d150"/>
#if !defined(AFX_STWAVEREJPACE_H_0CF7E209_D790_11D2_96EE_006097CDB9E2__INCLUDED_)
#define AFX_STWAVEREJPAGE_H__0CF7E209_D790_11D2_96EE_006097CDB9E2_INCLUDED_
#if_MSC_VER >=1000
#pragma once
#endif //_MSC_VER >=1000
// StWaveRejPage.h:header file
//
/////////////////////////////////////////////////////////////////////////////
// CStWaveRej Page dialog
class CTabDialog;
class CStWaveRejPage;public CPropertyPage
{
  DECLARE_DYNCREATE(CStWaveRejPage)
// Construction
public:
  CStWaveRejPagc();
  -CStWaveRejPage();
// Dialog Data
  //{{AFX_DATA(CStWaveRejPage)
  enum {IDD=IDD_PP5};
  CButton m_BypassButton;
  CSliderCtrl m_Notch3BoostSlider;
  CSliderCtrl m_Notch3QSlider;
  CSliderCtrl m_Notch2CutSlider;
  CSliderCtrl m_Notch2QSlider;
  CSliderCtrl m_Notch2FreqSlider;
  CSliderCtrl m_Notch1CutSlider;
  CSliderCtrl m_Notch1QSlider;
  CSliderCtrl m_Notch1FreqSlider;
  //}}AFX_DATA
// Overrides
  // ClassWizard generate virtual function overrides
  //{{AFX_VIRTUAL(CStWaveRejPage)
  protected:
  virtual void DoDataExchange(CDataExchange* pDX);  // DDX/DDV support
  //}}AFX_VIRTUAL
// Implementation
protected:
  // Generated message map functions
  //{{AFX_MSG(CStWaveRejPage)
  virtual BOOL OnInitDialog();
  afx_msg void OnVScroll(UINT nSBCode,UINT nPos,CScrollBar* pScrollBar);
  afx_msg void OnShowWindow(BOOL bShow.UINT nStatus);
  afx_msg void OnPaint();
  afx_msg void OnBypass();
  //}}AFX_MSG    
  DECLARE_MESSAGE_MAP()
  CTabDialog *m_ParentWindow;
  void SendStringToUI(int which);
};
//{{AFX_INSER T_LOCATION}}
//Microsoft Developer Studio will insert additional declarations immediately before the previous line.
#endif // !defined(AFX_STWAVEREJPAGE_H_0CF7E209_D790_11D2_96EE_006097CDB9E2_INCLUDED_)
				
				<dp n="d151"/>
// StWaveRejPage.cpp :implementation file
//    
#include"stdafx.h"
#include"sa.h"
#include"StWaveRejPage.h"
#include"TabDialog.h"
#include"DSP56kManager.h"
#ifdef_DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CStWaveRej Page property page
IMPLEMENT_DYNCREATE(CStWaveRejPage,CPropertyPage)
CStWaveRejPage::CStWaveRejPage():CPropertyPage(CStWaveRejPage::IDD)
{
  //{{AFX_DATA_INIT(CStWaveRejPage)
  //}}AFX_DATA_INIT
}
CStWaveRejPage::-CStWaveRejPage()
{
}    
void CStWaveRejPage::DoDataExchange(CDataExchange* pDX)
{
  CPropertyPage::DoDataExchange(pDX);
  //{{AFX_DATA_MAP(CStWaveRejPage)
  DDX_Control(pDX,IDC_CHECK5,m_BypassButton);
  DDX_Control(pDX,IDC_SLIDER9,m_Notch3BoostSlider);
  DDX_Control(pDX,IDC_SLIDER8,m_Notch3QSlider);
  DDX Control(pDX,IDC_SLIDER6,m_Notch2CutSlider);
  DDX_Control(pDX,IDC_SLIDER5,m_Notch2QSlider);
  DDX_Control(pDX,IDC_SLIDER4,m_Notch2FreqSlider);
  DDX_Control(pDX,IDC_SLIDER3,m_Notch1CutSlider);
  DDX_Control(pDX,IDC_SLIDER2,m_Notch1QSlider);
  DDX Control(pDX,IDC_SLIDER1,mNotch1FreqSlider);
  //}}AFX_DATA_MAP
}    
BEGIN_MESSAGE_MAP(CStWaveRejPage,CPropertyPage)
  //{{AFX_MSG_MAP(CStWaveRejPage)
  ON_WM_VSCROLL()
  ON_WM_SHOWWINDOW()
  ON_WM_PAINT()
  ON_BNCLICKED(IDC_CHECK5,OnBypass)
  //}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CStWaveRejPage message handler8
BOOL CStWaveRejPage::OnInitDialog()
{
  CPropertyPage::OnInitDialog();
  // TODO:Add extra initialization here
  m_Notch1FreqSlider.SetRange(0,CONTROL_RANGE);
  m_Notch1FreqSlider.SetPos(CONTROL_RANGE-g_DSPManager->GetParamValue(kNotch3Freq));
  m_Notch1FreqSlider.SetTicFreq((CONTROL_RANGE+1)/16);
  m_Notch1FreqSlider.SetPageSize(PG_CONTROL_AMT);
  m_Notch1QSlider.SetRange(0,CONTROL_RANGE);
  m_Notch1QSlider.SetPos(CONTROL_RANGE-g_DSPManager->GetParamValue(kNotch3Q));
  m_Notch1QSlider.SetTicFreq((CONTROL_RANGE+1}/16);
				
				<dp n="d152"/>
  m_Notch1QSlider.SetPageSize(PG_CONTROL_AMT);

  m_Notch1CutSlider.SetRange(0.CONTROL_RANGE);

  m_Notch1CutSlider.SetPos(CONTROL_RANGE-g_DSPManager->GetParamValue(kNotch3Cut));

  m_Notch1CutSlider.SetTicFreq((CONTROL_RANGE+1)/16);

  m_Notch1CutSider.SetPageSize(PG_CONTROL_AMT);

  m_Notch2FreqSlider.SetRange(0,CONTROL_RANGE);

  m_Notch2FreqSlider.SetPos(CONTROL_RANGE-g_DSPManager->GetParamValue(kNotch4Freq));

  m_Notch2FreqSlider.SetTicFreq((CONTROL_RANGE+1)/16);

  m_Notch2FreqSlider.SetPageSize(PG_CONTROL_AMT);

  m_Notch2QSlider.SetRange(0,CONTROL_RANGE);

  m_Notch2QSlider.SetPos(CONTROL_RANGE-g_DSPManager->GetParamValue(kNotch4Q));

  m_Notch2QSlider.SetTicFreq((CONTROL_RANGE+1)/16);

  m_Notch2QSlider.SetPageSize(PG_CONTROL_AMT);

  m_Notch2CutSlider.SetRange(0,CONTROL_RANGE);

  m_Notch2CutSlider.SetPos(CONTROL_RANGE-g_DSPManager->GetParamValue(kNotch4Cut));

  m_Notch2CutSlider.SetTicFreq((CONTROL_RANGE+1)/16);

  m_Notch2CutSlider.SetPageSize(PG_CONTROL_AMT);

  m_Notch3QSlider.SetRange(0,CONTROL_RANGE);

  m_Notch3QSlider.SetPos(CONTROL_RANGE-g_DSPManager->GetParamvalue(kNotchSQ));

  m_Notch3QSlider.SetTicFreq((CONTROL_RANGE+1)/16);

  m_Notch3QSlider.SetPageSize(PG_CONTROL_AMT);

  m_Notch3BoostSlider.SetRange(0,CONTROL_RANGE);

  m_Notch3BoostSlider.SetPos(CONTROL_RANGE-g_DSPManager->GetParamValue(kNotch5Cut));

  m_Notch3BoostSlider.SetTicFreq((CONTROL_RANGE+1)/16);

  m_Notch3BoostSlider.SetPageSize(PG_CONTROL_AMT);

  m_ParentWindow=(CTabDialog*)GetParent()->GetParent();

  return TRUE; // return TRUE unless you set the focus to a control

                // EXCEPTION:OCX Property Pages should return FALSE
}
void CStWaveRejPage::SendStringToUI(int which)
{

  CString str;

  g_DSPManager->GetStringValue(which,str);

  m_ParentWindow->SetStatusString(0,str);
}
void CStWaveRejPage::OnVScroll(UINT nSBCode,UINT nPos,CScrollBa r*pScrollBar)
{
  // TODO:Add your message handler code here and/or call default
  CSliderCtrl *slider=(CSliderCtrl *)pScrollBar;
  int which;
  CPropertyPage::OnVScroll(nSBCode,nPos,pScrollBar);
  Sleep(50);
  if(slider ==&amp;m_NotchlFreqSlider)

  which=kNotch3Freq:
  else if(slider==&amp;m_Notch1QSlider)

  which=kNotch3Q;
  else if(slider==&amp;m_Notch1CutSlider)

  which=kNotch3Cut;
  else if(slider==&amp;m_Notch2FreqSlider)

  which=kNotch4Freq;
  else if(slider==&amp;m_Notch2QSlider)

  which=kNotch4Q;
  else if(slider==&amp;m_Notch2CutSlider)

  which=kNotch4Cut;
  else if(slider==&amp;m_Notch3QSlider)

  which=kNotch5Q;
				
				<dp n="d153"/>
  else if(slider==&amp;m_Notch3BoostSlloer)

  which=kNotch5Cut;   
  else

  return;
  g_DSPManager->SetParamValue(CONTROL_RANGE-slioer->GetPos(),which);
  SendStringToU1(which);
}
void CStWaveRejPage::OnShowWindow(BOOL bShow,UINT nStatus)
{
  CPropertyPage::OnShowWindow(bShow,nStatus);
  // TODO:Add your message handler code here
}
void CStWaveRejPage::OnPaint()
{
  CPaintDC dc(this);// device context for painting
  // TODO:Add your message handler code here
  m_Notch1FreqSlider.SetPos(CONTROL_RANGE-g_DSPManager->GetParamValue(kNotch3Freq));
  m_Notch1QSlider.SetPos(CONTROL_RANGE-g_DSPManager->GetParamValue(kNotch3Q));
  m_otch1CutSlider.SetPos(CONTROL_RANGE-g_DSPManager->GetParamValue(kNotch3Cut));
  m_Notch2FreqSlider.SetPos(CONTROL_RANGE-g_DSPManager->GetParamValue(kNotch4Freq));
  m_Notch2QSlider.SetPos(CONTROL_RANGE-g_DSPManager->GetParamValue(Notch4Q));
  m_Notch2CutSlider.SetPos(CONTROL_RANGE-g_DSPManager->GetParamValue(kNotch4Cut));
  m_Notch3QSlider.SetPos(CONTRO_RANGE-g_DSPManager->GetParamValue(kNotch5Q));
  m_Notch3BoostSlider.SetPos(CONTROL_RANGE-g_DSPManager->GetParamValue(kNotch5Cut));
  m_BypassButton.SetCheck(g_DSPManager->GetBypassSection(kBypassConecry));
  // Do not call CPropertyPage::OnPaint() for painting messages
}
void CStWaveRejPage::OnBypass()
{
  // TODO:Add your control notification handler code here
  int state=m_BypassButton.GetState() &amp; 0x3;
  g_DSPManager->SetBypassSection(state,kBypassConecry);
}
				
				<dp n="d154"/>
/*

  There a number of blocks(processing units).

  The signal flow is linenr currently.

  Each item is an ascii line of text

  The file format is as follows:

  version number

  block type

  number of params for block

  block param #1

  block param #2

  block param #3

  block param #n

  block type

  number of params for block

  block param #1

  block param #2

  block param #3

  block param #n
  */
// file version number
#define BLOB_FILE_VERSION 1
// block type descriptor
typedef enum {

  BLOCK_DELAY,

  BLOCK_GAIN,

  BLOC_PEQ,

  BLOCK_AP,

  BLOCK_LS,

  BLOCK_HS,

  BLOCK_HP,

  BLOCK_LP,

  BLOCK_LP2
} ProcessType;
				
				<dp n="d155"/>
// SPIPEMicroComm.h:interface for the SPIPEMicroComm class.
//    
//////////////////////////////////////////////////////////////////////
#if !defined(AFX_SPIPEMICROCOMM_H__33F9EF06_F6EF_11D2_96EE_006097CDB9E2__INCLUDED_)
#define AFX_SPIPEMICROCOMM_H__33F9EF06_F6EF_11D2_96EE_006097CDB9E2__INCLUDED_
#if_MSC_VER >=1000
#pragma once
#endif //_MSC_VER >=1000
#include "DSPComm.h"
class SPIPEMicroComm:public DSPComm
{
  int cmd_delay;
  int io_delay;
public:
  SPIPEMicroComm();
  virtual-SPIPEMicroComm();
  virtual long SendDSPWord(long);
  virtual long SendDSPMemory(char*,long);
};
#endif // !defined(AFX_SPIPEMICROCOMM_H__33F9EF06_F6EF_11D2_96EE_006097CDB9E2__INCLUDED_)
				
				<dp n="d156"/>
// SPIPEMicroComm.cpp:implementation of the SPIPEMicroComm class.
//
//////////////////////////////////////////////////////////////////////
#include"stdafr.h"
#include"sa.h"
#include"SPIPEMicroComm.h"
#include"unit_ppi.h"
#include"functs.h"
#ifdef_DEBUG
#undef THIS_FILE
static char THIS_FILE[]*__FILE__;
#define new DEBUG_NEW
#endif
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
SPIPEMicroComm::SPIPEMicroComm()
{
  cmd_delay=1000;
  io_delay=50;
  if(load_dll()==false)
  {

  MessageBox(NULL,"UNIT_PPI not found in the system directory.Fix this and restart application.

    Will Robinson",MB_OK | MB_ICONSTOP);
  }
  else
  {

  init_port_spi(1);

  set_cmd_delay_cnt_value(cmd_delay):

  set_io_delay_cnt_value(io_delay):
  }
}
SPIPEMicroComm::-SPIPEMicroComm()
{
}
long SPIPEMicroCocomm::SendDSPWord(long value)
{
  return(spi_xchng24(value));
}
long SPIPEMicIoComm::SendDSPMemory(char"data,long len)
{
  return(0L);

        }
				
				<dp n="d157"/>
#if !defined(AFX_SHELVPAGE_H__6F151624_D84D_11D2_96EE_006097CDB9E2__INCLUDED_)
#define AFX_SHELVPAGE_H__6F151624_D84D_11D2_96E_006097CDB9E2__INCLUDED_
#if MSC VER >=1000
#pTagma once
#endif // _MSC_VER >=1000
// ShelvPage.h:header file
//
/////////////////////////////////////////////////////////////////////////////
// CShelvPage dialog
class CTabDialog;
class CShelvPage  :public CPropertyPage
{
  DECLARE_DYNCREATE(CShelvPage)
// Construction
public:
  CShelvPage();
  -CShelvPage();
// Dialog Data
  //{{AFX_DATA(CShelvPage)
  enum{IDD=IDD_PP6};
  CButton m_BypassSecondButton;
  CButton m_BypassFirstButton;
  CSliderCtrl m_HiBoostSlider;
  CSliderCtrl m_HiFreqSlider; 
  CSliderCtrl m_LoBoostSlider;
  CSliderCtrl m_LoFreqSlider;
  //}}AFX_DATA
// Overrides

  // ClassWizard generate virtual function overrides

  //{{AFX_VIRTUAL(CShelvPage)

  protected:

  virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV support

  //}}AFX_VIRTUAL
// Implementation
protected:
  // Generated message map functions
  //{{AFX_MSG(CShelvPage)
  virtual BOOL OnInitDialog();
  afx_msg void OnVScroll(UINT nSBCode,UINT nPos,CScrollBar* pScrollBar);
  afx_msg void OnShowWindow(BOOL bShow,UINT nStatus);
  afx_msg void OnPaint():
  afx_msg void OnBypassFirst();
  afx_msg void OnBypassSecond();
  //}}AFX_MSG
  DECLARE_MESSAGE_MAP()    
  CTabDialog *m_ParentWindow;
  void SendStringToUI(int which):
};
//{{AFX_INSERT_LOCATION}}
// Microsoft Developer Studio will insert additional declarations immediately before the previous line.
#endif // !defined(AFX_SHELVPAGE_H__6F151624_D84D_11D2_96EE_006097CDB9E2__INCLUDED_)
				
				<dp n="d158"/>
// ShelvPage.cpp:implementation file
//
#include"stdafx.h"
#include"sa.h"
#include "ShelvPage.h"
#include"TabDialog.h"
#include"DSP56kManager.h"
#ifdef_DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] =__FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CShelvPage property page
IMPLEMENT_DYNCREATE(CShelvPage,CPropertyPage)
CShelvPage::CShelvPage():CPropertyPage(CShelvPage::IDD)
{
  //{{AFX_DATA_INIT(CShelvPage)
  //}}AFX_DATA_INIT
}
CShelvPage::-CShelvPage()
{
}
void CShelvPage::DoDataExchange(CDataExchange* pDX)
{
  CPropertyPage::DoDataExchange(pDX);
  //{{AFX_DATA_MAP(CShelvPage)
  DDX_Control(pDX,IDC_CHECK3,m_BypassSecondButton);
  DDX_Control(pDX,IDC_CHECK1,m_BypassFirstButton);
  DDX_Control(pDX,IDC_SLIDER6,m_HiBoostSlider);
  DDX_Control(pDX,IDC_SLIDET5,m_HiFreqSlider);
  DDX_Control(pDX,IDC_SLIDER3,m_LoBoostSlider);
  DDX_Control(pDX,IDC_SLIDER1,m_LoFreqSlider);
  //}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CShelvPage,CPropertyPage)
  //{{AFX_MSG_MAP(CShelvPage)
  ON_WM_VSCROLL()
  ON_WM_SHOWWINDOW()
  ON_WM_PAINT()
  ON_BN_CLICKED(IDC_CHECK1,OnBypassFirst)
  ON_BN_CLICKED(IDC_CHECK3,OnBypassSecond)
  //}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CShelvPage message handlers
BOOL CShelvPage::OnInitDialog()
{
  CPropertyPage::OnInitDialog();
  // TODO:Add extra initialization here
  m_LoFreqSlider.SetRange(0,CONTROL_RANGE);
  m_LoFreqSlider.SetPos(CONTRO_RANGE-g_DSPManager->GetParamValue(kLoShelfFreq));
  m_LoFreqSlider.SetTicFreq((CONTROL_RANGE+1)/16);
  m_LoFreqSlider.SetPageSize(PG_CONTROL_AMT);
  m_LoBoostSlider.SetRange(0.CONTROL_RANGE);
  m_LoBoostSlider.SetPos(CONTROL_RANGE-g_DSPManager->GetParamValue(kLoShelfGain));
  m_LoBoostSlider.SetTicFreq((CONTROL_RANGE+1)/16);
  m_LoBoostSlider.SetPageSize(PG_CONTROL_AMT);
				
				<dp n="d159"/>
  m_HiFreqSlider.SetRange(0,CONTROL_RANGE);

  m_HiFreqSlider.SetPos(CONTROL_RANGE-g_DSPManager->GetParamValue(kHiShelfFreq));

  m_HiFreqSlider.SetTicFreq((CONTROL_RANGE+1)/16):

  m_HiFreqSlider.SetPageSize(PG_CONTROL_AMT);

  m_HiBoostSlider.SetRange(0,CONTROL_RANGE);

  m_HiBoostSlider.SetPos(CONTROL_RANGE-g_DSPManager->GetParamValue(kHiShelfGain));

  m_HiBoostSlider.SetTicFreq((CONTROL_RANGE+1)/16);

  m_HiBoostSlider.SetPageSize(PG_CONTROL_AMT);

  m_ParentWindow=(CTabDialog*)GetParent()->GetParent();

  return TRUE; // return TRUE unless you set the focus  to a control

                // EXCEPTION:OCX Property Pages should return FALSE
  }
  void CShelvPage::OnVScroll(UINT nSBCode,UINT nPos,CScrollBar*pScrollBar)
  {

  // TODO:Add your message handler code here and/or call default

  CSliderCtrl *slider=(CSliderCtrl*)pScrollBar;

  int which;

  CPropertyPage::OnVScroll(nSBCode,nPos,pScrollBar);

  Sleep(50);

  if(slider==&amp;m_LoFreqSlider)

    which=kLoShelfFreq;

  else if(slider==&amp;m_LoBoostSlider)

    which=kLoShelfGain;

  else if(slider==&amp;m HiFreqSlider)

    which=kHiShelfFreq;

  else if(slider==&amp;m_HiBoostSlider)

    which=kHiShelfGain;

  else

    return;    

  g_DSPManager->SetParamValue(CONTROL_RANGE-slider->GetPos(),which);

  SendStringToUI(which);
  }
  void CShelvPage::SendStringToUI(int which)
  {

    CString str;

    g_DSPManager->GetStringValue(which,str);

    m_ParentWindow->SetStatusString(0,str);
  }
  void CShelvPage::OnShowWindow(BOOL bShow,UINT nStatus)
  {

  CPropertyPage::OnShowWindow(bShow,nStatus);

  // TODO:Add your message handler code here
  }
  void CShelvPage::OnPaint()
  {

  CPaintDC dc(this);// device context for painting

  // TODO:Add your message handler code here

  m_LoFreqSlider.SetPos(CONTROL_RANGE-g_DSPManager->GetParamValue(kLoShelfFreq));

  m_LoBoostSlider.SetPos(CONTROL_RANGE-g_DSPManager->GetParamValue(kLoShelfGain));

  m_HiFreqSlider.SetPos(CONTROL_RANGE-g_DSPManager->GetParamValue(kHiShelfFreq));

  m_HiBoostSlider.SetPos(CONTROL_RANGE-g_DSPManager->GetParamValue(kHiShelfGain));

  m_BypassFirstButton.SetCheck(g_DSPManager->GetBypassSection(kBypassLoshelf));
				
				<dp n="d160"/>
  m_BypassSecondButton.SetCheck(g_DSPManager->GetBypassSection(kBypassHiShelf));

  // Do noT call CPropertyPage::OnPaint() for painting messages
}
void CShelvPage::OnBypassFirst()
{
  // TODO:Add your control notification handler code here
  int state=m_BypassFirstButton.GetState() &amp; 0x3;
  g_DSPManager->SetByassSection(state,kBypassLoshelf);
}
void CShelvPage::OnBypassSecond()
{
  // TODO:Add your control notification handler code here
  int state=m_BypassSecondButton.GetState() &amp; 0x3;
  g_DSPManager->SetBypassSection(state.kBypassHiShelf);
}
				
				<dp n="d161"/>
//Microsoft Developer Studio generated resource script
//
#include"resource.h"    
#define APSTUDIO_READONLY_SYMBOLS
/////////////////////////////////////////////////////////////////////////////
//
// Generated from the TEXTINCLUDE 2 resource.
//
#include"afxres.h"
/////////////////////////////////////////////////////////////////////////////
#undef APSTUDIO_READONLY_SYMBOLS
/////////////////////////////////////////////////////////////////////////////
// English (U.S.) resources
#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU)
#ifdef WIN32
LANGUAGE LANG ENGLISH,SURLANG ENGLISH US
#pragma code_page(1252)
#endif //_WIN32
#ifdef APSTUDIO_INVOKED
/////////////////////////////////////////////////////////////////////////////
//
// TEXTINCLUDE
//
1 TEXTINCLUDE DISCARDABLE
BEGIN

  "resource.h\0"
END
2 TEXTINCLUDE DISCARDABLE
BEGIN

  "#include""afxres.h""\r\n"

  "\0"
END
3 TEXTINCLUDE DISCARDABLE
BEGIN

  "#define _AFX_NO_SPLITTER_RESOURCES\r\n"

  "#define _AFX_NO_OLE_RESOURCES\r\n"

  "#define _AFX_NO_TRACKER_RESOURCES\r\n"

  "#define _AFX_NO_PROPERTY_RESOURCES\r\n"

  "\r\n"

  "#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU)\r\n"

  "#ifdef_WIN32\r\n"

  "LANGUAGE 9,1\r\n"

  "#pragma code_page(1252)\r\n"

  "#endif\r\n"

  "#include""res\\sa.rc2"" // non-Microsoft Visual C++ edited resources\r\n"

  "#include ""afxres.rc""  // Standard components\r\n"

  "#endif\0"
END
#endif     // APSTUDIO_INVOKED
/////////////////////////////////////////////////////////////////////////////
//
// Icon
//
// Icon with lowest ID value placed first to ensure application icon
// remains consistent on all systems
IDR_MAINFRAME        ICON       DISCARDABLE    "res\\sa.ico"
/////////////////////////////////////////////////////////////////////////////
//
// Dialog
				
				<dp n="d162"/>
//    
IDD_ABOUTBOX DrALOG DISCARDABLE 0,0,259,55
STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU
CAPTION"About KOJ′s Amazing Town Crier"
FONT 8,"MS Sans Serif"
BEGIN

  ICON             IDR_MAINFRAME,IDC_STATIC,11,17,21,20

  LTEXT            "KOJ′s Amazing Town Crier Version 1.0",IDC_STATIC,40,10,

                   119,8,SS_NOPREFIX

  LTEXT            "Copyright(C)PMI 1999",IDC_STATIC,40,25,119,8

  DEFPUSHBUTTON    "OK",IDOK,220,7,32,14,WS_GROUP
END
IDD_SA_DIALOG DIALOGEX 0,0,229,175
STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
EXSTYLE WS_EX_APPWINDOW
CAPTION"SuperAudio"
FONT 8,"MS Sans Serif"
BEGIN

  DEFPUSHBUTTON    "OK",IDOK,172,7,50,14

  PUSHBUTTON       "Cancel",IDCANCEL,172,23,50,14

  PUSHBUTTON       "Poke Sequence #1",IDC_BUTTON1,35,83,109,25

  PUSHBUTTON       "Poke Sequence #2",IDC_BUTTON2,33,123,115,28
END
IDD_DIALOG1 DIALOG DISCARDABLE  0,0,236,229
STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU
CAPTION"KOJ's Amazing Town Crier"
MENU IDR_MENU1
FONT 8,"MS Sans Serif"
BEGIN
END
IDD_PP1 DIALOG DISCARDABLE  0,0,195,127
STYLE WS_CHILD | WS_DISABLED |WS_CAPTION
CAPTION"Test"
FONT8,"MS Sans Serif"
BEGIN

  PUSHBUTTON     "Send SPI Sequence #1",IDC_BUTTON1,57,36,86,22

  PUSHBUTTON     "Send SPI Sequence #2",IDC_BUTTON2,55,81,93,31
END
IDD_PP2 DIALOG DISCARDABLE  0,0,288,146
STYLE WS_CHILD | WS_DISABLED | WS_CAPTION
CAPTION"Main"
FONT 8,"MS Sans Serif"
BEGIN

  CONTROL          "Slider1",IDC_SLIDER1,"msctls_trackbar32",TBS_AUTOTICKS |

                    TBS_VERT | WS_TABSTOP,58,25,22,86

  LTEXT             "Pre",IDC_STATIC,28,117,12,8

  CONTROL           "Bypass Processing",IDC_CHECK1,"Button",BS_AUTOCHECKBOX |

                    WS_TABSTOP,173,57,76,10

  CONTROL           "Slider1",IDC_SLIDER3,"msctls_trackbar32",TBS_AUTOTICKS |

                    TBS_VERT | WS_TABSTOP,27,25,22,86

  LTEXT             "Post",IDC_STATIC,57,117,15,B

  GROUPBOX          "Volume",IDC_STATIC,19,15,135,118

  CONTROL           "Bypasss HDCD",IDC_CHECK2,"Button",BS_AUTOCHECKBOX |

                    WS_TABSTOP,173,74,76,10

  CONTROL           "Bypass HDCD Gain Scale",IDC_CHECK3,"Button",

                    BS_AUTOCHECKBOX | WS_TABSTOP,173,91,98,10

  PUSHBUTTON        "Reset All",IDC_BUTTON1,173,31,50,14

  CONTROL           "Analog Input",IDC_CHECK4,"Button",BS_AUTOCHECKBOX |

                    WS_TABSTOP,173,108,56,10

  CONTROL           "Slider1",IDC_SLIDER7,"msctls_trackbar32",TBS_AUTOTICKS |

                    TBS_VERT | WS_TABSTOP,89,25,22,86

  LTEXT             "Analog",IDC_STATIC,85,117,23,8

  CONTROL           "Slider1",IDC_SLIDER8,"msctls_trackbar32",TBS_AUTOTICKS |

                    TBS_VERT | WS_TABSTOP,119,25,22,86

  LTEXT             "Delay",IDC_STATIC,117,117,19,8
END
				
				<dp n="d163"/>
IDD_PP3 DIALOG DISCARDABLE  0,0,195,127
STYLE WS_CHILD | WS_DISABLED | WS_CAPTION
CAPTION"Compression"
FONT 8,"MS Sans Serif"
BEGIN

  CONTROL          "Bypass Compression",IDC_CHECK1,"Button",BS_AUTOCHECKBOX |

                   WS_TABSTOP,29,24,104,10
END
IDD_PP4 DIALOG DISCARDABLE 0,0,244,159
STYLE WS_CHILD | WS_DISABLED | WS_CAPTION
CAPTION"Resonance Compensation"
FONT 8,"MS Sans Serif"
BEGIN

  CONTROL         "Slider1",IDC_SLIDER1,"msctls_trackbar32",TBS_AUTOTICKS |

                   TBS_VERT | WS_TABSTOP,20,24,20,85

  CONTROL         "Slider1",IDC_SLIDER2,"msctls_trackbar32",TBS_AUTOTICKS |

                   TBS_VERT | WS_TABSTOP,48,24,21,85

  CONTROL         "Slider1",IDC_SLIDER3,"msctls_trackbar32",TBS_AUTOTICKS |

                   TBS_VERT | WS_TABSTOP,76,24,20,85

  LTEXT            "Freq.",IDC_STATIC,17,113,20,11

  LTEXT            "Q",IDC_STATIC,51,113,8,11

  LTEXT            "Cut/Boost",IDC_STATIC,71,113,33,11

  GROUPBOX         "First Notch",IDC_STATIC,11,15,98,111

  CONTROL          "Slider1",IDC_SLIDER4,"msctls_trackbar32",TBS_AUTOTICKS |

                   TBS_VERT | WS_TABSTOP,137,24,24,85

  CONTROL          "Slider1",IDC_SLIDER5,"msctls_trackbar32",TBS_AUTOTICKS |

                   TBS_VERT | WS_TABSTOP,165,24,21,85

  CONTROL          "Slider1",IDC_SLIDER6,"msctls_trackbar32",TBS_AUTOTICKS |

                   TBS_VERT | WS_TABSTOP,193,24,22,85

  LTEXT            "Freq.",IDC_STATIC,135,113,20,11

  LTEXT            "Q",IDC_STATIC,169,113,8,11

  LTEXT            "Cut/Boost",IDC_STATIC,189,113,32,11

  GROUPBOX         "Second Notch",IDC_STATIC,129,15,98,111

  CONTROL          "Bypass",IDC_CHECK5,"Button",BS_AUTOCHECKBOX |

                   WS_TABSTOP,33,136,39,10

  CONTROL          "Bypass",IDC_CHECK6,"Button",BS_AUTOCHECKBOX |

                   WS_TABSTOP,153,136,39,10
END
IDD_PP5 DIALOG DISCARDABLE 0,0,339,162
STYLE WS_CHILD | WS_DISABLED | WS_CAPTION
CAPTION"Standing Wave Rejection"
FONT 8,"MS Sans Serif"
BEGIN

  CONTROL                 "Slider1",IDC_SLIDER1;"msctls_trackbar32",TBS_AUTOTICKS |

                          TBS_VERT | WS_TABSTOP,20,24,20,85

  CONTROL                 "Slider1",IDC_SLIDER2,"msctls_trackbar32",TBS_AUTOTICKS |

                          TBS_VERT | WS_TABSTOP,48,24,21,85

  CONTROL                 "Slider1",IDC_SLIDER3,"msctls_trackbar32",TBS_AUTOTICKS |

                          TBS_VERT | WS_TABSTOP,76,24,20,85

  LTEXT                   "Freq.",IDC_STATIC,17,113,20,11

  LTEXT                   "Q",IDC_STATIC,51,113,8,11

  LTEXT                   "Cut/Boost",IDC_STATIC,70,113,35,11

  GROUPBOX                "First Notch",IDC_STATIC,11,15,98,111

  CONTROL                 "Slider1",IDC_SLIDER4,"msctls_trackbar32",TBS_AUTOTICKS |

                          TBS_VERT | WS_TABSTOP,229,24,24,85

  CONTROL                 "Slider1",IDC_SLIDER5,"msctls_trackbar32",TBS_AUTOTICKS |

                          TBS_VERT | WS_TABSTOP,257,24,21,85

  CONTROL                 "Slider1",IDC_SLIDER6,"msctls_trackbar32",TBS_AUTOTICKS |

                          TBS_VERT | WS_TABSTOP,285,24,22,85

  LTEXT                   "Freq.",IDC_STATIC,227,113,20,11

  LTEXT                   "Q",IDC_STATIC,261,113,8,11

  LTEXT                   "Cut/Boost",IDC_STATIC,280,113,34,11

  GROUPBOX                "Second Notch",IDC_STATIC,221,15,98,111

  CONTROL                 "Slider1",IDC_SLIDER8,"msctls_trackbar32",TBS_AUTOTICKS |

                          TBS_VERT | WS_TABSTOP,140,25,21,85

  CONTROL                 "Slider1",IDC_SLIDER9,"msctls_trackbar32",TBS_AUTOTICKS |

                          TBS_VERT | WS_TABSTOP,168,25,22,85

  LTEXT                   "Q",IDC_STATIC,144,114,8,11

  LTEXT                   "Cut/Boost",IDC_STATIC,163,114,34,11

  GROUPBOX                "Boost Compensation",IDC_STATIC,125,15,77,111
				
				<dp n="d164"/>
  CONTROL       "Bypass",IDC_CHECK5,"Button".BS_AUTOCHECKBOX |

                 WS_TABSTOP,146,137,41,10
END
IDD_PP6 DIALOG DISCARDABLE  0,0,187,162
STYLE WS_CHILD | WS_DISABLED | WS_CAPTION
CAPTION"Smiley-Face"
FONT 8,"MS Sans Serif"
BEGIN

  CONTROL          "Slider1".IDC_SLIDER1,"msctls_trackbar32",TBS_AUTOTICKS |

                    TBS_VERT | WS_TABSTOP,20,24,20,85

  CONTROL          "Slider1",IDC_SLIDER3,"msctls_trackbar32",TBS_AUTOTICKS |

                    TBS_VERT | WS_TABSTOP,50,24,20,85

  LTEXT            "Freq.",-1,17,113,20,11

  LTEXT            "Cut/Boost",-1,43,113,34,11

  GROUPBOX         "Lo-Shelf",-1,11,15,70,111

  CONTROL          "Slider1",IDC_SLIDER4,"msctls_trackbar32",TBS_AUTOTICKS |

                    TBS_VERT | WS_TABSTOP,108,24,24,85

  CONTROL          "Slider1",IDC_SLIDER6,"msctls_trackbar32",TBS_AUTOTICKS |

                    TBS_VERT | WS_TABSTOP,139,24,22,85

  LTEXT            "Freq.",-1,106,113,20,11

  LTEXT            "Cut/Boost",-1,134,113,33,11

  GROUPBOX         "Hi-Shelf",-1,100,15,69,111

  CONTROL          "Bypass",IDC_CHECK1,"Button",BS_AUTOCHECKBOX |

                    WS_TABSTOP,25,136,37,12

  CONTROL          "Bypass",IDC_CHECK3,"Button",BS_AUTOCHECKBOX |

                    WS_TABSTOP,115,136,37,12
END
IDD_PP7 DIALOG DISCARDABLE  0,0,242,162
STYLE WS_CHILD | WS_DISABLED | WS_CAPTION
CAPTION"Cutoff Response"
FONT 8,"MS Sans Serif"
BEGIN

  CONTROL          "Slider1",IDC_SLIDER1,"msctls_trackbar32",TBS_AUTOTICKS |

                        TBS_VERT | WS_TABSTOP,20,24,20,85

  CONTROL               "Slider1",IDC_SLIDER2,"msctls_trackbar32",TBS_AUTOTICKS |

                        TBS_VERT | WS_TABSTOP,48,24,21,85

  CONTROL               "Slider1",IDC_SLIDER3,"msctls_trackbar32",TBS_AUTOTICKS |

                        TBS_VERT | WS_TABSTOP,76,24,20,85

  LTEXT                 "Freq.",IDC_STATIC,17,113,20,11

  LTEXT                 "Q",IDC_STATIC,51,113,8,11

  LTEXT                 "Cut/Boost",IDC_STATIC,71,113,33,11

  GROUPBOX              "Low Cutoff",IDC_STATIC,11,15,98,111

  CONTROL               "Slider1",IDC_SLIDER4,,"msctls_trackbar32",TBS_AUTOTICKS |

                        TBS_VERT | WS_TABSTOP,137,24,24,85

  CONTROL               "Slider1",IDC_SLIDER5,"msctls_trackbar32",TBS_AUTOTICKS |

                        TBS_VERT | WS_TABSTOP,165,24,21,85

  CONTROL               "Slider1",IDC_SLIDER6,"msctls_trackbar32",TBS_AUTOTICKS |

                        TBS_VERT | WS_TABSTOP,193,24,22,85

  LTEXT                 "Freq.",IDC_STATIC,135,113,20,11

  LTEXT                 "Q",IDC_STATIC,169,113,8,11

  LTEXT                 "Cut/Boost",IDC_STATIC,189,113,32,11

  GROUPBOX              "High Cutoff",IDC_STATIC,129,15,98,111

  CONTROL               "Bypass",IDC_CHECK5,"Button",BS_AUTOCHECKBOX |        

                        WS_TABSTOP,39,139,41,12

  CONTROL               "Bypass",IDC_CHECK6,"Button",BS_AUTOCHECKBOX |

                        WS_TABSTOP,154,139,41,12
END
IDD_PP8 DIALOG DISCARDABLE 0,0,285,164
STYLE WS_CHILD | WS_DISABLED | WS_CAPTION
CAPTION"Cutoff Response"
FONT8,"MS Sans Serif"
BEGIN

  CONTROL         "Slider1",IDC_SLIDER1,"msctls_trackbar32",TBS_AUTOTICKS |

                   TBS_VERT | WS_TABSTOP,20,24,20,85

  CONTROL          "Slider1",IDC_SLIDER2,"msctls_trackbar32",TBS_AUTOTICKS |

                   TBS_VERT | WS_TABSTOP,48,24,21,85

  LTEXT            "Freq.",-1,17,113,20,11

  LTEXT            "Q",-1,51,113,8,11

  GROUPBOX         "Low Cutoff",-1,11,15,71,111
				
				<dp n="d165"/>
  CONTROL            "Slider1",IDC_SLIDER4,"mscttls_trackbar32",TBS_AUTOTICKS |

  TBS_VERT           TBS_VERT | WS_TABSTOP,112,24,24,85

  CONTROL            "Slider1",IDC_SLIDER5,"msctls_trackbar32",TBS_AUTOTICKS |

                     TBS_VERT | WS_TABSTOP,140,24,21,85

  LTEXT              "Freq,",-1,110,113,20,11

  LTEXT              "Q",-1,144,113,8,11

  GROUPBOX           "High Cutoff",-1,104,15,69,111

  CONTROL            "Bypass",IDC_CHECK4,"Button",BS_AUTOCHECKBOX |

                     WS_TABSTOP,25,136,40,13

  CONTROL            "Bypass",IDC_CHECK5,"Button",BS_AUTOCHECKBOX |

                     WS_TABSTOP,116,136,40,13

  CONTROL            "Slider1",IDC_SLIDER8,"msctls_trackbar32",TBS_AUTOTICKS |

                     TBS_VERT | WS_TABSTOP,203,25,24,85

  CONTROL            "Slider1",IDC_SLIDER9,"msctls_trackbar32",TBS_AUTOTICKS |

                     TBS_VERT | WS_TABSTOP,231,25,21,85

  LTEXT              "Freq",-1,201,114,20,11

  LTEXT              "Q",-1,235,114,8,11

  GROUPBOX           "New High Cutoff",-1,195,15,69,111

  CONTROL            "Bypass",IDC_CHECK7,"Button",BS_AUTOCHECKBOX |

                     WS_TABSTOP,207,137,40,13
END
IDD_PP9 DIALOG DISCARDABLE  0,0,244,164
STYLE WS_CHILD | WS_DISABLED | WS_CAPTION
CAPTION"Resonance Compensation #2"
FONT8,"MS Sans Serif"
BEGIN

  CONTROL         "Slider1",IDC_SLIDER1,"msctls_trackbar32",TBS_AUTOTICKS |

                  TBS_VERT | WS_TABSTOP,20,24,20,85

  CONTROL         "Slider1",IDC_SLIDER2,"msctls_trackbar32",TBS_AUTOTICKS |

                  TBS_VERT | WS_TABSTOP,48,24,21,85

  CONTROL         "Slider1",IDC_SLIDER3,"msctls_trackbar32",TBS_AUTOTICKS |

                  TBS_VERT | WS_TABSTOP,76,24,20,85

  LTEXT           "Freq.",IDC_STATIC,17,113,20,11

  LTEXT           "Q",IDC_STATIC,51,113,8,11

  LTEXT           "Cut/Boost",IDC_STATIC,71,113,33,11

  GROUPBOX      "Third Notch",IDC_STATIC,11,15,98,111

  CONTROL       "Slider1",IDC_SLIDER4,"msctls_trackbar32",TBS_AUTOTICKS |

                 TBS_VERT | WS_TABSTOP,137,24,24,85

  CONTROL       "Slider1",IDC_SLIDER5,"msctls_trackbar32",TBS_AUTOTICKS |

                 TBS_VERT | WS_TABSTOP,165,24,21,85

  CONTROL       "Slider1",IDC_SLIDER6,"msctls_trackbar32",TBS_AUTOTICKS |

                 TBS_VERT | WS_TABSTOP,193,24,22,85

  LTEXT         "Freq.",IDC_STATIC,135,113,20,11

  LTEXT         "Q",IDC_STATIC,169,113,8,11

  LTEXT         "Cut/Boost",IDC_STATIC,189,113,32,11

  GROUPBOX      "Fourth Notch",IDC_STATIC,129,15,98,111

  CONTROL       "Bypass",IDC_CHECK5,"Button",BS_AUTOCHECKBOX |

                 WS_TABSTOP,36,139,40,12

  CONTROL       "Bypass",IDC_CHECK6,"Button",BS_AUTOCHECKBOX|   

                 WS_TABSTOP,155,139,40,12
END
IDD_DIALOG2 DIAL,OG DISCARDABLE  0,0,175,66
STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU
CAPTION"Dialog"
FONT 8,"MS Sans Serif"
BEGIN

  PUSHBUTTON       "Cancel",IDCANCEL,59,34,50,14

  LTEXT            "Initializing I2C. Please Wait.....",IDC_STATIC,43,17,

                   98,8
END
IDD_DIALOG3 DIALOG DISCARDABLE  0,0,186,132
STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU
CAPTION"Dialog"
FONT 8,"MS Sans Serif"
BEGIN

  DEFPUSHBUTTON     "OK",IDOK,107,95,50,14

  CONTROL           "COM1",IDC_RADIO1,"Button",BS_AUTORADIOBUTTON,23,57,36,

                    10

  CONTROL           "COM2",IDC_RADIO2,"Button",BS_AUTORADIOBUTTON,23,70,36,
				
				<dp n="d166"/>
                 10

  CONTROL       "COM3",IDC_RADIO3,"Button",BS_AUTORADIOBUTTON,23,82,36,

                10

  CONTROL       "COM4",IDC_RADIO4,"Button",BS_AUTORADIOBUTTON,23,95,36,

                10

  LTEXT         "Choose COM port and reset DSP board",IDC_STATIC,28,21,

                125,8

  GROUPBOX      "COM Port",IDC_STATIC,15,45,68,69
END
IDD_DIALOG4 DIALOG DISCARDABLE  0,0,186,121
STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU
CAPTION"Dialog"
FONT 8,"MS Sans Serif"
BEGIN

  DEFPUSHBUTTON    "OK",IDOK,27,72,50,14

  PUSHBUTTON       "Quit App",IDD_BUTTON1,101,72,48,14

  LTEXT            "I2C communication error!",IDC_STATIC,49,25,79,8

  EDITTEXT         IDC_EDIT1,49,42,68,12,ES_AUTOHSCROLL
END
IDD_PP10 DIALOG DISCARDABLE 0,0,187,162
STYLE WS_CHILD | WS_DISABLED | WS_CAPTION
CAPTION"Allpass"
FONT 8,"MS Sans Serif"
BEGIN

  CONTROL          "Slider1",IDC_SLIDER1,"msctls_trackbar32",TBS_AUTOTICKS |

                    TBS_VERT | WS_TABSTOP,20,24,20,85

  CONTROL          "Slider1",IDC_SLIDER3,"msctls_trackbar32",TBS_AUTOTICKS |

                    TBS_VERT | WS_TABSTOP,50,24,20,85

  LTEXT            "Freq.",-1,17,113,20,11

  LTEXT          "Q",-1,53,113,8,8

  GROUPBOX       "Allpass",-1,11,15,70,111

  CONTROL        "Bypass",IDC_CHECK1,"Button",BS_AUTOCHECKBOX |

                  WS_TABSTOP,25,136,37,12    
END
IDD_PP11 DIALOG DISCARDABLE  0,0,244,159
STYLE WS_CHILD | WS_DISABLED | WS_CAPTION
CAPTION"Double-Tuned Notch"
FONT 8,"MS Sans Serif"
BEGIN

  CONTROL          "Slider1",IDC_SLIDER1,"msctls_trackbar32",TBS_AUTOTICKS |

                    TBS_VERT | WS_TABSTOP,20,24,20,85

  CONTROL          "Slider1",IDC_SLIDER2,"msctls_trackbar32",TBS_AUTOTICKS |

                    TBS_VERT | WS_TABSTOP,48,24,21,85

  LTEXT            "Freq,",-1,17,113,20,11

  LTEXT            "Q",-1,51,113,8,11

  GROUPBOX         "Notch",-1,11,15,70,111

  CONTROL          "Slider1",IDC_SLIDER5,"msctls_trackbar32",TBS_AUTOTICKS |

                    TBS_VERT | WS_TABSTOP,109,24,21,85

  CONTROL          "Slider1",IDC_SLIDER6,"msctls_trackbar32",TBS_AUTOTICKS |

                    TBS_VERT | WS_TABSTOP,137,24,22,85    

  LTEXT            "Q",-1,113,113,8,11

  LTEXT            "Cut/Boost",-1,133,113,32,11

  GROUPBOX         "Compensation",-1,99,15,71,111

  CONTROL          "Bypass",IDC_CHECK5,"Button",BS_AUTOCHECKBOX |

                    WS_TABSTOP,73,136,39,10
END
#ifndef_MAC
/////////////////////////////////////////////////////////////////////////////
//
// Version
//
VS_VERSION_INFO VERSIONINFO
 FILEVERSION 0,7,4,0
 PRODUCTVERSION 0,7,4,0
 FILEFLAGSMASK 0x3fL
#ifdef_DEBUG
				
				<dp n="d167"/>
 FILEFLAGS,0x1L
#else
  FILEFLAGS 0x0L
#endif
  FILEOS 0x4L
  FILETYPE 0x1L
  FILESUBTYPE 0x0L
BEGIN

  BLOCK"StringFileInfo"

  BEGIN

      BLOCK"040904b0"

      BEGIN

          VALUE"CompanyName","Pacific Microsonics Inc.\0"

          VALUE"FileDescription","sa MFC Application\0"

          VALUE"FileVersion","0,7,4,0\0"

          VALUE"InternalName","sa\0"

          VALUE"LegalCopyright","Copyright (C) PMI 1999\0"

          VALUE"OriginalFilename","sa.EXE\0"

          VALUE"ProductName","sa Application\0"

          VALUE"ProductVersion","0,7,4,0\0"

      END

  END

  BLOCK"VarFileInfo"

  BEGIN

  VALUE"Translation",0x409,1200

      END
END
#endif   // !_MAC
/////////////////////////////////////////////////////////////////////////////
//
// DESIGNINFO
//
#ifdef APSTUDIO_INVOKED
GUIDELINES DESIGNINFO DISCARDABLE
BEGIN

  IDD_ABOUTBOX,DIALOG

  BEGIN

      LEFTMARGIN,7

      RIGHTMARGIN,252

      TOPMARGIN,7

      BOTTOMMARGIN,48

  END

  IDD_SA_DIALOG,DIALOG

  BEGIN

      LEFTMARGIN,7

      RIGHTMARGIN,222

      TOPMARGIN,7

      BOTTOMMARGIN,168

  END

  IDD DIALOG1,DIALOG

  BEGIN

      LEFTMARGIN,7

      RIGHTMARGIN,229

      TOPMARGIN,7

      BOTTOMMARGIN,222

  END

  IDD PP1,DIALOG

  BEGIN

      LEFTMARGIN,7

      RIGHTMARGIN,188

      TOPMARGIN,7

      BOTTOMMARGIN,120

  END

  IDD_PP2,DIALOG
				
				<dp n="d168"/>
BEGIN

  LEFTMARGIN,7

  RIGHTMARGIN,281

  TOPMARGIN,7

  BOTTOMMARGIN,139
END
IDD_PP3,DIALOG
BEGIN

  LEFTMARGIN,7

  RIGHTMARGIN,188

  TOPMARGIN,7

  BOTTOMMARGIN,120
END
IDD_PP4,DIALOG
BEGIN

  LEFTMARGIN,7

  RIGHTMARGIN,237

  TOPMARGIN,7

  BOTTOMMARGIN,152
END
IDD_PP5,DIALOG
BEGIN

  LEFTMARGIN,7

  RIGHTMARGIN,332

  TOPMARGIN,7

  BOTTOMMARGIN,155
END
IDD_PP6,DIALOG
BEGIN

  LEFTMARGIN,7

  RIGHTMARGIN,180

  TOPMARGIN,7

  BOTTOMMARGIN,155
END
IDD_PP7,DIALOG
BEGIN

  LEFTMARGIN,7

  RIGHTMARGIN,235

  TOPMARGIN,7

  BOTTOMMARGIN,155
END
IDD_PP8,DIALOG
BEGIN

  LEFTMARGIN,7

  RIGHTMARGIN,278

  TOPMARGIN,7

  BOTTOMMARGIN,157
END
IDD_PP9,DIALOG
BEGIN

  LEFTMARGIN,7

  RIGHTMARGIN,237

  TOPMARGIN,7

  BOTTOMMARGIN,157
END
IDD_DIALOG2,DIALOG
BEGIN

  LEFTMARGIN,7

  RIGHTMARGIN,168

  TOPMARGIN,7

  BOTTOMMARGIN,59
END
IDD_DIALOG3,DIALOG
				
				<dp n="d169"/>
  BEGIN

        LEFTMARGIN,7

        RIGHTMARGIN,179

        TOPMARGIN,7

        BOTTOMMARGIN.125

  END

  IDD_DIALOG4.DIALOG

  BEGIN

        LEFTMARGIN,7

        RIGHTMARGIN,179

        TOPMARGIN,7

        BOTTOMMARGIN,114

  END

  IDD_PP10,DIALOG

  BEGIN

        LEFTMARGIN,7

        RIGHTMARGIN,180

        TOPMARGIN,7

        BOTTOMMARGIN,155

  END

  IDD_PP11,DIALOG

  BEGIN

        LEFTMARGIN,7

        RIGHTMARGIN,237

        TOPMARGIN,7

        BOTTOMMARGIN,152

  END
END
#endif    // APSTUDIO_INVOKED
/////////////////////////////////////////////////////////////////////////////
//
// Menu
//
IDR_ENU1 MENU DISCARDABLE
BEGIN

  POPUP"File"

  BEGIN

      MENUITEM"Open",                  ID_MENUITEM32771

      MENUITEM"Save",                  ID_MENUITEM32772

      MENUITEM"Export Param File",     ID_FILE_EXPORTPARAMFILE

  END
END
/////////////////////////////////////////////////////////////////////////////
//
// String Table
//
STRINGTABLE DISCARDABLE
BEGIN

  IDS_ABOUTBOX    "&amp;About KOJ′s Amazing Town Crier..."
END
#endif    // English(U.S.)resources
/////////////////////////////////////////////////////////////////////////////
#ifndef APSTUDIO_INVOKED
/////////////////////////////////////////////////////////////////////////////
//
// Generated from the TEXTINCLUDE 3 resource.
//
#define _AFX_NO_SPLITTER_RESOURCES
#define _AFX_NO_OLE_RESOURCES
				
				<dp n="d170"/>
#define _AFX_NO_TRACKER_RESOURCES
#define _AFX_NO_PROPERTY_RESOURCES
#if  !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU)
#ifdef _WIN32
LANGUAGE 9,1
#pragma code_page(1252)
#endif
#include"res\sa.rc2"  // non-Microsoft Visual C++ edited resources
#include"afxres.rc"   // Standard components
#endif
/////////////////////////////////////////////////////////////////////////////
#endif    //  not APSTUDIO_INVOKED
				
				<dp n="d171"/>
      opt    cc,cex,cre,loc,so,mu,mex
  DEFINE          FAST    ′1′

  DEFINE          M56362  ′1′
TABLE_COUNTER   EQU 10
RUN_COUNTER     EQU 10
INIT_COUNTER    EQU 10

  org y(10):$100

  org p(10):$980
; **********************************************************
; **********************************************************

   SECTION    SUPER
; **********************************************************
; **********************************************************
; ------------------------------------------------------------
;  HDCD detect and expand code
; ------------------------------------------------------------

        include ′detect,asm′

        include ′expgain,asm′
; **************************************************************************
;    Adopted from Motorola sample code.
;
; **************************************************************************

                page    132,60

                include ′ioequ.asm′

                include ′vectors.asm′
;                include ′mbiquad.asm′

                include ′mpeq.asm′

                include ′mshelv.asm′

                include ′mhipass.asm′

                include ′mlopass.asm′

                include ′allpass.asm′

                list
CONFIGURE_SPI     MACRO
;  move    #0,x0
;  move    x0,x:M_HSAR         ;clear I2C address

  ;M_HCKR

  ;bits 13:12 HFM1:0 noise filter setting (off)

  ;bit 1 CPOL

  ;bit 0 CPHA

  ;

  ;00 xxxx xxxx xx01
;  move    #1,x0
;  move    #0,x0
;  move    x0,X;M_HCKR
;  commented out code should yeild a value ot 0 ror M_HCKR.

  ;M_HCSR

  ;bit 13:12 HCSR HRIE

  ;bit 11 HCSR HTIE

  ;bit 10 HCSR HBIE

  ;bit 9 HCSR Idle(no care)

  ;bit 8:7 HRQE Host-request enable(asserted if ready to receive)

  ;bit 6 HMST Master mode(disabled)

  ;bit 5 HFIFO FIFO control(disabled)

  ;bit 4 HCKFR Clock freeze(off)

  ;bit 3:2 HM1:0 24 bit mode

  ;bit 1 HI2C Enables I2C mode

  ;bit 0 HEN Enable port
				
				<dp n="d172"/>
  ;

  ;xx01  0010  000x 1001

  move     #$1209,x0

  move     x0,X:M_HCSR
  ;Get  command to known value

  move     #SPITXDEF,x0

  move     x0,x:spixmit
;  movep    x:spixmit,x:M_HTX

  ENDM
CONFIGURE_I2C   MACRO

  :turn off port

  move    #0,x0

  move    x0,X:M_HCSR

  ;leave address alone
;  move    #0,x0
;  move    x0,X:M_HSAR               ;clear I2C address
;  commented out code should yeild a value of 0 for M_HCKR.

  ;M_HCKR

  ;bits 13:12 HFM1:0 noise filter setting on

  ;

  ;11 xxxx xxxx xx00

  move    #>$3000,x0

  move    x0,X;M_HCKR
  ;M_HCSR

  ;bit 13:12 HCSR HRIE

  ;bit 11 HCSR HTIE

  ;bit 10 HCSR HBIE

  ;bit 9 HCSR Idle(no care)

  ;bit 8:7 HRQE Most-request enable(asserted if ready to receive)

  ;bit 6 HMST Master mode(disabled)

  ;bit 5 HFIFO FIFO control(disabled)

  ;bit 4 HCKFR Clock freeze(off)

  ;bit 3:2 HM1:0 24 bit mode

  ;bit 1 HI2C Enables I2C mode

  ;bit 0 HEN Enable port

  ;

  ;xx01 1100 101x 1010

  move    #$1CAA,x0

  move    x0,X:M_HCSR

  ;set command to known value

  move    #0,x0

  move    x0,x:spixmit
;  movep   x:spixmit,x:M_HTX

  ENDM

  XDEF         fcontrol

  XREF         HDCD_DETECT_INIT,HDCD_DETECT,1sbcntl

  XREF         1temp,rtemp

  XREF         dcontrol

  XREF         HDCD_GAIN_INIT,HDCD_DYNAMICS

  XREF         detect

  XREF         rmodel,bitcntl
SPITXDEF     equ     $444444

       org     xi:
DRX_BUFF_BASE    ds  2
ARX_BUFF_BASE    ds  2
TX_BUFF_BASE     ds  4                   ;unprocessed followed by processed data
;RX_PTR     ds  1
TX_PTR       ds  1
				
				<dp n="d173"/>
flags        ds     1
scnt        ds     1
RightReccive       equ    0
SPIReceivc         equ    1
SPIOverrun         equ    2
SPIFIFOFull        equ    3
SPIUnderrun        equ    4
SPITransmit        equ    5
SPIStateBit        equ    6
spixmit     ds     1
spirecv     ds     1
shisaveA1   ds     1
shisaveX0   ds     1
shisaveR4   ds     1
shisaveN4   ds     1
NADA        ds     1
left        ds     1
right       ds     1
fcontrol    ds     1
indexData   ds     1
dpleft      ds     1
dpright     ds     1
stack       ds     20
;interleaved delay line
;independently located

  prg x(20):$200
DELAYLEN    EQU128                            ;2.9mS delay line
sdelayleft     dsm DELAYLEN                   ;left
sdelayright    dsm DELAYLEN                   ;right

  org yi:
YNADA       ds     1
volume      ds     1
prefader    ds     1
bypass      ds     1
hdcdbp      ds     1
gainscalebp ds     1
ddxcompbp   ds     1
analogin    ds     1
avolume     ds     1
bypassmask  ds     1
BYPASS_NOTCH1    EQU    0
BYPASS_NOTCH2    EQU    1
BYPASS_NOTCH3    EQU    2
BYPASS_NOTCH4    EQU    3
BYPASS_HIPASS    EQU    4
BYPASS_LOPASS    EQU    5
BYPASS_LOSHELV   EQU    6
BYPASS_HISHELV   EQU    7
BYPASS_CONECRY   EQU    8
BYPASS_ALLPASS   EQU    9
BYPASS_DBNOTCH   EQU    10
BYPASS_NLOPASS   EQU    11
delayval         ds     1
; *********************************************
;   EQ/filter declarations
; *********************************************
;smiley face shelf EQ

  ;left channel

  DECLARE_LSH 1L,1.,-0.867

  DECLARE_HSH 2L,1.,-0.867

  ;right channel

  DECLARE_LSH 1R,1.,-0.867

  DECLARE_HSH 2R,1.,-0.867
;resonance compensation PEQ
				
				<dp n="d174"/>
  ;left channel    

  DECLARE_PEQ 1L,1.,-0.9510565,0.7265425

  DECURE_PEQ 2L,1.,-0.91,0.5

  DECLARE_PEQ 6L,1.,-0.9510565,0.7265425

  DECLARE_PEQ 7L,1,-0.91,0.5

  ;riqht channel

  DECLARE_PEQ 1R,1.,-0.91,0.5

  DECLARE_PEQ 2R,1.,-0.91,0.5

  DECLARE_PEQ 6R,1.,-0.9510565,0.7265425

  DECLARE_PEQ 7R,1.,-0.91,0.5
;standing wave rejection PEQ

  ;left channel

  DECLARE_PEQ 3L,1.,-0.9999803,0.9937365

  DECLARE_PEQ 4L,1,,-0.91,0.5

  DECLARE_PEQ 5L,1.,-0.91,0.5

  ;right channel

  DECLARE_PEQ 3R,1.,-0.9999803,0.9937365

  DECLARE_PEQ4R,1.,-0.91,0.5

  DECLARE_PEQ 5R,1.,-0.91,0.5
;hi and lo pass filters

  ;left

  DECLARE_HP  hpleft,0.0099733,0.25,0.9987285           ;70 Hz

  DECLARE_LP  lpleft,1.1921856,0.6303886,1.4112871      ;14000 Hz/q=0.22

  ;right

  DECLARE_HP  hpright,0.0099733,0.25,0.9987285          ;70 Hz

  DECLARE_LP  lpright,1.1921856,0.6303886,1.4112871     ;14000 Hz

  ;new lopass

  ;left

  DECLARE_LP  lpleft2,1.,0.,0.

  ;right

  DECLARE_LP  lpright2,1.,0.,0.
;allpass filters

  DECLRE_AP  apleft,-0.91,0.5

  DECLRE_AP  apright,-0.91,0.5
;Keith new notch with 2 gain around it.

  DECURE_PEQ NT1L,1.,-0.9999803,0.9937365

  DECLARE_PEQ NT2L,1.,-0.91,0.5

  DECLARE_PEQ NT3L,1.,-0.91,0.5

  0ECLARE_PEQ NT1R,1.,-0.9999803,0.9937365

  DECLARE_PEQ NT2R,1.,-0.91,0.5

  DECLARE_PEQ NT3R,1.,-0.91,0.5
;**************************************************************************

      org     p:$100
START
main

      ori     #$03,mr                     ;mask interrupts

      movep   #$05000B,X:M_PCTL          ;
      move    #0,omr                         , 

      movec   #0,sp                       ;reset hardware stack pointer

       movep   #$000003,x:M_IPRP         ;ESAI int′s enabled and top Priority

      movep   #$000007,x:M_IPRP          ;SHI (1) and ESAI (2) int′s enabled

      move    #stack,r6                   ;initialize stack pointer

      move    #-1,m6                      ;linear addressing

      move    #0,x0

      move    x0,x:DRX_BUFF_BASE

      move    x0,x:DRX_BUFF_BASE+1

      move    x0,x:ARX_BUFF_BASE
				
				<dp n="d175"/>
  move    x0,x:ARX_BUFF_BASE+1

  move    x0,x:TX_BUFF_BASE

  move    x0,x:TX_BUFF_BASE+1

  move    x0,x:TX_BUFF_BASE+2

  move    x0,x:TX_BUFF_BASE+3

  clr     a

  move    a,x:flags

  move    a,x;scnt

  ;HDCD decoder  initialize

  move    #>1,x0

  move    x0,x:fcontrol

  move    #>16,x0

  move    x0,x:lsbcntl

  jsr     HDCD_DETECT_INIT

  move    #>1,x0

  move    x0,x:dcontrol

  jsr     HDCD_GAIN_INIT

  move    #-1,m0

  move    #-1,m1

  move    #-1,m2

  move    #-1,m3

  move    #-1,m4

  move    #-1,m5

  move    #-1,m6

  move    #-1,m7

  ;set up volume and bypass switches

  ;output volume is set to zero sothat filter parameters can

  ;be downloaded,followed by volume being set

  move    &amp;>$800000,x0

  move    x0,y:volume

  move    x0,y:prefader

  move    x0,y:avolume

  move    #>$7FFFFF,x0

  move    x0,y:bypass

  move    #>$0,x0

  move    x0,y:hdcdbp

  move    x0,y:gainscalebp

  move    x0,y:ddxcompbp

  move    x0,y:analogin

  move    x0,y:bypassmask

  move    x0,y:delayval

  move    x0,x:indexData

  move    #>sdelayleft,x0

  move    x0,x:dpleft

  move    #>sdelayright,x0

  move    x0,x:dpright

  ;initialize EQ params

  INIT_PEQ_PARAM  1L

  INIT_PEQ_PARAM  1R

  INIT_PEQ_PARAM  2L

  INIT_PEQ_PARAM  2R

  INIT_PEQ_PARAM  3L

  INIT_PEQ_PARAM  3R

  INIT_PEQ_PARAM  4L

  INIT_PEQ_PARAM  4R

  INIT_PEQ_PARAM  5L

  INIT_PEQ_PARAM  5R

  INIT_PEQ_PARAM  6L

  INIT_PEQ_PARAM  6R

  INIT_PEQ_PARAM  7L

  INIT_PEQ_PARAM  7R

  INIT_PEQ_PARAM   NT1L

  INIT_PEQ_PARAM   NT2L

  INIT_PEQ_PARAM   NT3L
				
				<dp n="d176"/>
  INIT_PEQ_PARAM  NT1R

  INIT_PEQ_PARAM  NT2R    

  INIT_PEQ_PARAM  NT3R

  INIT_SH_PARAM   1L

  INIT_SH_PARAM   1R

  INIT_SH_PARAM   2L

  INIT_SH_PARAM   2R

  INIT_LP_PARAM   lpleft

  INIT_LP_PARAM   lpright

  INIT_LP2_PARAM  lpleft2

  INIT_LP2_PARAM  lpright2

  INIT_AP_PARAM   apleft

  INIT_AP_PARAM   apright

       ;hi-pass does not need initializing as all params are downloaded

       ;setup serial host interface

       ;;CONFIGURE_SPI

       CONFIGURE_I2C
;------------------------------------------------------------
; FST/FSR and SCKT/SCKR are generated from the PLD
; and fed to the DSP,A/D and D/A converters
;------------------------------------------------------------
;put esai in reset state.
;       IF  @DEF(′ANALOGIN′)==0

       movep   #$000000,x;M_PCRC    ; MLS 12/20/97

       movep   #$000000,x;M_PRRC    ; MLS 12/20/97
;       ENDIF

       movep   #$0c0200.x:M_TCCR

               ;FST is input                              (bit22=0)

                ;external clock source drives SCKT        (bit21=0)

                ;negative FST polarity                    (bit19=1)

                ;data &amp; FST clocked out on rising edge    (bit18=1)

                ;2 words per frame                        (bit13:9=00001)

       movep    #$0C0200.x:M_RCCR

                ;FSR is input                             (bit22=0)

                ;external clock source drives SCKR        (bit21=0)

                ;negative FSR polarity                    (bit19=1)

                ;data &amp; FSR clocked in on rising edge     (bit18=0)BAK(121997)

                ;2 words per frame                        (bit13:9=00001)

       movep    #$000000,x:M_SAICR
				
				<dp n="d177"/>
  movep    #Sd17D03,x:M_RCR

           ;Rx1,RX0 enabled                            (bit1:0=11)

           ;Rx2,RX3 disabled                           (bit3:2=00)

           ;reserved                                    (bit5:4=00)

           ;MSB shifted first                           (bit6=0)

           ;word left-aligned                           (bit7=0)

           ;network mode                                (bit9:8=01)

           ;32-bit slot length,24-bit word length      (bit14:10=11111)

           ;word-length frame sync                      (bit15=0)

           ;frame sync occurs 1 clock cycle earlier     (bit16=1)

           ;reserved                                    (bit19:17=000)

           ;RLIE,RIE,REIE enabled                     (bit23:20=0101)

           ;bit23 RLIE

           ;bit22 RIE

           ;bit21 REDIE

           ;bit20 REIE

  movep    #Sd13d00,x:M_TCR                                     ;MLS 12/20/97

           ;TX0,TX1 enabled                                     (bit3:0=0011)

           ;TX2,TX3,TX4,TX5 disabled                          (bit5:4=00)

           ;MSB shifted first                                    (bit6=0)

           ;word left-aligned                                    (bit7=0)

           ;network mode                                         (bit9:8=01)

           ;32-bit slot length,24-bit word length               (bit14:10=11111)

           ;word length frame sync                               (bit15=0)

           ;frame sync occurs 1 clock cycle earlier              (bit16=0 )

           ;reserved                                             (bit19:17=000)

           ;TLIE,TIE,TEIE enabled                              (bit23:20=0101)

           ;bit23 TLIE.

           ;bit22 TIE

           ;bit21 TEDIE

           ;bit20 TEIE

   movep    #$000edb,x:M_PCRC    ;MLS 12/20/97

   movep    #$000edb,x:M_PRRC    ;MLS 12/20/97

   movep    #$ffffff,x:M_RSMA    ;MLS 12/20/97

   movep    #$ffffff,x:M_RSMB    ;MLS 12/20/97

   movep    #$000003,x:M_TSMA

   movep    #$000003,x:M_TSMB

   movep    #$000000,x:M_TX0     ;zero out transmitter 0

   movep    #$000000,x:M_TX1     ;zero out transmitter 1

   movep    #$000000,x:M_TX2     ;zero out transmitter 2

   movep    #$000000,x:M_TX3     ;zero out transmitter 3

   bset     #0,x:M_TCR           ;now enable TX0

   bset     #1,x:M_TCR           ;now enable TX1

   bset     #2,x:M_TCR           ;now enable TX2

   bset     #3,x:M_TCR           ;now enable TX3

   bset     #2,x:M_RCR           ;RE2 and TE3 must be set to enable

                                   ;TX3 and disable RX2

                                   ;turn on serial host interface

   bset     #0,X:M_HCSR

   andi     #$FC,mr               ;enable all interrupt levels

                                   ;clear scaling bits

   bclr     #RightReceive,X:flags
;   jclr     #RightReceive,X:flags,*
;   bclr     #RightReceive,X:flags
;   jclr     #RightReceive,X:flags,*
;   move     #>RX_BUFF_BASE,x0
;   move     x0,x:RX_PTR
;   move     #>TX_BUFF_BASE,x0
;   move     x0,x:TX_PTR
;------------------------------------------------------------
;Main loop
;------------------------------------------------------------
LOOP
				
				<dp n="d178"/>
jclr    #RightReceive,x:flags,*
bclr    #RightReceive,x:flags
btst    #22,y:analogin
.IF    <CC>

  move    x:DRX_BUFF_BASE,x0        ;receive left

  move    x:DRX_BUFF_BASE+1,x1      ;receive right
.ELSE

  move    x:ARX_BUFF_BASE,x0        ;receive left

  move    x:ARX_BUFF_BASE+1,x1      ;receive right
.ENDI
;store unprocessed(with volume)output first
move    y:avolume,y0
mpyr    y0,x0,a
mpyr    y0,x1,b
;MM 5/20/99 Swapped channels
tfr     x0,a   a,x:TX_BUFF_BASE+2    ;transmit left
tfr     x1,b   b,x:TX_BUFF_BASE      ;transmit right
;write input into delay line
move    #DELAYLEN-1,m0
move    #DELAYLEN-1,m1
move    x:dpleft,r0
move    x:dpright,r1
move    y:delayval,y0
move    #>DELAYLEN,x0
mpy     x0,y0,a    a,x:(r0)-
move                 b,x:(r1)-
move    a,n0
move    a,n1
move                 x:(r0+n0),a
move                 x:(r1+n1),b
move    #-1,m0
move    #-1,m1
move    r0,x:dpleft
move    r1,x:dpright
JSR     STEREO_PROCESS
;MM 5/20/99 Swapped channels
move    b,x:TX_BUFF_BASE+1      ;transmit left
move    a,x:TX_BUFF_BASE+3      ;transmit right
move    #>1,x0
move    x:scnt,a
add     x0,a
move    a1,x:scnt               ;don′t saturate
jmp     LOOP
;------------------------------------------------------------
; Subroutines
;------------------------------------------------------------
STEREO_PROCESS

      move          a,x:left

     move          b,x:right

     ;copy parameters from left channel EQs to right channel EQs

     COPY_SH_PARAM   1L,1R

     COPY_SH_PARAM   2L,2R

     COPY_PEQ_PARAM  1L,1R

     COPY_PEQ_PARAM  2L,2R

     COPY_PEQ_PARAM  3L,3R

     COPY_PEQ_PARAM  4L,4R

     COPY_PEQ_PARAM  5L,5R

     COPY_PEQ_PARAM  6L,6R

     COPY_PEQ_PARAM  7L,7R
				
				<dp n="d179"/>
       COPY_PEQ_PARAM  NT1L,NT1R

       COPY_PEQ_PARAM  NT2L,NT2R

       COPY_PEQ_PARAM  NT3L,NT3R

       COPY_HP_PARAM   hpleft,hpright

       COPY_LP_PARAM   lpleft,lpright

       COPY_LP_PARAM   lpleft2,lpright2

       COPY_AP_PARAM   apleft,apright

       ;HDCD processing

       jset        #22,y:hdcdbp,doeq

       move        x:left,a

       move        x:right,b

       move        a,x;ltemp

       move        b,x:rtemp

       clr b

       move        #>1,x0

       move        y:gainscalebp,a

       tst         a

       teq         x0,b

       move        b1,x:dcontrol

       jsr         HDCD_DETECT

       ;destroy code

       move        #>3,x0

       move        x:rmodel,a

       cmp         x0,a

       bne         skip_code_dest

       move        #>8,x0

       move        x:bitcntl,a

       cmp         x0,a

       bne         skip_code_dest

       move        x:ltemp,a

       eor         #>$000100,a

       move        a,x:ltemp

       move        a,x:left
skip_code_dest:

      move         #-1,m0

      move         #-1,m4

      move         #4,n4

      jsr          HDCD_DYNAMICS

       move        x:ltemp,a

       move        x:rtemp,b

       btst        #22,y:hdcdbp

       .IF     <CC>

           move        a,x:left

           move        b,x:right

           move   x:detect,x0

           move   x0,x:spixmit

       .ELSE

           move   #0,x0

           move   x0,x:spixmit

       .ENDI
;       jmp        doeq1
;doeq:
;
;       move       # 0,x0
;       move       x0,x:spixmit
doeq1:

       jset       #22,y:bypass,dopostvol

       move       x:left,x1
				
				<dp n="d180"/>
       move           x:right,y1

       move      y:prefader,x0

       mpyr      -x0,x1,a

       mpyr      -x0,y1,b

       tfr       a,b      b,x:right

       ;smiley face

       jset    #BYPASS_LOSHELV,y:bypassmask,_skiplsl

       LSH 1L
_skiplsl

       jset    #BYPASS_HISHELV,y:bypassmask,_skiphsl

       HSH 2L
_skiphsl

       ;cut-off response

       jset    #BYPASS_HIPASS,y:bypassmask,_skiphpl

       HP hpleft
_skiphpl

       jset   #BYPASS_LOPASS,y:bypassmask,_skiplp1

       LP lpleft
_skiplp1

       jset   #BYPASS_NLOPASS,y:bypassmask,_skiplp2l

       LP  lpleft2
_skiplp2l

        ;resonance EQ

        jset    #BYPASS_NOTCH1,y:bypassmask,_skip1l

        PEQ 1L
_skip1l    
_         jset    #BYPASS_NOTCH2,y:bypassmask,_skip2l

        PEQ 2L
_skip2l

        jset    #BYPASS_NOTCH3,y:bypassmask,_skip3l

        PEQ 6L
_skip3l

        jset    #BYPASS_NOTCH4,y:bypassmask,_skip4l

        PEQ 7L
_skip4l

        ;cone-cry 

        jset    #BYPASS CONECRY,y:bypassmask,_skipccl

        PEQ 5L

        PEQ 3L

        PEQ 4L
_skipccl

        ;double-tuned notch

        jset    #BYPASS_DBNOTCH,y:bypassmask,_skipdbnl

        PEQ NT1L

        PEQ NT2L

        PEQ NT3L 
_skipdbnl

        ;all-pass

        jset    #BYPASS_ALLPASS,y:bypassmask,_skipapl

        AP  apleft
_skipapl

        move    b,x:left

        move    x:right,b

        ;  smiley face

        jset      #BYPASS_LOSHELV,y:bypassmask,_sklpisr

        LSH 1R
_skiplsr

        jset      #BYPASS_HISHELV,y:bypassmask,_skiphsr

        HSH 2R
_skiphsr

        ;cut-off response

        jset    #ByPASS_HIPASS,y:bypassmask ,_skiphpr

        HP  hpright
_skiphpr

        jset  #BYPASS_LOPASS,y:bypassmask,_skiplpr

        LP  lpright
_skiplpr

        jset  #BYPASS_NLOPASS,y:bypassmask,_skiplp2r
				
				<dp n="d181"/>
        LP  lpright2
_skiplp2r

       ;resonance EQ

       jset    #BYPASS_NOTCH1,y:bypassmask,_skip1r

       PEQ 1R
_skip1r

       jset     #BYPASS_NOTCH2,y:bypass mask,_skip2r

       PEQ 2R
_skip2r

       jset     #BYPASS_NOTCH3,y:bypassmask,_skip3r

       PEQ 6R
_skip3r  jset     #BYPASS_NOTCH4,y:bypassmask,_skip4r

       PEQ 7R
_skip4r

       ;cone-cry

       jset    #BYPASS_CONECRY,y:bypassmask,_skipccr

       PEQ 5R

       PEQ 3R

       PEQ 4R
_skipccr; 

       ;double-tuned notch    

       jset    #BYPASS_DBNOTCH,y:bypassmask,_skipdbnr

       PEQ NT1R

       PEQ NT2R

       PEQ NT3R
_skipdbnr     
       ; all-pass

       jset     #BYPASS_ALLPASS,y:bypassmask,_skipapr

       AP  apright
_skipapr

       move  b,x:right
dopostvol:
plainvol:

       move    y:volume,y0

       move    x:left,x0

       move    x:right,xl

       mpyr    -x0,y0,a

       mpyr    -x1,y0,b

       rts
				
				<dp n="d182"/>
org xi:
org yi:
org p:
;------------------------------------------------------------
; SHI  interrupts    
:-----------------------------------------------------------
;   ; ---- SHI/I2C receive ISR
shi_rx_isr

      move      a1,x:shisaveA1

      move      x0,x:shisaveX0

      move      r4,x:shisaveR4

      move      n4,x:shisaveN4

      movep     x:M_HRX,a1

      jset      #SPIStateBit,x:flags,_gotData

      ;got index

      move    a1,x:indexData

      bset    #SPIStateBit,x:flags

      jmp     _exitInt

      ;got data
_gotData:

      move    x:indexData.n4

      move    #pptrs.r4
				
				<dp n="d183"/>
       bclr    #SPIstateBit.x:flags

       movem   p:(r4+n4),r4

       move    a1,y:(r4)
_exitInt:

       move    x:shisaveA1,a1

       move    x:shisaveX0,x0

       move    x:shisaveR4,r4

       move    x:shisaveN4,n4

       rti

  ;----  SHI/I2C receive overrun error
shi_rxe_isr

      movep    x:M_HCSR,x:NADA

      movep    x:M_HRX,x:NADA

      bset     #SPIOverrun,x:flags

      bclr     #SPIStateBit,x:flags

      rti
   :   SHI Receive FIFO Full
shi_rxf_isr

      movep    x:M_HCSR,x:NADA

      movep    x:M_HRX,x:NADA

      bset     #SPIFIFOFull,x:flags

      bclr     #SPIStateBit,x:flags

      rti
   ;   SHI Transmit Data
shi_txu_isr      ;SHI Transmit Underrun Error

      bset     #SPIUnderrun,x:flags

      movep    x:M_HCSR,x:NADA

      movep    x:spixmit,x:M_HTX

      bclr    #SPIStateBit,x:flags

      rti
shi_tx_isr:

      movep   x:spixmit,x:M_HTX

      bset    #SPITransmit,x:flags

      rti

      ;SHI Bus Error
shi_bus_error:
;       movep   x:M_HCSR,x:NADA
;       bset    #SPIReceive+4,x:flags

       ;reset shi

       bclr    #0,x:M_HCSR

       nop

       nop

       bset    #0,x:M_HCSR

       bclr    #SPIStateBit,x:flags

       nop

       rti
;------------------------------------------------------------
; Subroutines
;-----------------------------------------------------------
;            include′isr_dig.asm′
;------------------------------------------------------------
;            Interrupt Service Routines
;------------------------------------------------------------
esai_txe_isr                                 ;ESAI TRANSMIT ISR

      bclr  #14,x:M_SAISR                ;Read SAISR to clear transmit

                                           ;underrun error flag
esai_tx_isr

      jset  #13,x:M_SAISR,TxLeftSlot

      movep x:TX_BUFF_BASE+2,x:M_TX1    ;write unprocessed data

      movep x:TX_BUFF_BASE+3,x:M_TX0

      movep x:TX_BUFF_BASE+3,x:M_TX2
				
				<dp n="d184"/>
          movep    x:TX_BUFF_BASE+3,x:M_TX3

          rti

  TxLeftSlot

          movep    x:TX_BUFF_BASE,x:M_TX1       ;write unprocessed data

          movep    x:TX_BUFF_BASE+1,x:M_TX0

          movep    x:TX_BUFF_BASE+1,x:M_TX2

          movep    x:TX_BUFF_BASE+1,x:M_TX3

          rti

  esai_txls_isr                                    ;ESAI TRANSMIT LAST SLOT ISR

  ;       move    r0,x:(r6)+                    ;Save r0 to the stack

  ;       move    #TX_BUFF_BASE,r0               ;Reset pointer

  ;       move    r0,x:TX_PTR                   ;Reset tx buffer pointer just in

  ;                                               ;case it was corrupted

  ;       move    x:-(r6),r0                    ;Restore r0

           rti       
esai_rxe_isr                                         ;ESAI RECEIVE ISR

      bclr         #7,x:M_SAISR                  ;Read SAISR to clear receive
  overrun error flag

                                                   ;overrun error flag
esai_rx_isr

      jset         #$6,x:M_SAISR,LeftSlot

      bset         #RightReceive,x:flags  ;if right channel data then set flag

      movep        x:M_RX0,x:ARX_BUFF_BASE+1

      movep        x:M_RX1,x:DRX_BUFF_BASE+1

      rti
LeftSlot

      movep        x:M_RX0,x:ARX_BUFF_BASE

      movep        x:M_RX1,x:DRX_BUFF_BASE

      rti
esai_rxls_isr                                  ;ESAI RECEIVE LAST SLOT ISR
;    move    r0,x;(r6)+                     ;Save r0 to the stack
;   move    #RX_BUFF_BASE,r0                 ;Reset rx buffer pointer just in

                                             ;case it was corrupted
;    move    r0,x;RX_PTR                    ;Update rx buffer pointer
;    move    x:-(r6),r0                     ;Restore r0

   rti
; variable look up table
pptrs

  dc   volume

  dc   sh_gamma_1L

  dc   sh_k_1L

  dc   sh_gamma_2L

  dc   sh_k_2L

  dc   peq_gamma_1L

  dc   peq_beta_1L

  dc   peq_k_1L

  dc   peq_gamma_2L

  dc   peq_beta_2L

  dc   peq_k_2L

  dc   peq_gamma_3L

  dc   peq_beta_3L

  dc   peq_k_3L

  dc   peq_gamma_4L

  dc   peq_beta_4L

  dc   peq_k_4L

  dc   peq_gamma_5L

  dc   peq_beta_5L

  dc   peq_k_5L

  dc   prefader

  dc   bypass

  dc   hp_scale_hpleft

  dc   hp_fc_hpleft

  dc   hp_qc_hpleft
				
				<dp n="d185"/>
  dc    lp_scale_lpleft

  dc    lp_a2_lplefc

  dc    lp_a1_lpleft

  dc    hdcdbp

  dc    gainscalebp

  dc    ddxcompbp

  dc    peq_gamma_6L

  dc    peq_beta_6L

  dc    peq_k_6L

  dc    peq_gamma_7L

  dc    peq_beta_7L

  dc    peq_k_7L

  dc    analogin

  dc    avolume

  dc    bypassmask

  dc    delayval

  dc    ap_gamma_apleft

  dc    ap_beta_apleft

  dc    lp_scale_lpleft2

  dc    lp_a2_lpleft2

  dc    lp_a1_lpleft2
;  dc    lp_b2_lpleft2
;  dc    lp_b1_lpleft2

  dc    peq_gamma_NT1L

  dc    peq_beta_NT1L

  dc    peq_k_NT1L

  dc    peq_gamma_NT2L

  dc    peq_beta_NT2L

  dc    peq_k_NT2L

  dc    peq_gamma_NT3L

  dc    peq_beta_NT3L

  dc    peq_k_NT3L

  dc    YNADA

  dc    YNADA

  dc    YNADA

        ENDSEC

        end
				
				<dp n="d186"/>
SH_SCALE_FACTOR EQU 3    
SH_SCALE_DIVIDE EQU (1<<SH_SCALE_FACTOR)
;
;  k is gain
;      k=0      =>lo/hi pass filter
;      0<k<1   =>cut
;      k=1      =>pass-thru
;      k>1      =>boost
;
;  gamma drives critical frequency
;
;
DECLARE_LSH_MACRO    name,k,gamma

  org xi;
sh_x_\name         dc  0              ;x(n-1)
sh_y_\name         dc  0              ;y(n-1)

  org yi:
sh_gamma_\name     dc  gamma
sh_minus_one_\name dc  -1,0
sh_k\name          dc  k/SH_SCALE_DIVIDE
sh_1_\name         dc  1./SH_SCALE_DIVIDE

  ENDM        
DECLARE_HSH MACRO    name,k,gamma

  DECLARE_LSH name,k,gamma

  ENDM
COPY_SH_PARAM   MACRO    from,to

  move    y:sh_gamma_\from,x0

  move    x0,y:sh_gamma_\to

  move    y:sh_k_\from,x0

  move    x0,y:sh_k_\to

  ENDM
INIT_SH_PARAM    MACRO    name

  move    #>(-1,0),x0

  move    x0,y:sh_minus_one_\name

  move    #>(1./SH_SCALE_DIVIDE),x0

  move    x0,y:sh_k_\name

  move    x0,y:sh_1_\name

  ENDM
;
;    input data is in x0
;    input is scaled by 0.5 to prevent internal clipping in the all-pass
;
;    computes all-pass:
;
;    y(n)=-gamma*x(n)-x(n-1)-gamma*y(n-1)(lo-shelv)
;    y(n)=gamma*x(n)+x(n-1)-gamma*y(n-1)(hi-shelv)
;
;    all-pass output is scaled by gain:
;
;    output=((1+k)/2)*x(n)+((1-k)/2)*y(n)
;
;    assumes:
;        m0,m4,m5=-1
;
;
				
				<dp n="d187"/>
LSH MACRO          name    

  asr     b                 #sh_gamma_\name,r4

  rnd     b                 #sh x\name,r0

  move                      b,x0             y:(r4)+,y0

  ;compute y(n) 

  mpy     -x0,y0,b        x:(r0)+,x1      y:(r4)+,y1

  mac     x1,y1,b         x:(r0)-,x1

  macr    -y0,x1,b        x0,x:(r0)+      y:(r4)+,y0

  ;all-pass output in b,now scale by gain/cut factor

  mpy     x0,y0,b         b,x:(r0)-       b,y1

  mac    -y1,y0,b                           y:(r4)+,y0

  mac    x0,y0,b

  mac    y1,y0,b

  ;now scale output to get real result

  asl     #(SH SCALE FACTOR),b,b

  rnd     b

  ENDM
HSH MACRO          name

  asr    b               #sh_gamma_\name,r4

  rnd    b               #sh x\name,r0

  move                   b,x0              y:(r4)+,y0

  ;compute y(n)
  mpy    x0,y0,b       x:(r0)+,x1       y:(r4)+,y1

  mac    -x1,y1,b      x:(r0)-,x1

  macr   -y0,x1,b      x0,x:(r0)+       y:(r4)+,y0

  ;all-pass output in b,now scale by gain/cut factor

  mpy    x0,y0,b       b,x:(r0)-        b,y1

  mac    -y1,y0,b                         y:(r4)+,y0

  mac    x0,y0,b

  mac    y1,y0,b

  ;now scale output to get real result

  asl    #(SH SCALE FACTOR),b,b    

  rnd    b

  ENDM
				
				<dp n="d188"/>
  PEQ_SCALE_FACTQR    EQU 3
  PEQ_SCALE_DIVIDE    EQU(1<<PEQ_SCALE_FACTOR)
  ;
  ;  k is gain
  ;      k=0        => notch filter
  ;      0<k<1     =>cut
  ;      k=1        =>pass-thru
  ;      k>1        =>boost
  ;
  ;  gamma drives critical frequency
  ;
  ;  beta defines Q
  ;
  DECLARE_PEQ MACRO       name,k,gamma,beta

  org xi:
  peq_y_\name         dc  0

                    dc  0
  pe_q_x_\name        dc  0

                    dc  0

  org yi:
  peq_gammma_\name    dc  gamma
  peq_beta_\name      dc  beta
  peq_k_\name         dc  k/PEQ_SCALE_DIVIDE
  peq_1_\name         dc  1./PEQ_SCAE_DIVIDE
  peq_v_\name         dc  0
  peq_w_\name         dc  0

    ENDM
  COPY_PEQ_PARAM  MACRO    from,to

    move    y:peq_gamma_\from,x0

    move    x0,y:peq_gamma_\to

    move    y:peq_beta_\from,x0

    move    x0,y:peq_beta_\to

    move    y:peq_k_\from,x0

    move    x0,y:peq_k_\to

    ENDM
  INIT_PEQ_PARAM  MACRO    name

  move      #>(1./PEQ_SCALE_DIVIDE),x0

  move      x0,y:peq_k_\name

  move      x0,y:peq_1_\name

  ENDM
;      input data is in b
;      input is scaled by 0.5 to prevent  internal clipping  in the all-pass
;
;      computes all-pass:
;      v(n) = gamma *y(n-1)+y(n-2)-gamma*v(n-1)
;      w(n)=gamma*x(n-1)+x(n-2)-gamma*w(n-1)
;      y(n)=w(n)+beta*x(n)-beta*v(n)
;
;      all-pass output is scaled by gain:
;
;      output=((1+k)/2)*x(n)+((1-k)/2)*y(n)
;      assumes:
;         m0,m4,m5=-1
;
;
				
				<dp n="d189"/>
  PEQ MACRO      name    

    asr    b        #peq_y_\name,r0

    move            #peq_gamma_\name,r4

    move            #peq_v_\name,r5

    move                    b,x0

    move                    x:(r0)+,a     y:(r4)+,y0

    move                    x:(r0)+,x1    y:(r5)+,y1

    ;compute v(n)

    mac     x1,y0,a       x:(r0)+,b

    mac     -y1,y0,a      x:(r0),x1     y:(r5),y1

    ;compute w(n),v(n)is now in a    

    mac     x1,y0,b       a,x1           a,y:(r5)+

    mac     -y1,y0,b      x:(r0),a      y:(r4)+,y0

    ;compute y(n),w(n)is now in b

    mac     -x1,y0,b      x0,x:(r0)-    b,y:(r5)-

    mac     x0,y0,b       a,x:(r0)-     y:(r4)+,y0

    ;all-pass output in b,now scale by gain/cut factor

    mpy     x0,y0,b       x:(r0)-,a     b,y1

    mac     -y1,y0,b                      y:(r4)+,y0

    mac     x0,y0,b       a,x:(r0)+

    mac     y1,y0,b       y1,x:(r0)-

    ;now scale output to get real result

    asl     #(PEQ_SCALE_FACTOR),b,b

    rnd     b

    ENDM
				
				<dp n="d190"/>
LP_SCALE_FACTOR EQU 6
LP_SCALE_DIVIDE EQU(1<<LP_SCALE_FACTOR)
;
;
:    modified chamberlin lo-pass(both x(n)and x(n-1))
;
;        q also defines gain  
;        input is scaled to avoid internal clipping
;
;    f=2*sin(w/2)   f only valid when less than 1.
;
;    0<q<1
;
;   implemented as a direct form biquad with coefficients and data scaled.
;   needs headroom for gain
;
DECLARE_LP MACRO         name,ca1,ca2,cb

  org xi:
lp_w_\name           ds  2

  org yi:
lp_scale_\name       dc  cb/16.
lp_a2_\name          dc  ca2/2.
lp_a1_\name          dc  ca1/2.
lp_b2_\name          dc  0.0
lp_b1_\name          dc  1.0/2.

  ENDM
COPY_LP_PARAM  MACRO    from,to

  move    y:lp_scale_\from,x0

  move    x0,y:lp_scale_\to

  move    y:lp_a2_\from,x0

  move    x0,y:lp_a2_\to

  move    y:lp_a1_\from,x0

  move    x0,y:lp_al_\to

  move    y:lp_b2_\from,x0

  move    x0,y:lp_b2_\to

  move    y:lp_b1_\from,x0

  move    x0,y:lp_b1_\to

  ENDM
INIT_LP_PARAM    MACRO          name

  move    #0,x0

  move    x0,y:lp_b2_\name

  move    x0,y:lp_a2_\name

  move    x0,y:lp_a1_\name

  move    x0,y:lp_b1_\name

  move    #>(1./16.),x0

  move    x0,y :lp_scale_\name

  ENDM
INIT_LP2_PARAM MACRO      name

  move    #0,x0

  move    x0,y:lp_a2_\name

  move    x0,y:lp_a1_\name

  move    #>0.5,x0

  move    x0,y:lp_b2_\name

  move    #>1.,x0

  move    x0,y:lp_b1_\name
				
				<dp n="d191"/>
  move    #>(0 25/16.),x0

  move    x0,y:1p_scale_\name

  ENDM
;
;    assumes:
;        m0,m4,m5=-1
;
;
LP MACRO       name

  move    b,x0

  ori    #8,mr

  move    #lp_scale_\name,r4

  move    #lp_w_\name,r0

  move                                  y:(r4)+,y0    ;x0=x(n),y0=0.5

  mpy     x0,y0,b     x:(r0)+,x0    y:(r4)+,y0    ;x0=w(n-2),y0=a2

  mac     -x0,y0,b    x:(r0)-,x1    y:(r4)+,y0    ;x1=W(n-1),y0=a1

  macr    -x1,y0,b    x1,x:(r0)+    y:(r4)+,y0    ;w(n-2)= w(n-1),y0=b2

  mac     x0,y0,b     b,x:(r0)-     y:(r4)+,y0    ;w(n-1)= a,y0=b1

  macr    x1,y0,b

  andi    #SF7,mr

  asl    #4,b,b

  ENDM
				
				<dp n="d192"/>
HP_SCALE_FACTOR EQU 6
HP_SCALE_DIVIDEEQU  (1<<HP_SCALE_FACTOR)
;
;
;    chamberlin hi-pass(from lopass)
;
;        q also defines gain
;        input is scaled to avoid internal clipping
;
;    f=2*sin(w/2)   f only valid when less than 1.
;
;    0<q<1
;
;    implemented as a direct form biquad with coefficients and data scaled.
;    needs headroom for gain
;
DECLARE_HP  MACRO        name,fc,qc,scale

  org xi:
hp_s2_\name       ds    1
hp_y_\name        ds    1

  org yi:
hp_scale_\name    dc    (-0.5*scale)
hp_fc_\name       dc    fc
hp_qc_\name       dc    qc

  ENDM
COPY_HP_PARAM    MACRO       from,to

  move    y:hp_scale_\from,x0

  move    x0,y:hp_scale_\to

  move    y:hp_fc_\from,x0

  move    x0,y:hp_fc_\to

  move    y:hp_qc_\from,x0

  move    x0,y:hp_qc_\to

  ENDM
;
;    assumes:
;        m0,m4,m5=-1
;
;
HP MACRO        name

  move    #hp_scale_\name,r4

  move    #hp_s2_\name,r0

  move                  b,x0           y:(r4)+,y0    ;y0=scale

  ;a=x(n)*acale

  mpy     -y0,x0,a    x:(r0)+,x1    y:(r4)+,y0    ;y0=fc

  ;b=s2(n-1)*fc

  mpyr    x1,y0,b     x:(r0),x0     y:(r4)+,y1    ;y1=qc

  ;b = s2(n-1)*fc+y(n-1)

  add      x0,b

  ;a=x(n)-s2(n-1)*fc-y(n-1)

  sub      b,a         b,x:(r0)

  ;a=s1(n)=x(n)-s2(n-1)*fc-y(n-1)-qc*s2(n-1)

  macr    -x1,y1,a    x1,b

  move                  a,x0

  ;b=s2(n)=s2(n-1)+fc*s1(n)

  macr    x0,y0,b     x:(r0)-,x0
				
				<dp n="d193"/>
IF  @DEF(′LO′)
tfr     x0,b   b,x:(r0)
EL5E
tfr     a,b    b,x:(r0)
ENDIF
asl     b
ENDM
				
				<dp n="d194"/>
AP_SCALE_FACTOR_EQU 3
AP_SCALE_DIVIDE EQU(1<<AP_SCALE_FACTOR)
;
;  gamma drives critical  frequency
;
;  beta defines Q
;
DECLARE_AP  MACRO       name,gamma,beta

    org xi:
ap_y_\name         dc  0

                 dc  0
ap_x_\name         dc  0

                 dc  0

   org yi:
ap_gamma_\name     dc  gamma
ap_beta_\name      dc  beta
ap_v_\name         dc  0
ap_w_\name         dc  0
   ENDM
COPY_AP_PARAM  MACRO     from,to

  move    y:ap_gamma_\from,x0

  move    x0,y:ap_gamma_\to

  move    y:ap_beta_\from,x0

  move    x0,y:ap_beta_\to

  ENDM
INIT_AP_PARAM   MACRO    name

   ENDM
;
;    input data is in b
;    input is scaled by 0.5 to prevent internal clipping in the all-pass
;
;    computes all-pass:
;    
;    v(n)=gamma*y(n-1)+y(n-2)-gamma*v(n-1)
;    w(n)=gamma*x(n-1)+x(n-2)-gamma*w(n-1)
;    y(n)=w(n)+beta*x(n)-beta*v(n)
;
;    assumes:
;        m0,m4,m5=-1
;
;
AP  MACRO       name

  asr    b        #ap_y_\name,r0

  move            #ap_gamma_\name,r4

  move            #ap_v_\name,r5

  move                   b,x0

  move                   x:(r0)+,a    y:(r4)+,y0

  move                   x:(r0)+,x1   y:(r5)+,y1

  :compute v(n)

  mac    x1,y0,a       x:(r0)+,b

  mac    -y1,y0,a      x:(r0),x1    y:(r5)-,y1

  ;compute w(n),v(n)is now in a

  mac    x1,y0,b       a,x1          a,y:(r5)+

  mac    -y1,y0,b      x:(r0 ),a    y:(r4)+,y0

  ;compute y(n),w(n) is now in b

  mac    -x1,y0,b      x0,x:(r0 )-  b,y:(r5)-

  mac    x0,y0,b       a,x:(r0)-
				
				<dp n="d195"/>
  asl    b                x;(r0)-,a            b,y1

  rnd    b                a,x:(r0)+

  move                  y1,x:(r0)-

  ENDM
				
				<dp n="d196"/>
include

Claims (54)

1.一种用来修改输入到一个其特征在于多个个别响应的声复制器件的电气声频信号的设备,这些个别响应结合起来定义用于声复制器件的一个整体响应,每个个别响应包括频率、时间、相位或瞬态响应的至少一个,所述设备包括:
多个修改滤波器,具有模拟多个个别响应的修改响应,修改滤波器用来接收电气声频信号,修改电气声频信号,及把电气声频信号提供到声复制器件;和
多个可调节参数,每一个与修改滤波器的至少一个有关,允许对于修改滤波器的响应的调节;
其中调节创建多个个别共轭响应,每个个别共轭响应与多个个别响应的至少一个有关。
2.根据权利要求1所述的设备,其中声复制器件的多个个别响应与声复制器件的机械、声学及电磁性能的至少一个有关。
3.根据权利要求1所述的设备,其中滤波器由数字信号过程定义。
4.根据权利要求1所述的设备,其中滤波器由模拟电路定义。
5.根据权利要求1所述的设备,其中多个修改滤波器非相互作用。
6.根据权利要求1所述的设备,其中多个修改响应结合以形成与用于声复制器件的整体响应共轭的整体响应。
7.根据权利要求1所述的设备,其中修改滤波器的至少一个包括一个截止滤波器,并且用来调节截止滤波器的频率响应的参数包括波峰频率、振幅及Q参数。
8.根据权利要求7所述的设备,其中波峰频率、振幅及Q参数修改在低频和高频范围的至少一个中的截止滤波器的频率响应。
9.根据权利要求1所述的设备,其中修改滤波器的至少一个包括一个恒定斜率均衡器,并且用来调节恒定斜率均衡器的频率响应的参数包括交叉频率和提升搁置参数。
10.根据权利要求9所述的设备,其中交叉频率和提升搁置参数修改 在低和高频范围的至少一个中的恒定斜率均衡器的频率响应。
11.根据权利要求1所述的设备,其中修改滤波器的至少一个包括一个参量切口滤波器,并且用来调节参量切口滤波器的频率响应的参数包括切口频率、振幅和Q参数。
12.根据权利要求1所述的设备,其中修改滤波器的至少一个包括一个参量切口提升滤波器,并且用来调节参量切口提升滤波器的频率响应的参数包括切口频率、振幅和Q参数。
13.一种用来改变输入到具有有关性能特性的声复制器件的电气声频信号的声音补偿系统,所述系统包括:
声复制器件的一种模型,带有模拟声复制器件的性能特性的至少一个的多个滤波器,每个滤波器具有一个有关的响应,该响应结合以定义对于该模型的整体响应,每个响应包括频率、时间、相位或瞬态响应的至少一个;和
一个控制器,修改多个滤波器每一个的响应以把该滤波器转换成一个共轭滤波器,该共轭滤波器具有与滤波器的原始响应共轭的响应。
14.根据权利要求13所述的系统,其中性能特性由声复制器件的分立元件定义。
15.根据权利要求13所述的系统,其中性能特性由声复制器件的分立元件的组定义。
16.根据权利要求13所述的系统,其中滤波器由数字信号过程定义,并且控制器包括一个计算机。
17.根据权利要求13所述的系统,其中滤波器由模拟电路定义,并且控制器包括可调节电路元件。
18.根据权利要求13所述的系统,其中声复制器件包括一个扬声器,并且多个滤波器的至少一个包括至少一个有关可调节参数,并且根据扬声器的物理特性计算参数的值。
19.根据权利要求18所述的系统,其中扬声器的物理特性包括锥和线圈质量、空气体积、机械柔性、辐射面积、阻尼、运动质量及电机特性的至少一个。
20.根据权利要求13所述的系统,其中声复制器件包括一个扬声器,并且多个滤波器的至少一个包括至少一个有关可调节参数,及参数的值从一个标准扬声器模型导出。
21.根据权利要求13所述的系统,其中多个滤波器的至少一个具有一个有关可调节参数,并且使用标准试验测量试验地确定参数的值。
22.根据权利要求13所述的系统,其中控制器这样配置,从而在一个参数的设置中的调节调制至少一个其它参数的设置。
23.根据权利要求22所述的系统,其中声复制器件包括一个扬声器,并且调制至少一个其它参数的一个参数与扬声器的磁铁结构和音圈有关。
24.根据权利要求22所述的系统,其中控制器监视在声复制器件处的程序条件,并且根据程序条件设置参数值的至少一个。
25.根据权利要求24所述的系统,其中程序条件包括音量控制设置、程序级和低音内容的至少一个。
26.根据权利要求13所述的系统,其中滤波器的一个包括一个加权补偿切口滤波器。
27.根据权利要求26所述的系统,其中滤波器包括一个单调谐加权补偿切口。
28.根据权利要求26所述的系统,其中滤波器包括一个双调谐加权补偿切口。
29.一种声音系统,包括:
一个声复制器件,具有有关机械、声学及电磁性能特性;
一个源,用来把一个电气声频信号输出到声复制器件的一个模型,该模型具有模拟声复制器件的机械、声学和电磁性能特性的至少一个的多个滤波器,每个滤波器具有包括频率、时间、相位或瞬态响应的至少一个的有关响应,该模型把电气声频信号输出到声复制器件;及
一个控制器,修改滤波器的响应,以把模型转换成一个具有带有包括与该滤波器的原始响应共轭的响应的多个滤波器的共轭模型。
30.根据权利要求29所述的系统,其中滤波器由数字信号过程定义。
31.根据权利要求29所述的系统,其中滤波器由模拟电路定义。
32.根据权利要求29所述的系统,其中多个滤波器是非相互作用的。
33.根据权利要求29所述的系统,其中滤波器的至少一个包括一个截止滤波器,并且对于截止滤波器的频率响应的修改包括对波峰频率、振幅及Q的调节。
34.根据权利要求29所述的系统,其中滤波器的至少一个包括一个恒定斜率均衡器,并且对于恒定斜率均衡器的频率响应的修改包括对交叉频率和提升搁置的调节。
35.根据权利要求29所述的系统,其中滤波器的至少一个包括一个参量切口滤波器,并且对于参量切口滤波器的频率响应的修改包括对切口频率、振幅及Q的调节。
36.根据权利要求29所述的系统,其中滤波器的至少一个包括一个参量切口提升滤波器,并且对于参量切口提升滤波器的频率响应的修改包括对切口频率、振幅及Q的调节。
37.一种用来修改输入到一个声复制器件的电气声频信号的方法,该声复制器件的特征在于多个个别响应结合起来定义对于声复制器件的整体频率响应。每个个别响应包括频率、时间、相位或瞬态响应的至少一个,所述方法包括步骤:
用多个滤波器模拟多个个别响应;
调节多个滤波器的响应,从而对于每个滤波器,调节的响应包括与个别响应之一共轭的响应;
把电气声频信号输入到滤波器。
38.根据权利要求37所述的方法,其中声复制器件的多个个别响应与声复制器件的机械、声学及电磁性能的至少一个有关。
39.根据权利要求37所述的方法,其中多个滤波器是非相互作用的。
40.根据权利要求37所述的方法,其中多个调节的响应结合以形成与用于声复制器件的整体响应共轭的整体响应。
41.根据权利要求37所述的方法,其中滤波器的至少一个包括一个截止滤波器,并且调节截止滤波器的频率响应的步骤包括设置波峰频率、 振幅及Q的至少一个的步骤。
42.根据权利要求37所述的方法,其中滤波器的至少一个包括一个恒定斜率均衡器,并且调节恒定斜率均衡器的频率响应的步骤包括设置交叉频率和提升搁置的至少一个的步骤。
43.根据权利要求37所述的方法,其中滤波器的至少一个包括一个参量切口滤波器,并且调节参量切口滤波器的频率响应的步骤包括设置切口频率、振幅和Q的至少一个的步骤。
44.根据权利要求37所述的方法,其中滤波器的至少一个包括一个参量切口提升滤波器,并且调节参量切口提升滤波器的频率响应的步骤包括设置切口频率、振幅和Q的至少一个的步骤。
45.一种改变输入到一个具有有关性能特性的声复制器件的电气声频信号的方法,所述方法包括步骤:
用多个滤波器模拟声复制器件的性能特性的至少一个,每个滤波器具有包括频率、时间、相位或瞬态响应的至少一个的有关响应;和
对于滤波器的每一个,修改滤波器的响应,以把滤波器转换成具有一种包括与该滤波器的原始响应共轭的响应的共轭滤波器。
46.根据权利要求45所述的方法,其中性能特性由声复制器件的分立元件定义。
47.根据权利要求45所述的方法,其中性能特性由声复制器件的分立元件的组定义。
48.根据权利要求45所述的方法,其中声复制器件包括一个扬声器,并且多个滤波器的至少一个具有至少一个有关可调节参数,并且修改滤波器响应的步骤包括步骤:
根据扬声器的物理特性计算至少一个可调节参数值的值;和
把参数设置到计算值。
49.根据权利要求48所述的方法,其中扬声器的物理特性包括锥和线圈质量、空气体积、机械柔性、辐射面积、阻尼、运动质量及电机特性的至少一个。
50.根据权利要求45所述的方法,其中声复制器件包括一个扬声器, +并且多个滤波器的至少一个具有一个有关可调节参数,及修改滤波器响应的步骤包括步骤:
由一个标准扬声器模型驱动至少一个可调节参数;和
把参数设置到导出值。
51.根据权利要求45所述的方法,其中多个滤波器的至少一个具有一个有关可调节参数,并且修改滤波器响应的步骤包括步骤:
使用标准试验测量试验确定至少一个可调节参数;和
把参数设置到确定值。
52.根据权利要求48、50或51所述的方法,进一步包括步骤:响应另一个参数的设置调制至少一个参数的设置。
53.根据权利要求48、50或51所述的方法,进一步包括步骤:
监视在声复制器件处的至少一个程序条件;和
根据至少一个程序条件设置参数值的至少一个。
54.根据权利要求53所述的模型,其中程序条件包括音量控制设置、程序级和低音内容的至少一个。
CNB008115567A 1999-08-11 2000-08-10 用于声音再现的补偿系统和方法 Expired - Fee Related CN100382657C (zh)

Applications Claiming Priority (2)

Application Number Priority Date Filing Date Title
US14841299P 1999-08-11 1999-08-11
US60/148,412 1999-08-11

Related Child Applications (1)

Application Number Title Priority Date Filing Date
CN 200810081762 Division CN101883304B (zh) 1999-08-11 2000-08-10 用于声复制的补偿系统

Publications (2)

Publication Number Publication Date
CN1369188A true CN1369188A (zh) 2002-09-11
CN100382657C CN100382657C (zh) 2008-04-16

Family

ID=22525663

Family Applications (2)

Application Number Title Priority Date Filing Date
CN 200810081762 Expired - Fee Related CN101883304B (zh) 1999-08-11 2000-08-10 用于声复制的补偿系统
CNB008115567A Expired - Fee Related CN100382657C (zh) 1999-08-11 2000-08-10 用于声音再现的补偿系统和方法

Family Applications Before (1)

Application Number Title Priority Date Filing Date
CN 200810081762 Expired - Fee Related CN101883304B (zh) 1999-08-11 2000-08-10 用于声复制的补偿系统

Country Status (6)

Country Link
JP (1) JP2003506984A (zh)
CN (2) CN101883304B (zh)
AU (1) AU6900900A (zh)
MY (1) MY131348A (zh)
TW (1) TW479437B (zh)
WO (1) WO2001011918A2 (zh)

Cited By (27)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN103686555A (zh) * 2013-11-19 2014-03-26 歌尔声学股份有限公司 微型扬声器模组和增强其频率响应的方法以及电子设备
CN108462921A (zh) * 2017-02-20 2018-08-28 北京东方广视科技股份有限公司 扬声器声场均衡设备
CN110765675A (zh) * 2018-07-24 2020-02-07 上汽通用五菱汽车股份有限公司 一种汽车排气系统噪声预测方法
CN110913307A (zh) * 2019-11-28 2020-03-24 歌尔科技有限公司 智能控制系统及智能音箱
CN111131961A (zh) * 2019-12-31 2020-05-08 歌尔股份有限公司 一种音箱以及音箱共振的改善方法
CN111565352A (zh) * 2014-09-09 2020-08-21 搜诺思公司 由计算设备执行的方法和回放设备及其校准系统和方法
CN111567064A (zh) * 2018-01-04 2020-08-21 株式会社特瑞君思半导体 扬声器驱动装置、扬声器装置以及程序
CN111970607A (zh) * 2019-05-20 2020-11-20 宏碁股份有限公司 扬声器调整方法与使用此方法的电子装置
US11029917B2 (en) 2014-09-09 2021-06-08 Sonos, Inc. Audio processing algorithms
US11099808B2 (en) 2015-09-17 2021-08-24 Sonos, Inc. Facilitating calibration of an audio playback device
US11106423B2 (en) 2016-01-25 2021-08-31 Sonos, Inc. Evaluating calibration of a playback device
US11122382B2 (en) 2011-12-29 2021-09-14 Sonos, Inc. Playback based on acoustic signals
US11184726B2 (en) 2016-01-25 2021-11-23 Sonos, Inc. Calibration using listener locations
US11197112B2 (en) 2015-09-17 2021-12-07 Sonos, Inc. Validation of audio calibration using multi-dimensional motion check
US11206484B2 (en) 2018-08-28 2021-12-21 Sonos, Inc. Passive speaker authentication
US11212629B2 (en) 2016-04-01 2021-12-28 Sonos, Inc. Updating playback device configuration information based on calibration data
US11218827B2 (en) 2016-04-12 2022-01-04 Sonos, Inc. Calibration of audio playback devices
US11237792B2 (en) 2016-07-22 2022-02-01 Sonos, Inc. Calibration assistance
US11337017B2 (en) 2016-07-15 2022-05-17 Sonos, Inc. Spatial audio correction
US11350233B2 (en) 2018-08-28 2022-05-31 Sonos, Inc. Playback device calibration
US11368803B2 (en) 2012-06-28 2022-06-21 Sonos, Inc. Calibration of playback device(s)
US11374547B2 (en) 2019-08-12 2022-06-28 Sonos, Inc. Audio calibration of a portable playback device
US11379179B2 (en) 2016-04-01 2022-07-05 Sonos, Inc. Playback device calibration based on representative spectral characteristics
US11432089B2 (en) 2016-01-18 2022-08-30 Sonos, Inc. Calibration using multiple recording devices
US11540073B2 (en) 2014-03-17 2022-12-27 Sonos, Inc. Playback device self-calibration
US11696081B2 (en) 2014-03-17 2023-07-04 Sonos, Inc. Audio settings based on environment
US11698770B2 (en) 2016-08-05 2023-07-11 Sonos, Inc. Calibration of a playback device based on an estimated frequency response

Families Citing this family (10)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
TW200306479A (en) 2002-03-29 2003-11-16 Matsushita Electric Ind Co Ltd Apparatus and method for supporting speaker design, and program therefor
JP4177413B2 (ja) * 2004-07-20 2008-11-05 パイオニア株式会社 音響再生装置および音響再生システム
GB0521418D0 (en) * 2005-10-20 2005-11-30 Bray Nicholas P Stand alone electrogate
GB201121077D0 (en) 2011-12-08 2012-01-18 Sontia Logic Ltd Reducing resonance
GB201318802D0 (en) * 2013-10-24 2013-12-11 Linn Prod Ltd Linn Exakt
CN103686556B (zh) * 2013-11-19 2017-02-08 歌尔股份有限公司 微型扬声器模组和增强其频率响应的方法以及电子设备
JP6593741B2 (ja) * 2014-04-30 2019-10-23 パナソニックIpマネジメント株式会社 スピーカシステム
TWI562648B (en) * 2014-10-29 2016-12-11 Sunplus Technology Co Ltd Sound generating device
CN108269578B (zh) * 2018-02-05 2019-10-18 百度在线网络技术(北京)有限公司 用于处理信息的方法和装置
CN110381415B (zh) * 2019-08-27 2021-06-15 联想(北京)有限公司 一种扬声器、信息处理装置及方法

Family Cites Families (6)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
EP0122663A3 (en) * 1983-04-08 1986-12-30 Tommyca Freadman Method and system for improving speaker performance
US5168251A (en) * 1991-05-29 1992-12-01 Eagle Comtronics, Inc. Quality factor improvement for filter application
US5533120A (en) * 1994-02-01 1996-07-02 Tandy Corporation Acoustic feedback cancellation for equalized amplifying systems
CN1112317A (zh) * 1994-03-07 1995-11-22 王幼华 自适应噪声滤波器
JPH08237800A (ja) * 1995-02-27 1996-09-13 Matsushita Electric Ind Co Ltd 低音増強回路
GB2310104A (en) * 1996-02-12 1997-08-13 Yang Yi Fu Loud speaker enclosure and tunable audio reproduction apparatus

Cited By (57)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US11825289B2 (en) 2011-12-29 2023-11-21 Sonos, Inc. Media playback based on sensor data
US11290838B2 (en) 2011-12-29 2022-03-29 Sonos, Inc. Playback based on user presence detection
US11197117B2 (en) 2011-12-29 2021-12-07 Sonos, Inc. Media playback based on sensor data
US11910181B2 (en) 2011-12-29 2024-02-20 Sonos, Inc Media playback based on sensor data
US11889290B2 (en) 2011-12-29 2024-01-30 Sonos, Inc. Media playback based on sensor data
US11849299B2 (en) 2011-12-29 2023-12-19 Sonos, Inc. Media playback based on sensor data
US11153706B1 (en) 2011-12-29 2021-10-19 Sonos, Inc. Playback based on acoustic signals
US11825290B2 (en) 2011-12-29 2023-11-21 Sonos, Inc. Media playback based on sensor data
US11122382B2 (en) 2011-12-29 2021-09-14 Sonos, Inc. Playback based on acoustic signals
US11528578B2 (en) 2011-12-29 2022-12-13 Sonos, Inc. Media playback based on sensor data
US11368803B2 (en) 2012-06-28 2022-06-21 Sonos, Inc. Calibration of playback device(s)
US11516608B2 (en) 2012-06-28 2022-11-29 Sonos, Inc. Calibration state variable
US11516606B2 (en) 2012-06-28 2022-11-29 Sonos, Inc. Calibration interface
US11800305B2 (en) 2012-06-28 2023-10-24 Sonos, Inc. Calibration interface
CN103686555A (zh) * 2013-11-19 2014-03-26 歌尔声学股份有限公司 微型扬声器模组和增强其频率响应的方法以及电子设备
US11540073B2 (en) 2014-03-17 2022-12-27 Sonos, Inc. Playback device self-calibration
US11991505B2 (en) 2014-03-17 2024-05-21 Sonos, Inc. Audio settings based on environment
US11991506B2 (en) 2014-03-17 2024-05-21 Sonos, Inc. Playback device configuration
US11696081B2 (en) 2014-03-17 2023-07-04 Sonos, Inc. Audio settings based on environment
US11625219B2 (en) 2014-09-09 2023-04-11 Sonos, Inc. Audio processing algorithms
CN111565352B (zh) * 2014-09-09 2021-08-06 搜诺思公司 由计算设备执行的方法和回放设备及其校准系统和方法
US11029917B2 (en) 2014-09-09 2021-06-08 Sonos, Inc. Audio processing algorithms
CN111565352A (zh) * 2014-09-09 2020-08-21 搜诺思公司 由计算设备执行的方法和回放设备及其校准系统和方法
US11706579B2 (en) 2015-09-17 2023-07-18 Sonos, Inc. Validation of audio calibration using multi-dimensional motion check
US11803350B2 (en) 2015-09-17 2023-10-31 Sonos, Inc. Facilitating calibration of an audio playback device
US11197112B2 (en) 2015-09-17 2021-12-07 Sonos, Inc. Validation of audio calibration using multi-dimensional motion check
US11099808B2 (en) 2015-09-17 2021-08-24 Sonos, Inc. Facilitating calibration of an audio playback device
US11800306B2 (en) 2016-01-18 2023-10-24 Sonos, Inc. Calibration using multiple recording devices
US11432089B2 (en) 2016-01-18 2022-08-30 Sonos, Inc. Calibration using multiple recording devices
US11184726B2 (en) 2016-01-25 2021-11-23 Sonos, Inc. Calibration using listener locations
US11106423B2 (en) 2016-01-25 2021-08-31 Sonos, Inc. Evaluating calibration of a playback device
US11516612B2 (en) 2016-01-25 2022-11-29 Sonos, Inc. Calibration based on audio content
US11379179B2 (en) 2016-04-01 2022-07-05 Sonos, Inc. Playback device calibration based on representative spectral characteristics
US11995376B2 (en) 2016-04-01 2024-05-28 Sonos, Inc. Playback device calibration based on representative spectral characteristics
US11212629B2 (en) 2016-04-01 2021-12-28 Sonos, Inc. Updating playback device configuration information based on calibration data
US11736877B2 (en) 2016-04-01 2023-08-22 Sonos, Inc. Updating playback device configuration information based on calibration data
US11889276B2 (en) 2016-04-12 2024-01-30 Sonos, Inc. Calibration of audio playback devices
US11218827B2 (en) 2016-04-12 2022-01-04 Sonos, Inc. Calibration of audio playback devices
US11736878B2 (en) 2016-07-15 2023-08-22 Sonos, Inc. Spatial audio correction
US11337017B2 (en) 2016-07-15 2022-05-17 Sonos, Inc. Spatial audio correction
US11237792B2 (en) 2016-07-22 2022-02-01 Sonos, Inc. Calibration assistance
US11983458B2 (en) 2016-07-22 2024-05-14 Sonos, Inc. Calibration assistance
US11531514B2 (en) 2016-07-22 2022-12-20 Sonos, Inc. Calibration assistance
US11698770B2 (en) 2016-08-05 2023-07-11 Sonos, Inc. Calibration of a playback device based on an estimated frequency response
CN108462921B (zh) * 2017-02-20 2020-06-02 北京东方广视科技股份有限公司 扬声器声场均衡设备
CN108462921A (zh) * 2017-02-20 2018-08-28 北京东方广视科技股份有限公司 扬声器声场均衡设备
CN111567064A (zh) * 2018-01-04 2020-08-21 株式会社特瑞君思半导体 扬声器驱动装置、扬声器装置以及程序
CN110765675A (zh) * 2018-07-24 2020-02-07 上汽通用五菱汽车股份有限公司 一种汽车排气系统噪声预测方法
US11206484B2 (en) 2018-08-28 2021-12-21 Sonos, Inc. Passive speaker authentication
US11877139B2 (en) 2018-08-28 2024-01-16 Sonos, Inc. Playback device calibration
US11350233B2 (en) 2018-08-28 2022-05-31 Sonos, Inc. Playback device calibration
CN111970607A (zh) * 2019-05-20 2020-11-20 宏碁股份有限公司 扬声器调整方法与使用此方法的电子装置
CN111970607B (zh) * 2019-05-20 2022-07-05 宏碁股份有限公司 扬声器调整方法与使用此方法的电子装置
US11728780B2 (en) 2019-08-12 2023-08-15 Sonos, Inc. Audio calibration of a portable playback device
US11374547B2 (en) 2019-08-12 2022-06-28 Sonos, Inc. Audio calibration of a portable playback device
CN110913307A (zh) * 2019-11-28 2020-03-24 歌尔科技有限公司 智能控制系统及智能音箱
CN111131961A (zh) * 2019-12-31 2020-05-08 歌尔股份有限公司 一种音箱以及音箱共振的改善方法

Also Published As

Publication number Publication date
JP2003506984A (ja) 2003-02-18
MY131348A (en) 2007-08-30
WO2001011918A2 (en) 2001-02-15
AU6900900A (en) 2001-03-05
CN101883304A (zh) 2010-11-10
WO2001011918A3 (en) 2001-11-15
TW479437B (en) 2002-03-11
CN100382657C (zh) 2008-04-16
CN101883304B (zh) 2013-12-25

Similar Documents

Publication Publication Date Title
CN1369188A (zh) 用于声复制的补偿系统和方法
US20190005782A1 (en) Method, system, and device for converting audio signal to one or more haptic effects
CN1279463C (zh) 在有终端和服务器的网络上进行听力测试的方法及其装置
JP6436934B2 (ja) 動的閾値を用いた周波数帯域圧縮
CN105245195B (zh) 用于具有音质保护的失真减少多频带压缩器的技术
CN105554611A (zh) 一种耳机及其实现方法
US10165364B2 (en) Linear resonant actuator controller
US11627421B1 (en) Method for realizing hearing aid function based on bluetooth headset chip and a bluetooth headset
CN207652638U (zh) 耳机
CN1989784A (zh) 声音增强
CN111935429B (zh) 音质自适应调节方法、相关系统和设备及存储介质
JP2016187141A (ja) 情報処理装置およびその情報処理方法
Berdahl et al. Frequency shifting for acoustic howling suppression
JP2013031125A (ja) 音信号処理装置、および音信号処理方法
CN111800699B (zh) 音量调节提示方法、装置、耳机设备及存储介质
Ben-Tzur et al. The effect of MaxxBass psychoacoustic bass enhancement on loudspeaker design
CN105764008A (zh) 一种调试扩声系统传输频率特性的方法及装置
CN111464930B (zh) 耳机的啸叫检测方法、检测装置及存储介质
US20120033835A1 (en) System and method for modifying an audio signal
CN102576560B (zh) 电子音频设备
US11579840B2 (en) Method for adjusting sound playback and portable device thereof
CN110099326A (zh) 一种带外放功能的头戴耳机及其调节方法、装置
CN111083605A (zh) 音频信息播放方法、装置、电子设备和存储介质
Chiang et al. Experimental modeling and application of push-pull electrostatic speakers
CN108495237A (zh) 一种扬声器音质均衡的幅度增益控制方法

Legal Events

Date Code Title Description
C06 Publication
PB01 Publication
C10 Entry into substantive examination
SE01 Entry into force of request for substantive examination
C10 Entry into substantive examination
SE01 Entry into force of request for substantive examination
C14 Grant of patent or utility model
GR01 Patent grant
ASS Succession or assignment of patent right

Owner name: MICROSOFT TECHNOLOGY LICENSING LLC

Free format text: FORMER OWNER: MICROSOFT CORP.

Effective date: 20150508

C41 Transfer of patent application or patent right or utility model
TR01 Transfer of patent right

Effective date of registration: 20150508

Address after: Washington State

Patentee after: Micro soft technique license Co., Ltd

Address before: American California

Patentee before: Microsoft Corp.

CF01 Termination of patent right due to non-payment of annual fee

Granted publication date: 20080416

Termination date: 20190810

CF01 Termination of patent right due to non-payment of annual fee