以下、図面を用いて本発明の実施の形態を説明する。
図1は、本発明の音発生装置を適用した一実施形態である電子楽器のハードウェア構成を示す。この電子楽器は、基板上に、それぞれが1つの半導体チップである音源LSI(Large Scale Integrated-circuit)100とシリアルフラッシュメモリ121を搭載し、さらに周辺回路として、LPF(ローパスフィルタ)122、アンプおよびスピーカからなるサウンドシステム123、送信用のドライバや受信用のフォトカプラを含むMIDI端子124、スキャン用配線およびそのドライバを含む操作子125、並びに、表示器126などを備える。シリアルフラッシュメモリ121には、音源LSI100のCPU101が実行するプログラム、および、音源LSI100が楽音信号を生成するために利用する波形サンプルデータが記憶されている。
音源LSI100の内部構成を説明する。中央処理装置(CPU)101は、シリアルフラッシュ121等に記憶されているプログラムを読み込んで実行することにより、電子楽器全体や音源LSI100全体の動作を制御する処理装置である。102〜107は音源部を構成する各要素である。この音源部は、時分割動作で、複数チャンネル(ch)の楽音生成処理を行う。すなわち、この音源部は、いわゆる1DAC周期(1サンプリング周期)をch数で分割した各時間区間(タイムスロット)で各chの楽音生成処理を行うものである。
音源レジスタ102は、各chの楽音生成処理を制御するための各種制御パラメータデータをセットする複数ch分の記憶領域を備えたレジスタである。CPU101は、この音源レジスタ102の各chの領域に、そのchの楽音生成を制御するための制御パラメータを書き込むことにより、音源部の各chの楽音生成処理を制御する。例えば、CPU101は、新たな楽音の発音命令(その楽音の音高や強度などのデータを含むノートオンイベント)を受けたとき、その発音用に、音源部の複数のchのいずれか1つを割り当て、音源レジスタ102のその割り当てたchの領域に、生成すべき楽音の音高や強度を含むパラメータを設定し、さらに当該chに発音の開始を指示する発音指示を書き込む(ノートオンイベント処理)。これにより、音源部は、そのchのタイムスロットでの楽音生成処理を開始する。なお、前記発音命令は、他の機器からMIDI端子124経由で受信する場合もあるし、操作子125に含まれる鍵盤の鍵の操作に応じて、CPU101自身が発生する場合もある。
発音指示が書き込まれたときの、その発音指示されたchのタイムスロットにおける、音源部の各部102〜107の動作を説明する。アドレス発生部103は、音源レジスタ102に設定された開始アドレスを初期値として、サンプリング周期毎に、指定されたピッチシフト量に応じた速度で変化する読み出しアドレスを発生し、発生した読み出しアドレスの整数部を、2W(2ワード)要求の波形アドレスとして、シリアルフラッシュI/F108に対して波形サンプル要求を出力する。シリアルフラッシュI/F108は、受け取った波形アドレス(2W要求)に応じて、シリアルフラッシュ121に対して2Wアクセス(後述する図2(b))を行い、その波形アドレスを先頭とする2波形サンプルを連続的に読み出す。補間部104は、該読み出された2波形サンプル間を、前記読み出しアドレスの小数部に応じて補間し、補間サンプルを生成する。音量変化制御部105は、音源レジスタ102に設定された音量エンベロープパラメータに基づいて、楽音の立ち上がりから立ち下がりまでの音量変化を表す音量エンベロープを発生し、サンプリング周期毎に入力する補間サンプルの振幅を、その音量エンベロープに基づいて制御する。このようにして、当該chの楽音波形サンプルが生成される。生成された当該chの楽音波形サンプルは、混合部106にて、他のchで生成された楽音波形サンプルと混合され、さらに、DAC部107にて、その混合サンプルがアナログ波形に変換され、LPF122で雑音成分が除去され、サウンドシステム123にて放音される。
減衰指示が書き込まれたときの、その減衰指示されたchのタイムスロットにおける、音源部の各部102〜107の動作を説明する。CPU101は、生成中の楽音の減衰命令(その減衰すべき楽音の音高を含むノートオフイベント)を受けたとき、その減衰命令に含まれる音高で現在発音中のchを探索し、そのchが見つかれば、音源レジスタ102のそのchの領域に楽音の減衰の開始または加速を指示する減衰指示を書き込む(ノートオフイベント処理)。これにより、音源部の音量変化制御部105は、そのchの音量エンベロープの減衰を開始または加速し、その結果、そのchの楽音波形サンプルの減衰が開始または加速される。音量エンベロープが所定値以下(聞こえない程度)に十分低下したchは、発音停止状態とする。すなわち、音源部は、そのchのタイムスロットでの楽音生成処理を停止し、アドレス発生部103からの波形アドレス(2W要求)が出力されなくなるので、シリアルフラッシュI/F108は、当該chについて、フラッシュメモリ121に対するアクセスを行わなくなる。当該chの読み出しは、次に同chが楽音生成に割り当てられて発音開始が指示されるまで停止される。
ノートオンやノートオフ以外の各種の楽音制御についても同様に、CPU101が、音源レジスタ102の制御すべき楽音を生成中のchの領域に、その楽音を制御するためのパラメータを書き込むことで、その楽音の特性を制御する。
MIDI端子124は、MIDI規格に準拠した不図示の外部MIDI機器を接続するための端子である。MIDI I/O109は、CPU101の制御の下で、MIDI端子124に接続された外部MIDI機器から入力されるMIDIデータを音源LSI100に入力し、また、音源LSI100で生成されたMIDIデータをMIDI端子124に接続された外部MIDI機器に出力するためのインターフェースである。操作子125は、電子楽器の操作パネル上に配置された各種パラメータの値を設定するための操作子や、演奏者が演奏情報を入力するための演奏操作子(鍵盤など)である。操作子I/O110は、CPU101の指示に基づき、操作子125の操作状態をスキャンして、操作情報を入力するためのインターフェースである。表示器126は、CPU101の指示に応じて各種のデータを表示するディスプレイである。表示I/O111は、表示器126に表示データを出力するためのインターフェースである。内部ROM112は、CPU101が起動時に実行するプログラムや、音源部の制御に用いる各種定数データや変換カーブなどを記憶した不揮発性のリードオンリメモリである。内部RAM113は、CPU101がワークエリアとして利用する揮発性メモリであり、CPU101が実行するプログラムや、音源部の制御に用いる各種パラメータなどを記憶するために用いられる。これらメモリ112,113は、それぞれ、パラレルアドレスでアクセスすることにより、パラレルデータの読み出しないし書き込みを行える、通常のパラレル型メモリである。114は、これら各部を接続するバスラインであり、コントロールバス、データバス、およびアドレスバスを総称したものである。
シリアルフラッシュ121について詳しく説明する。上述したように、シリアルフラッシュ121は、各アドレスに1バイトのデータを記憶する不揮発性のメモリであって、それぞれCPU101が実行する一連の複数のプログラム命令からなる1乃至複数のプログラムと、それぞれ音源部が楽音生成に使用する一連の複数波形サンプルからなる1乃至複数の波形データとを記憶している。各プログラム命令のデータ長は、1ワード(1W)または2ワード(2W)であり、各波形サンプルのデータ長は2ワード(2W)である。通常のNOR型フラッシュメモリは、アドレスビット長に対応する数のアドレス端子と、データビット長に対応する数のデータ入出力用端子を備えるが、本実施形態で用いるシリアルフラッシュメモリ121は端子数が少なく、その少ない数の端子をアドレスやデータの入出力に共用してシリアルデータでアドレスやデータの入出力を行うシリアルメモリの一種である。本実施形態では、シリアルフラッシュメモリ121として8端子のものを用いる。図1では6本の端子(ピン)の名称を図示した。CLKはクロック信号を入力するピン、CSはチップセレクト信号を入力するピン、IO1〜IO4はアドレスやデータの入出力に使用する4本のピンを示す。シリアルフラッシュメモリ121は、これらの6本のピンのほか、電源供給用のVCCピンと接地用のGNDピンを備える。
CSピンに入力するチップセレクト信号は、デバイス操作の有効/無効を切り替える信号である。CSピンが“1”のとき(CSピンに所定の高レベル電圧を印加したとき)、シリアルフラッシュメモリ121は非選択状態すなわち読み出しや書き込みの動作をせずスタンバイしている状態にある。シリアルフラッシュメモリ121からデータを読み出すときは、CSピンを“0”とし(CSピンに所定の低レベル電圧を印加する)、次の8クロックを使って、IO1ピンにシリアルデータで8ビットの命令コードを入力する。読み出し命令としては、Read Data(命令コードは03h)、Fast Read(命令コードは0Bh)、Fast Read Dual IO(命令コードはBBh)、および、Fast Read Quad IO(命令コードはEBh)などがある。なお、xxhは16進表記を示すものである。
Read Dataの場合、命令コード03hの入力の後、24クロックを使ってIO1ピンにシリアルデータで24ビットの初期アドレスを入力すると、次の8クロックでIO2ピンから当該初期アドレスの1バイトがシリアルデータで出力される。その後は、CSピンが“0”である間は、アドレスを入力しなくても、読み出しアドレスが前記初期アドレスから自動でインクリメントされ、連続するアドレスの各バイトデータがIO2ピンからシリアルデータで出力される。CSピンが“1”にされると、IO2ピンからのデータの出力が停止する。
なお、上述のCSピンが“0”である間、個別にアドレス指定することなく、読み出しアドレスが自動でインクリメントされて連続する各バイトデータを読み出す機能をSequential Readと呼ぶ。以下で説明するどの読み出し命令でもSequential Readを実行できる。
Fast Readは、上記Read Dataと同様に動作する読み出し命令であるが、Fast Readでは、アドレス入力の後、8クロックのダミークロックが挿入された後にIO2ピンからのデータ出力が行われる。Fast Readでは、Read Dataよりクロックの周波数を高くすることができるので、連続するアドレスの一連のデータを高速に読み出すことができる。
Fast Read Dual IOの場合、命令コードBBhの入力の後、2ピンを用いて24ビットの初期アドレスを入力する。具体的には、IO1ピンとIO2ピンを用いて、1クロックで並列に2ビット入力できるので、命令コードの後の12クロックで24ビットの初期アドレスを入力し、さらにその後の4クロックでモードを入力する。モードの入力の後、IO1ピンとIO2ピンの機能が入力から出力へと切り替わり、次の4クロックで前記初期アドレスの1バイトがIO1ピンとIO2ピンから出力され、さらにSequential Readが行われる。
前記モードについて説明する。モードとしては、16進のAxh(上位4ビットがAhであれば下位4ビットは任意の値で良い)かそれ以外の値(上位4ビットがAh以外)を指定する。モードとしてAxhが入力された場合、Continuous Read Mode(継続読出モード)となる。このモードに入った場合、CSピンが“1”にされてデータ出力が一旦停止された後、再びFast Read Dual IOを発行するときは命令コードの入力を省略することができる。すなわち、CSピンを“0”とした後(命令コードの入力を省略して)、IO1ピンとIO2ピンを用いて12クロックで24ビットのアドレスを入力し、さらに4クロックで8ビットのモードを入力(引き続きContinuous Read Modeを続けたいときはAxhを入力し、該モードをオフしたいときはAxh以外の値を入力)することで、IO1ピンとIO2ピンから前記アドレスのデータを読み出すことができ、さらに引き続くデータをSequential Readで読み出せる。Continuous Read Modeによれば、命令コードを省略できるので、高速なランダムアクセスが実現できる。
Fast Read Quad IOは、Fast Read Dual IOと同様に動作する読み出し命令(命令コードEBh)である。Fast Read Dual IOではIO1ピンとIO2ピンの2ピンを利用してアドレスとモードの入力とデータ出力を行うが、Fast Read Quad IOではIO1〜IO4の4ピンを用いてそれらの入出力を行う。また、Fast Read Dual IOではモード入力のための4クロックの後、直ちにIO1ピンとIO2ピンの機能が入力から出力に切り替えられてデータ出力が始まるが、Fast Read Quad IOではモード入力のための2クロックの後、ダミーの4クロックが挿入されてからIO1〜IO4の機能が切り替えられてデータ出力が開始される。その後、引き続くデータをSequential Readで読み出せる。また、Fast Read Quad IOでもContinuous Read Modeの指定が可能である。なお、IO1〜IO4の4ピンを用いてデータ入出力を行うQuad命令を利用する場合は、シリアルフラッシ121内のステータスビット中のQE(Quadイネーブル)モードを予めオンに設定しておく必要がある。
図2は、シリアルフラッシュ121におけるメモリアクセスのタイミング図である。シリアルフラッシュ121は、各アドレスに1バイトのデータが記憶されている。すなわち、アドレスを指定することでバイト単位でデータを読み出せるものとする。
比較のため、図2(c)に、従来より使われているNOR型フラッシュメモリ(SRAMタイプ)の2ワードアクセスのタイミング図を示す。このフラッシュメモリは、24本のアドレス端子と16本のデータ端子を備え、該アドレス端子に24ビットパラレルのアドレスを入力して、データ端子からは当該アドレスに記憶された1ワード(16ビット)をパラレルデータとして読み出すものである。「MCK」はクロック信号を示す。ここでは33MHz強の周波数のクロック信号とする。「アドレス」は24ビットのアドレスを入力するタイミング、「データ」は当該アドレスのデータが出力されるタイミングを示す。
図2(a)は本実施形態のシリアルフラッシュ121の第1回目の1ワードアクセスのタイミング図、図2(b)は本実施形態のシリアルフラッシュ121の第2回目以降の2ワードアクセスのタイミング図を示す。ここでは、Fast Read Quad IO命令でContinuous Read Modeを指定する場合を例として説明する。
図2(a)および(b)の「CLK」はクロック信号を示す。図2(c)の従来例のクロック信号MCKが33MHz強であったのに対し、本実施形態の音源LSIのクロック信号CLKは、その2倍の66MHz強の周波数のクロック信号とした。図2(a)〜(c)は、ほぼ同じタイムスケールで図示している。
図2(a)の第1回目のアクセスでは、201の時点でCSを“0”とし、次の8クロックの期間202でIO1ピンにEBh(Fast Read Quad IOの命令コード)を入力し、次の6クロックの期間203でIO1〜IO4の4ピンを使って24ビットのアドレスを入力し、次の2クロックの期間204でIO1〜IO4の4ピンを使って8ビットのモードを入力する。モードは、Continuous Read Modeを指定するAxhを入力する。ダミー期間205の後、次の4クロックの期間206でIO1〜IO4の4ピンを使って前記アドレスの1バイトおよび次のアドレスの1バイト(合わせて16ビット)を読み出している。207の時点でCSを“1”として、第1回目の1ワードアクセスを終える。もちろんCSを“0”のままにすれば、Sequential Readにより連続してデータを読み出すことができる。
Continuous Read Modeが指定されているので、これに続けて行われる、Fast Read Quad IO 命令を用いた第2回目以降のアクセスでは命令コードの入力を省略できる。従って、図2(b)では、211の時点でCSを“0”とした後、命令コードの入力を省略して、直ちに8クロックの期間212で24ビットのアドレスと8ビットのモードの入力を行える。ダミーの期間213の後、8クロックの期間214で前記アドレスから連続する2ワード(16ビット×2)を読み出している。
図2(b)から分かるようにContinuous Read Modeを使うことで、20クロック強で2ワードを読み出すことができる(マージンは1〜数クロック)。ほぼ同じ時間スケールの図2(c)の従来のパラレルメモリのアクセスでも同じ程度の時間で2ワードを読み出している。すなわち、シリアルフラッシュを利用して、従来のパラレルメモリと同程度のアクセス速度を確保することができる。パラレルメモリを使うと長い配線のラインを生じ、それが放射される電磁波(ノイズとなる)の量を増やす原因になる場合があるが、本実施形態のようなシリアルフラッシュを利用すればチップのピン数が少ないので配線を短くすることができ、不要な電磁波の放射量を抑えることができる。
図3は、CPU101と音源部(のアドレス発生部103)によるシリアルフラッシュ121のアクセスタイミング例を示す。301は、音源部のアドレス発生部103で波形の読み出しアドレス(波形アドレス)を出力して波形サンプル要求(2W要求)をシリアルフラッシュI/F108に発行し、該波形サンプル要求に応じてシリアルフラッシュI/F108から出力される当該波形アドレスからの2波形サンプル(2ワード)を音源部で受け取る、アクセスタイミング例を示す。302は、CPU101が、プログラムカウンタが示す読み出しアドレス(命令アドレス)を出力してフェッチ要求(1W要求または2W要求)をシリアルフラッシュI/F108に発行し、該フェッチ要求に応じてシリアルフラッシュI/F108から出力される当該命令アドレスを先頭とするプログラム命令(1ワードまたは2ワード)をCPU101が取り込む、アクセスタイミング例を示す。303は、シリアルフラッシュI/F108が、上記波形サンプル要求やフェッチ要求を受け、シリアルフラッシュ121にアクセスして1ワードないし2ワードのデータを読み出している期間(1Wないし2Wアクセス期間)を示す。
図3に示される動作に先立って、図2(a)のFast Read Quad IO 命令を用いた1回目のアクセスが、シリアルフラッシュ121に対して行われており、そこでContinuous Read Mode が指定されているので、ここでは、シリアルフラッシュ121に対するFast Read Quad IOアクセスが、全て図2(b)のContinuous Read Modeの態様で行われる。また、図3では、音源部の第2chと第3chとで楽音生成が進行中であり、アドレス発生部103は、第2chと第3chのタイムスロットにおいて、それぞれ2W要求の波形アドレスをシリアルフラッシュI/F108に対して出力(波形サンプル要求)する。ここでの波形アドレスが「2W要求」であるのは、補間部104でのサンプル間補間用に、連続する2波形サンプルを供給するためである。波形アドレス(2W要求)を受け取ったシリアルフラッシュI/F108は、同じchのタイムスロット内において、シリアルフラッシュ121に対して2Wアクセス(図2(b))を行い、その波形アドレスを先頭とする2ワード(2波形サンプル)を読み出して補間部104に供給する。なお、シリアルフラッシュI/F108は、発音していないchのタイムスロットでは、シリアルフラッシュ121に対して全くアクセスしない。
一方で、CPU101は、シリアルフラッシュ121から動作プログラムを読み出して実行する。動作プログラムには、1ワードのプログラム命令と、2ワードのプログラム命令が混在している。CPU101からの1W要求の命令アドレスの出力(フェッチ要求)に応じて、シリアルフラッシュI/F108は、シリアルフラッシュ121に対して1Wアクセス(図2(b)の例より4クロック短い)を行い、その命令アドレスを先頭とする1ワード(1プログラム命令)を読み出してCPU101に供給する。また、CPU101からの2W要求の命令アドレスの出力(フェッチ要求)に応じて、シリアルフラッシュI/F108は、シリアルフラッシュ121に対して2Wアクセス(図2(b))を行い、その命令アドレスを先頭とする2ワード(1プログラム命令)を読み出してCPU101に供給する。
矢印311は、音源部のアドレス発生部103から第2chのタイムスロットで出力された第2chの波形アドレス(2W要求)が、シリアルフラッシュI/F108に受け付けられた時点を示す。この場合は、CPU101からシリアルフラッシュ121へのアクセスがなされていなかったため、出力された2W要求は、当該タイムスロットの開始時点で直ちにシリアルフラッシュI/F108によって受け付けられる。そして、シリアルフラッシュI/F108は、時点311からの20クロック強の期間312に、シリアルフラッシュ121に対する2Wアクセス312を行い、当該波形アドレスを先頭とする2ワード(2波形サンプル)を読み出す。読み出された2波形サンプルは、2Wアクセス312が完了した時点で、補間部104の読み出しバッファ(図示せず)に一時的に記憶される。補間部104は、アドレス発生部103のタイムスロット(第ich)より1ch分遅れたタイムスロット(第i-1ch)で動作しており、各タイムスロット(第i-1ch)の先頭からの所定期間(例えば、図3の期間314)に、読み出しバッファに格納されている2波形サンプルを用いて、第i-1chの補間サンプル(図3では、第2chの補間サンプル)生成のためのサンプル間補間処理を実行する。そのため、各タイムスロットの補間処理に用いる2波形サンプルは、その補間処理の開始時点までに読み出しバッファに用意しておく必要がある。
一方、CPU101は、音源部とは独立に、動作プログラムの各プログラム命令の読み出し要求(フェッチ要求)を行う。期間315は、CPU101が読み出しアドレスである命令アドレス(1W要求)をシリアルフラッシュI/F108に対して出力する期間である。CPU101がその1W要求を出力し始めた時点(期間315の先頭)では、音源部のためのフラッシュメモリ121に対するアクセス312がなされており、それが終わるまで当該1W要求に応じたアクセスは待たされる。そして、アクセス312終了後の時点316で、当該1W要求がシリアルフラッシュI/F108に受け付けられる。シリアルフラッシュI/F108は、続く16クロック強の期間317に、シリアルフラッシュ121に対する1Wアクセス317を行い、当該命令アドレスを先頭とする1ワード長の1プログラム命令を読み出す。該読み出しの完了時点(期間317の末尾)で、フラッシュメモリI/F108からCPU101に、読み出されたプログラム命令が供給され、CPU101はそのプログラム命令をフェッチする。CPU101は、フェッチした当該プログラム命令を自装置内の制御手順に従ってデコード・実行する。
この1W要求に続けて、CPU101は、次の命令アドレス(2W要求)を出力する。この時点(期間318の先頭)では、音源部のためのフラッシュメモリ121アクセスは行われていないので、当該2W要求は、シリアルフラッシュI/F108によって直ちに受け付けられ、続く20クロック強の期間319に、フラッシュメモリ121に対して、対応する2Wアクセス319が行われる。シリアルフラッシュI/F108は、期間319の終わりに、2Wアクセス319により読み出された2ワード長の1プログラム命令をCPU101に供給し、CPU101はそのプログラム命令をフェッチする。
さらに、第3chのタイムスロットの開始時点で、音源部のアドレス発生部103は、第3chの波形アドレス(2W要求)をシリアルフラッシュI/F108に対して出力するが、CPU101のためのフラッシュメモリ121に対する2Wアクセス319が行われており、第3chの2W要求は、そのアクセス319が終わるまで待たされる。期間319の終了後の時点320で、シリアルフラッシュI/F108は、第3chの2W要求を受け付け、20クロック強の2Wアクセス321を実行する。これにより、フラッシュメモリ121から第3chの補間処理に用いる2波形サンプル(2ワード)が読み出され、読み出しバッファに格納される。
以上のような音源部とCPU101によるシリアルフラッシュ121へのアクセスの競合は、シリアルフラッシュI/F108により調停される。特に、音源部からの2W要求に応じた2Wアクセスは、補間部104の補間処理の開始まで、というデッドラインがあるため、CPU101からの1W要求ないし2W要求に応じたアクセスより優先的に実行される。すなわち、シリアルフラッシュ121に対して新たなアクセスを行える時点において、音源部からの2W要求と、CPU101からの1W要求または2W要求とが共に出力されていた場合、シリアルフラッシュI/F108は、音源部からの2W要求に応じた2Wアクセスを実行する。ただし、図3で説明したように、CPU101のためのフラッシュメモリ121アクセス中に、音源からの2W要求が出力されても、その2W要求に応じた2Wアクセスを割り込み実行することはない。また、1ch分のタイムスロットは、アドレス発生部104のあるchのタイムスロットの開始時点で、運悪く、フラッシュメモリI/F108がCPU101のための最長のアクセス(ここでは2Wアクセス)を開始したとしても、同じタイムスロット内にそのchのための所定ビット長のアクセス(ここでは2Wアクセス)が完了できるよう、該最長のアクセスと該所定長のアクセスとが行えるだけの時間長(ここでは2Wアクセス×2回に1〜10クロック程度のマージンを加えた時間長)を有するよう設計されている。
図4(a)は、本実施形態の電子楽器の電源オンあるいはリセット時にCPU101が実行する起動プログラムの動作を示す。この起動プログラムは内部ROM112に記憶されており、電源オンあるいはリセット時には、CPU101が当該起動プログラムを実行するように設定されている。CPU101は、ステップ401でシリアルフラッシュ121の状態をリセット(格納されているデータは不変)し、ステップ402で、シリアルフラッシュI/F108を用いて、シリアルフラッシュ121から、モードを初期化するためのプログラムを読み出して内部RAM113にロードし、プログラムカウンタが示す命令アドレス(CPU101が実行するプログラム命令のアドレス)を、該ロードした初期化プログラムの開始点(最初に実行すべきプログラム命令のアドレス)にジャンプさせる。これにより、CPU101は、内部RAM113から初期化プログラムのプログラム命令を1つずつ順次読み出して実行するようになる。なお、ステップ402における、シリアルフラッシュ121に対する読み出しアクセスには、何らモードを設定しなくても実行可能な読み出し命令(例えば、命令コード03hのRead Data)が用いられる。
図4(b)は、上記内部RAM113にロードして実行される初期化プログラムの処理手順を示す。ステップ411では、CPU101は、シリアルフラッシュI/F108を用いて、シリアルフラッシュ121のレジスタから、メーカー名、メモリタイプ、容量等の情報と、現在の各種ステータスを示すステータスビット(複数ビット)とを読み出して、Fast Read Quad IO命令を有効にするモード(QEモード)を特定する。ここで特定されるQEモードは、メーカーやメモリタイプによって異なる場合がある。ステップ412で、QEモードのステータスビットが「1」であるか否か、すなわち、シリアルフラッシュ121が既にQEモードに設定されているか否かを判定する。QEモードに設定されていなければ、CPU101は、ステップ413で、シリアルフラッシュI/F108を用いて、フラッシュメモリ121をQEモードに初期設定する。ステップ414では、シリアルフラッシュI/F108に、シリアルフラッシュメモリ121に対する、Fast Read Quad IO命令(EBh)を用いた第1回目のワードアクセス(図2(a))を行わせる。この読み出しアクセスはダミーであり、読み出されたデータは使用してもしなくても良い。また、この読み出しアクセスは、モードとしてContinuous Read Mode(Axh)を指定したものであり、これ以降のシリアルフラッシュI/F108によるフラッシュメモリ121からのデータ読み出しは、全て、図2(b)で説明した命令コード(EBh)を省略したFast Read Quad IO命令による読み出しアクセスとされる。
その後、CPU101は、プログラムカウンタの示す命令アドレスを、シリアルフラッシュ121に格納されている制御プログラムの開始点にジャンプさせる。これにより、CPU101は、フラッシュメモリ121に記憶された制御プログラムのプログラム命令を1つずつ順次実行するようになる。より詳細に述べると、CPU101は、プログラムカウンタの示す命令アドレスが変化する毎に、そのアドレスの1ワードないし2ワードのプログラム命令を要求する命令アドレスをシリアルフラッシュI/F108に対して出力(フェッチ要求)する。シリアルフラッシュI/F108は、該命令アドレス(1W要求ないし2W要求)に応じて、フラッシュメモリ121に対する命令コードを省略したFast Read Quad IOアクセス(図2(b))を行い、フラッシュメモリ121から1ワードないし2ワードの1プログラム命令を読み出す。そして、読み出された1プログラム命令が、CPU101によってフェッチされ実行される。
図4(c)は、CPU101によって、図4(b)の初期化プログラムの後に実行される当該制御プログラムの手順を示す。まずステップ421で初期設定を実行する。ステップ422で、操作子125の操作や、MIDI I/O124等でのデータ受信や、音源からの状態通知や、図示しないタイマによる時間割込などの各種イベントの発生を検出し、ステップ423でイベントがあったとき、ステップ424でそのイベントに応じた処理を実行する。その後はステップ422に戻り、イベントの検出からの処理を繰り返す。ここでの処理の具体例としては、既に説明したノートオンイベントに応じたノートオンイベント処理、ノートオフイベントに応じたノートオフイベント処理以外にも、操作子の操作に応じて音色を調整する音色エディット処理や、タイマ割込に応じた自動演奏や自動伴奏の処理などがある。
なお、上記実施形態では、電源投入後の、シリアルフラッシュI/F108による、シリアルフラッシュ121をContinuous Read Modeに設定するための最初のダミーリードが、CPU101の指示で行われていたが、音源部からの指示に応じて行われるようにしてもよい。また、上記実施形態では、QEモードによる4IO読み出し命令(上述のFast Read Quad IO命令のようにシリアルフラッシュのピンを4本使用してアドレス指定とデータ出力とをそれぞれ(1クロックで)4ビットずつ行う4ピン双方向高速読み出し命令を「4IO読み出し命令」と呼ぶ。同様に、ピンをn本使用してアドレス指定とデータ出力とをそれぞれnビットずつ行うnピン双方向高速読み出し命令を「nIO読み出し命令」と呼ぶ。)を使用したが、2IO読み出し命令を使用しても良い。また、将来、シリアルフラッシュに、6IO読み出し命令や8IO読み出し命令等が実装されたときには、4IO読み出し命令の代わりにそれらを使用してもよい。
上記実施形態では、CPU101がシリアルフラッシュ121から読み出しつつ実行するプログラムの1つのプログラム命令は1W命令または2W命令としたが、1つのプログラム命令の長さは任意である。また、CPU101は、1度の読み出しアクセスでシリアルフラッシュ121から複数のプログラム命令を読み出して一時記憶しておき、順次実行するようにしてもよい。例えば、上記実施形態では、次に読み出すべきプログラム命令が1W命令ならCPU101からフラッシュメモリ121に1W要求を発行して1Wのプログラム命令をフェッチし、次に読み出すべきプログラム命令が2W命令ならCPU101からフラッシュメモリ121に2W要求を発行して2Wのプログラム命令をフェッチしているが、次およびその次に読み出すべきプログラム命令が何れも1W命令であったとき、CPU101からフラッシュメモリ121に2W要求を発行して2つの1Wのプログラム命令をフェッチし順次実行するようにしても良い。
CPUによっては、1回のフェッチで複数ワードのプログラムコードを読み込み、CPU内部の命令バッファに補充して保持しておき、順次、命令をデコード・実行するものがあるので、CPU101としてそのような機能を持つものを使用すれば、1度の読み出しアクセスでシリアルフラッシュ121から複数ワードのプログラムコードを読み出し、順次デコード・実行させることができる。この場合、シリアルフラッシュ121から読み出されるプログラムコードは、命令バッファの空きやCPU内部の実行のスケジューリングに応じて補充するものであるので、必ずしも命令単位の読み出しでなくてもよい。読み出すべきプログラムコードは、プログラムカウンタの進行に応じたアドレスに格納されているが、必ずしもプログラムカウンタで指し示すアドレスから読み出しが開始されるとは限らず、1度の読み出しで、複数ワードからなる1命令の途中から読み出しを開始したり、あるいは1つの命令の途中で読み出しを終えたりしてもよい。従って、CPU101からフラッシュメモリ121へのプログラムコードの読み出し要求は、1Wであったり2Wであったりする可変長であるが、命令単位とは限らない。
また、上記実施形態では図3の期間315や318でCPU101がフェッチ要求を発行してプログラム命令をフェッチすると説明したが、CPU101内にフェッチされた当該命令の「デコード」や「実行」は、必ずしもプログラム命令をフェッチしたのと同じタイムスロット内で行われるとは限らない。CPUによってはパイプライン処理を行うものもあるので、フェッチしたタイミングより所定クロック後にデコードや実行が為される場合もある。フェッチが為された後のデコードや実行などの処理は、CPUの内部的な制御手順によれば良い。
また、シリアルフラッシュ121に格納されたプログラムは命令を表すコードのみならず定数データを表すコードを含んでいてもよい。例えば、シリアルフラッシュ121にはプログラムの一部として読み出し専用の定数データが納められており、プロセッサはそのデータをロードする命令を実行することがある。その場合、プロセッサは命令をフェッチし、デコードし、デコード結果に応じてシリアルフラッシュ121からデータを読み出してレジスタに格納する。このような定数データを表すプログラムコードを読み出す場合も、CPU101からフラッシュメモリ121に読み出し要求を発行して読み出すようにしてよく、その一度に読み出すデータサイズも実行状況によって1Wであったり2Wであったりする。
上記実施形態では、波形サンプルと制御プログラムを記憶する記憶装置としてシリアルフラッシュを使用したが、シリアルフラッシュの代わりに、アドレスとデータのビット数分のピンが設けられたパラレルにデータ読み出し可能なメモリ(ただし、Sequential ReadやContinuous Read Modeの機能を備えたものとする)を使用しても良い。その場合、基板上の配線はコンパクトにはできないが、Sequential ReadやContinuous Read Modeの機能により、メモリアクセス時間が短縮されるので、音源部の同時発音数を増やすことができる。