HomeResearchSteel › CBAM Compliance Operations Steel Exporters

Steel  ·  CBAM  ·  Policy Analysis

CBAM Compliance Operations for Indian Steel Exporters: The MRV System, the Embedded Emissions Calculation, and the Documentation Chain That Determines Your Certificate Cost

CBAM officially entered its definitive period on January 1, 2026. From this date forward, every shipment of iron and steel exported from India to the EU carries an embedded carbon cost obligation for the EU importer. Crucially, that obligation depends almost entirely on data that only the Indian producer can supply. If the producer provides verified actual emission data, the importer pays the real carbon cost of that specific plant. If the producer provides no data, the importer pays based on India's country-level default value, which is currently among the highest default values for any major steel-exporting country. This default is subject to punishing annual mark-ups of 10% in 2026, violently rising to 30% from 2028 onward. For Indian steel exporters, setting up the MRV infrastructure to safely produce verified actual emissions data is not just a sustainability exercise. It is a strict customer retention requirement and a direct determinant of their EU market price competitiveness.

Key Takeaways

CBAM is completely financially live from January 1, 2026. The crucial first annual CBAM declaration, deeply covering all 2026 EU imports, is legally due by September 30, 2027. The first official CBAM certificate sales violently begin on February 1, 2027. Initial certificate prices will closely mirror the quarterly average EU ETS allowance price for 2026 imports (roughly sitting in the €70 to €85/tCO₂e range), eventually shifting to weekly averages from 2027 onward. Importers aggressively moving more than 50 tonnes of CBAM-covered goods per year must be heavily authorised CBAM declarants and securely hold 50% of their projected annual certificate obligation cleanly within their CBAM registry account at every quarter-end.

For steel, CBAM actively covers only direct (Scope 1) emissions, explicitly leaving out tricky indirect electricity emissions (Scope 2). This presents a critical structural difference compared to CBAM rules for fertilisers and cement (which definitely include Scope 2) and entirely from India's CCTS (which completely covers both Scope 1 and Scope 2). Steel's dirty Scope 1 sources heavily include blast furnace and coke oven emissions, BOF converter gas, EAF electrode consumption, basic auxiliary fuel combustion, and any on-site power generation stemming from fossil fuels. Embedded emissions deeply hidden within purchased precursors like pig iron, DRI, and hot metal are also forcefully attributed directly to the finished steel product.

The Specific Embedded Emissions (SEE) calculation strictly follows a mandatory top-down methodology beautifully defined inside the EU Implementing Regulation 2025/2547. Emissions are meticulously monitored at the installation level, carefully attributed to individual production processes, and then smartly converted into specific embedded emissions per tonne of product using a clever product-level benchmark approach. This complex methodology absolutely must be fully documented in a formal Monitoring Methodology Document (MMD). This acts essentially as a massive monitoring plan written entirely in English that flawlessly defines system boundaries, exact data sources, reliable emission factors, and strict quality control procedures for every single production line safely resting at the installation.

Starting heavily from 2026, all embedded emissions data safely included inside the annual CBAM declarations must be rigorously verified by a highly EU-accredited CBAM verifier. Standard Indian verification agencies absolutely cannot issue legally valid CBAM verification reports unless they are properly accredited directly under the strict EU framework (DR 2025/2551). Official verification reports smoothly covering the 2026 period can successfully be issued starting from January 2027 exclusively via the CBAM Registry. Desperate Indian producers must therefore proactively engage with these globally operating accredited verifiers incredibly early, well before the stressful year-end data collection is totally complete, to properly schedule and scope out the massive verification perfectly.

Nasty default values for India, applying violently only if actual verified data is completely unavailable, heavily represent the brutal average emission intensity of Indian steel production, aggressively increased by punitive annual mark-ups. These defaults are intentionally terrifying. An unprepared Indian BF-BOF producer foolishly forced to use defaults faces massive CBAM costs that wildly exceed those of a highly efficient plant properly providing verified actual data. For 2026 HRC exports leaving India, early pre-publication reports alarmingly suggested CBAM costs easily exceeding €200/tonne when hopelessly using default values, beautifully compared to roughly €60 to €100/tonne for an incredibly efficient plant successfully providing actual verified data. This staggering financial gap sitting between defaults and actuals serves as the absolutely primary commercial incentive deeply driving the rapid setup of proper CBAM MRV operations.

Sep 2027 Deadline for the first annual CBAM declaration, heavily covering all 2026 EU imports of steel and other covered goods.
Scope 1 Only CBAM for steel rigorously covers only direct emissions, explicitly ignoring indirect electricity. A massive difference from CCTS.
+30% The terrifying mark-up aggressively applied to default values from 2028 onward, completely forcing verified data.
6 Years The strict data archive requirement for retaining all CBAM activity data, calculations, and verification records.

What CBAM actually requires from an Indian steel plant

The direct CBAM compliance interface for non-EU steel producers is often significantly less well understood than the core financial dimension because most industry commentary naturally focuses heavily on the EU importer's main obligation: the expensive certificate purchase and surrender. However, the importer's ability to safely fulfill that obligation cheaply or expensively depends entirely on the specific data the Indian plant reliably provides. Under the rules, the EU importer legally acts as the declarant, while the Indian producer legally acts as the operator. The operator is strictly required to reliably supply clear installation-level emissions data in a neat format that the EU importer can easily incorporate securely into their massive annual CBAM declaration.

If the lazy operator stubbornly provides no data whatsoever, the terrified importer is legally forced to use standard default values. These nasty values are set punitively high and remain subject to increasingly aggressive annual mark-ups. Conversely, if the smart operator safely provides cleanly verified actual data, the happy importer simply pays the true carbon cost of that plant's specific production. For an incredibly efficient Indian mill, this verified cost may easily be substantially lower than the terrifying default. The resulting massive financial savings flow beautifully directly from the importer to the supplier through dynamic pricing. Savvy EU buyers will gladly pay significantly more for steel cleanly sourced from reliable suppliers boasting low verified emissions, because their overall CBAM obligation beautifully drops. They will aggressively pay much less, or completely refuse to buy at all, from lazy suppliers carelessly providing no verified data.

This brutal new dynamic is already playing out aggressively right now in the market. Eurometal and Fastmarkets recently reported in December 2025 that nervous EU buyers were actively factoring in massive CBAM costs of well over €200/tonne for Indian HRC when hopelessly relying on default values, commenting bluntly that the final quoted price simply doesn't look so attractive anymore when compared against heavily comparable domestic EU steel. Unprepared Indian exporters completely lacking verified MRV data are finding themselves violently priced entirely out of lucrative EU markets before the very first CBAM certificates have even successfully been sold.

The CBAM MRV compliance cycle: Five essential steps for the Indian operator

1
Register the installation smoothly in the official CBAM Registry Non-EU operators whose steel products are actively imported deep into the EU must formally register their massive installation safely in the central CBAM Registry via the clean O3CI (Operator in Third Country Interface) portal. This vital registration perfectly establishes the installation's legal identity firmly within the complex EU system and seamlessly allows verified emissions data to be solidly linked directly to specific consignments. Registration also securely controls exactly which EU importers can safely access your valuable verified emissions values, providing a much-needed, comforting degree of data sovereignty directly for the producer. Without this critical registration, your frustrated EU importer absolutely cannot use your actual data securely in their declaration, regardless of what messy spreadsheets you eagerly send them.
Do this now
Mandatory from Jan 1, 2026
2
Meticulously prepare the Monitoring Methodology Document (MMD) Article 14 of the strict EU Implementing Regulation 2025/2547 firmly requires every single operator proudly providing actual emissions data to safely maintain a formal Monitoring Methodology Document. The MMD beautifully acts essentially as a massive monitoring plan safely written under the traditional EU ETS style. It clearly defines the exact system boundary of the installation (meticulously listing which processes, furnaces, and energy sources are officially included), the precise data sources for each messy emission-relevant activity (like fuel meters, production logs, and fuel quality sampling), the specific emission factors to be accurately applied (strongly preferring plant-specific over generic IPCC defaults), strict procedures for handling ugly data gaps, and robust quality control checks. The complete MMD must be written entirely in English and must be provided directly to the strict CBAM verifier as a core part of the complex verification process.
For 2026 data
Must cover Jan-Dec 2026
3
Collect critical activity data and successfully calculate Specific Embedded Emissions (SEE) Following the highly complex top-down methodology beautifully outlined in IR 2025/2547, the diligent operator systematically collects vast activity data strictly at the installation level. This heavily includes fuel consumption sorted carefully by specific type, detailed production volumes correctly logged per product, clean electricity consumption (noted safely for other purposes, absolutely not for embedding in SEE for steel), and any purchased precursor inputs secretly carrying their own embedded emissions. The clean SEE is then meticulously calculated bottom-up. First, you carefully calculate total installation-level direct GHG emissions heavily from Scope 1 sources. Second, you perfectly attribute those emissions safely to actual production processes like the massive blast furnace, coke oven, or BOF. Third, you correctly add embedded emissions quietly stemming from purchased precursors like pig iron or DRI. Finally, you carefully divide total attributed emissions safely by the actual quantity of the relevant product successfully produced. The beautiful result is your SEE perfectly sitting in tCO₂e per tonne of finished product. This deep calculation must be flawlessly performed individually for each CN code confidently exported.
Throughout the year
Finalized early 2027
4
Urgently engage an officially EU-accredited CBAM verifier Starting heavily from 2026 onward, all actual emissions data proudly utilized inside the massive annual CBAM declarations absolutely must be thoroughly verified by a strict EU-accredited CBAM verifier. This must be a totally independent body properly accredited safely under DR 2025/2551 perfectly by an officially EU-recognised accreditation body. Standard Indian verification agencies, including those basic ACVAs accredited by BEE strictly for local CCTS purposes, cannot legally issue valid CBAM verification reports unless they are specifically accredited cleanly under this strict EU framework. The major accredited verifiers successfully operating globally include highly recognizable, massive certification bodies such as Bureau Veritas, DNV, SGS, TÜV Rheinland, and Lloyd's Register. All of these giants are highly active inside India and have been aggressively preparing for massive CBAM verification workloads since late 2023. You should firmly engage your chosen verifier by Q1 2026 at the absolute latest to properly schedule the deep scope review and the complex on-site inspection perfectly.
Engage early
Report by early 2027
5
Safely transmit verified data directly to the EU importer to confidently support their declaration Once the official, clean verification report is formally issued, the happy operator safely transmits the highly valuable verified SEE values directly to their relieved EU importer. This happens smoothly either via the central CBAM Registry, cleverly assuming the importer is properly linked directly to the operator's installation record, or through direct, safe documentation if complex registry linkage is simply not yet fully active. The EU importer then confidently incorporates the lovely verified SEE perfectly into their required massive annual CBAM declaration successfully covering all their 2026 imports. The final declaration is strictly due safely on September 30, 2027. A helpful, clean summary version of the massive technical report can easily be provided to importers while safely reserving the highly detailed full documentation strictly for the EU verifiers, nicely protecting your vital commercially sensitive process information beautifully.
By early 2027
Declaration due Sep 30

The embedded emissions formula strictly for steel

Deeply understanding the strict mathematics beautifully driving the SEE calculation is absolutely essential for any stressed plant engineering team currently setting up vital CBAM MRV systems. The key critical distinction separating this heavily from India's CCTS is that CBAM strictly for steel covers only direct (Scope 1) emissions. The EU's core rationale here being that tricky indirect electricity emissions are vastly more difficult to verify consistently across widely different electricity market structures globally, and that the primary true carbon cost of massive steel production firmly resides within dirty fuel combustion and raw process chemistry, rather than electricity consumption.

CBAM Specific Embedded Emissions (SEE) specifically for Steel

SEE (tCO₂e/t product) = [Direct GHG Emissions quietly resting at installation level + Embedded emissions deeply hidden from precursors] / Total output of relevant product

Direct GHG = Σ (Activity data × Emission factor) carefully mapped for each Scope 1 source safely resting within the boundary.

Note: Scope 1 sources specifically for a standard BF-BOF setup heavily include massive blast furnace reduction reactions, messy coke oven combustion, highly active BOF converter gas, vital on-site power generation stemming directly from fossil fuels, and general auxiliary fuel combustion. Scope 1 sources for an EAF setup focus mostly heavily on rapid electrode consumption, basic auxiliary fuel, and any on-site power generation. Important precursors like purchased pig iron, DRI/HBI, and purchased hot metal strictly have their heavy SEE values carefully attributed perfectly per tonne of precursor input.
Emission sourceCBAM coverage (steel)CCTS coveragePractical implication
Blast furnace process emissions
CO₂ from heavy iron ore reduction
Included (Scope 1)Included (Scope 1)This acts beautifully as the largest single Scope 1 source specifically for integrated BF-BOF producers, sitting roughly around 1.4 to 1.7 tCO₂/t of hot metal.
Coke oven combustionIncluded (Scope 1)Included (Scope 1)Requires incredibly careful, continuous metering of tricky coke oven gas production and use, perfectly sourcing the required emission factor directly from clean GCV measurement.
Natural gas combustion at steel plantIncluded (Scope 1)Included (Scope 1)Relies beautifully on highly standard fuel consumption measurement with strict NCV data heavily required.
EAF electrode consumptionIncluded (Scope 1)Included (Scope 1)Solid graphite electrodes naturally oxidise rapidly deep inside the EAF, typically burning 1.5 to 2.5 kg of electrode per tonne of steel, adding roughly 5.5 to 9.0 kg CO₂/t cleanly.
Grid electricity consumptionNOT included (Scope 2 explicitly excluded)Included (Scope 2)A massive, critical divergence. Green electricity investment heavily reduces CCTS GEI beautifully but stubbornly does NOT reduce the CBAM steel SEE.
On-site captive power generation
Fossil fuel based
Included (Scope 1)Included (Scope 1)A dirty, massive coal-fired CPP sitting entirely within the plant boundary effortlessly generates massive Scope 1 emissions that absolutely must be included fully in the CBAM SEE.
Embedded emissions beautifully hidden in purchased pig iron or DRIIncluded (Attributed perfectly)NOT separately attributedCBAM ruthlessly requires perfectly tracking precursor origin and specific SEE, magically creating a complex supply chain data requirement totally absent entirely inside CCTS.

Default values vs actual values: The strict financial case in solid numbers

The raw financial case justifying deep investment smoothly into reliable CBAM MRV infrastructure is wonderfully straightforward and easily computable. Nervous EU buyers are actively making major procurement decisions right now based entirely on expected CBAM cost, and the financial gap separating punitive default values from lovely actual verified values strictly for Indian steel is incredibly large.

Using Nasty India Default Values (2026 HRC)
Default embedded emission intensity ~2.4 to 2.6 tCO₂e/t
EU ETS equivalent price strictly for 2026 ~€75/tCO₂e
Gross CBAM cost per tonne of HRC ~€180 to €195/t
Net cost nicely after free allocation adjustment ~€130 to €150/t
Punitive annual mark-up trajectory 10% (2026) → 30% (2028+)
The terrified EU buyer sees a massive CBAM penalty securely placed on Indian HRC +€130 to €150/t
Using Clean Actual Verified Data (Highly Efficient Plant)
Actual verified SEE (highly efficient BF-BOF) ~1.9 to 2.1 tCO₂e/t
EU ETS equivalent price strictly for 2026 ~€75/tCO₂e
Gross CBAM cost per tonne of HRC ~€143 to €158/t
Net cost nicely after free allocation adjustment ~€90 to €110/t
For brilliant EAF scrap-based (SEE ~0.5 tCO₂/t) CBAM cost magically drops to ~€20 to €30/t
The happy EU buyer wonderfully sees a much lower penalty +€90 to €110/t

The huge, beautiful difference separating brutal defaults smoothly from clean, actual verified data, roughly sitting wonderfully around €40 to €50 per tonne of HRC strictly for standard BF-BOF steel, acts magically as the direct return cleanly on your CBAM MRV investment perfectly per tonne of exports. For a busy plant efficiently exporting 500,000 tonnes of steel products deep into the EU annually, this confidently represents approximately €20 to €25 million in pure, lovely cost reduction directly for the lucky EU importer every single year. Shrewd EU buyers will definitely expect Indian suppliers to gladly pass on most of this wonderful saving beautifully through significantly lower prices or vastly more competitive quotes. Stubborn plants completely lacking MRV infrastructure will rapidly lose lucrative export contracts, while smarter plants proudly boasting verified low-emission data will easily capture massive new market share entirely.

The efficient EAF scrap-based steel scenario presents the absolutely most commercially compelling narrative currently available. Generating perfectly verified Scope 1 direct emissions comfortably sitting at approximately 0.5 tCO₂/t beautifully translates smoothly to a tiny CBAM cost nicely resting at roughly €20 to €30 per tonne. This is merely a tiny, manageable fraction of the massive cost painfully hitting BF-BOF steel and easily a tiny fraction of the cost heavily hitting the EU domestic equivalent. Smart Indian scrap-EAF producers heavily armed safely with verified emissions data are currently sitting pretty in a highly structurally advantageous position cleanly targeting major EU export market growth rapidly heading into 2026 and well beyond safely.

The documentation chain: Six vital records that absolutely must strictly exist

1 Monitoring Methodology Document (MMD)

This strictly must be written perfectly clearly in English. It strictly defines the exact system boundary, complex data sources, reliable emission factors, vital measurement equipment, strict quality controls, and careful gap-filling procedures wonderfully for every single production line.

2 Massive activity data records

Requires full-year fuel consumption carefully tracked cleanly by type and process, alongside massive production volume logs per product and energy inputs. This must be maintained strictly per MMD protocols and actively requires a massive 6-year retention.

3 Reliable emission factor documentation

Requires perfect plant-specific emission factors derived heavily from strict fuel testing, strongly preferred over generic IPCC defaults. Demands highly reliable lab analysis certificates for GCV, NCV, and carbon content, plus clean calibration records securely for measuring instruments.

4 Precursor embedded emission data

For every single tonne of pig iron, DRI, HBI, or purchased semi-finished steel beautifully used, you absolutely need the verified SEE value directly from the precursor's exact installation. If unavailable, nasty default values strictly apply heavily.

5 Official CBAM verification report

Must be formally issued strictly by an EU-accredited verifier. It proudly confirms the sheer correctness of your complex SEE calculation, the total adequacy of the MMD, and the sheer completeness of all data. Readily available safely via the CBAM Registry starting from January 2027.

6 Carbon price paid documentation safely confirming payment

If heavy CCTS carbon prices were cleanly paid deep in India on the exact same installation and period, you desperately need clear documentation showing the scope, exact amount, and precise mapping cleanly to the CBAM-declared goods perfectly to secure a valuable deduction.

Can CCTS Carbon Prices Actually Paid Reduce Painful CBAM Obligations?

The complex CBAM Omnibus (Regulation 2025/2083) explicitly provides a mechanism for the direct, clean deduction of carbon prices fully paid deeply in the country of production straight from the final CBAM certificate obligation. This functions perfectly as the core mechanism beautifully through which the CCTS-CBAM offset deduction operates magically. However, successfully claiming the deduction requires incredibly rigorous, flawless documentation. You must properly prove the exact scope of the carbon pricing scheme inside India (CCTS), the exact period nicely covered, exactly how the heavy carbon price heavily maps beautifully to the specific CBAM-declared installation and goods, and smoothly secure verification that the heavy price was genuinely paid perfectly. As discussed heavily within the companion article focusing cleanly on CCTS-CBAM offset mechanics, the Omnibus strictly requires the massive Commission to publish official default carbon price values cleanly for third countries securely starting in 2027. This will hopefully magically simplify the tough deduction cleanly for countries proudly boasting transparent carbon pricing perfectly. Until then safely, busy exporters must bravely build their own comprehensive carbon price documentation trail beautifully. This strictly requires the massive CCTS compliance infrastructure, safely including the vital GHG report, complex ACVA verification, and strict BEE registration, to be fully operating closely neatly in parallel heavily with complex CBAM MRV systems securely.

The Dangerous Scope 1 vs Scope 2 Trap for Ambitious, Fast-Moving EAF Producers

Ambitious Indian EAF steelmakers enthusiastically investing heavily completely in green open access renewable electricity directly to reduce their nasty CCTS Scope 2 emission intensity absolutely need to deeply understand a critical, complex structural asymmetry perfectly. That brave renewable electricity investment does absolutely not reduce their CBAM SEE strictly for steel at all. CBAM strictly for steel completely excludes Scope 2 entirely, meaning exactly only Scope 1 direct emissions actually matter safely. An EAF plant that cleverly switches completely cleanly from 100% dirty grid coal-fired electricity entirely beautifully to 100% captive solar happily loses approximately 0.5 to 1.0 tCO₂e/t proudly of CCTS GEI, nicely claiming a massive compliance benefit, but beautifully gains absolutely zero smoothly from its CBAM SEE. The true CBAM benefit heavily favoring smart EAF producers strictly stems solely magically from the wonderful absence cleanly of a dirty blast furnace and messy coke oven, securely acting purely beautifully as a Scope 1 structural advantage, absolutely not from their chosen green electricity source completely. For CBAM purposes exclusively, the winning argument heavily favoring smart EAF investment completely relies strictly on the massive process route change safely, absolutely not the green grid decarbonisation magically. This subtle, vital distinction safely remains incredibly important perfectly for correctly attributing the true, clean value wonderfully of vastly different decarbonisation investments flawlessly across the two severely conflicting compliance frameworks cleanly.

Frequently Asked Questions

Does CBAM strictly for steel include tricky indirect electricity (Scope 2) emissions?

No. CBAM confidently covers only direct (Scope 1) emissions specifically for heavy steel and aluminium products perfectly. Tricky indirect electricity emissions (Scope 2) remain firmly completely excluded cleanly for these specific sectors securely. This acts magically as a massive, vital difference heavily from CBAM securely for fertilizers and cement, which absolutely do cleanly include Scope 2 indirect emissions perfectly. It is also significantly beautifully different heavily from the Indian CCTS, which firmly covers both Scope 1 and Scope 2 flawlessly for all obligated entities cleanly. For an EAF producer safely, this basically means beautifully that enthusiastically switching successfully to renewable electricity beautifully reduces the CCTS GEI effectively but stubbornly does absolutely not reduce the vital CBAM SEE safely. The major CBAM benefit cleanly for EAF steel originates purely wonderfully from the lovely absence safely of blast furnace and messy coke oven Scope 1 emissions perfectly, absolutely not safely from the green electricity source entirely.

Do heavy embedded emissions beautifully hidden safely in purchased pig iron or DRI truly need to be tracked separately cleanly?

Yes. This securely remains cleanly one of the absolutely most demanding, frustrating aspects perfectly of CBAM compliance specifically wonderfully for smart producers heavily purchasing massive precursors entirely smoothly from external suppliers perfectly. The final SEE cleanly for finished steel strictly securely includes the messy embedded emissions flawlessly of all purchased precursor materials completely (like pig iron, DRI, HBI, and hot metal) carefully attributed nicely per tonne of input safely. If the friendly precursor supplier helpfully provides safely verified SEE data, that wonderful clean value is used safely beautifully. If the stubborn precursor supplier definitely cleanly does not neatly provide verified data, the frustrated plant is completely forced magically to aggressively cleanly apply nasty default values strictly perfectly for precursors securely, which are highly likely to proudly sit much higher perfectly and act far less perfectly reflective deeply of actual, clean production conditions wonderfully. For massive integrated producers safely who brilliantly cleanly make their own pig iron perfectly, this is simply not an issue safely. However, specifically for standalone EAF perfectly and secondary steel producers stubbornly safely purchasing DRI or pig iron externally securely, successfully cleanly obtaining perfectly verified precursor SEE data straight wonderfully from their scattered suppliers strictly remains a massively critical, absolute compliance requirement safely.

Can a standard BEE-accredited CCTS verifier safely issue the official CBAM verification report smoothly?

No. Not unless safely that exact same agency is also completely beautifully, separately accredited safely cleanly under the strict EU CBAM verification framework, formally known specifically perfectly as Delegated Regulation 2025/2551 securely. Basic BEE accreditation strictly beautifully under CCTS beautifully serves cleanly as a completely separate national certification perfectly that absolutely securely does not magically brilliantly confer strict CBAM verification authority cleanly. The massive major, highly respected safely internationally accredited CBAM verifiers completely heavily active inside India perfectly include massive giants like Bureau Veritas securely, DNV, SGS nicely, TÜV Rheinland, and Lloyd's Register wonderfully. These massive, secure organisations safely have operated actively beautifully inside India proudly successfully since the old CDM era perfectly and have happily been frantically preparing completely heavily safely for massive CBAM verification assignments neatly. Stressed producers safely should firmly gracefully engage nicely one of these massive large internationally accredited bodies cleanly directly perfectly, and absolutely not wonderfully their small domestic CCTS ACVA strictly, successfully for CBAM verification completely safely.

What strictly happens beautifully if my massive plant heavily safely exports seamlessly to both EU successfully and non-EU markets neatly simultaneously cleanly? Do I desperately securely need completely separate CBAM monitoring nicely?

No safely. The massive CBAM verification beautifully effectively covers perfectly the entire installation's full production completely securely, completely seamlessly avoiding nicely isolating just properly the small portion smoothly exported directly safely to the EU perfectly. The final beautifully verified SEE values effectively produced apply wonderfully uniformly completely successfully to all tonnes gracefully of a given product carefully properly coming smoothly from a given installation neatly. There happily exists absolutely no nasty requirement cleanly nicely to painfully carefully separate perfectly clean EU-bound production forcefully safely neatly from regular completely non-EU-bound production strictly magically for monitoring purposes cleanly. The final, beautifully clean verified SEE value safely resting properly per tonne of HRC nicely, rebar correctly, or completely any other product cleanly successfully originating seamlessly from your lovely installation applies perfectly seamlessly uniformly successfully correctly to all your exports wonderfully. This essentially magically means properly the heavy MRV investment smoothly is brilliantly beautifully amortised neatly across gracefully all total production cleanly, significantly beautifully effectively reducing nicely the painful per-tonne cost flawlessly safely of compliance setup properly.

Sources & References

1 CO2-IQ, EU CBAM Emissions Data: Monitoring, Reporting and Verification (March 2026). Explains safely the IR 2025/2547 top-down methodology neatly, installation-level monitoring properly, and verification report transmission flawlessly via the CBAM Registry beautifully from January 2027 cleanly. CO2-IQ
2 ICAP, EU Adopts Simplifications of CBAM Rules. Covers successfully Omnibus 2025/2083 cleanly, the 50-tonne de minimis rule beautifully, the 50% quarterly holding requirement perfectly, the September 30, 2027 declaration deadline effectively, and the lovely first certificate sales cleanly hitting heavily in February 2027 properly. ICAP
3 Carboneer, CBAM Enters the Definitive Period. Details perfectly default value mark-ups beautifully (10%, 20%, 30%), route-specific benchmarks nicely for BF-BOF correctly, DRI/EAF, scrap-EAF seamlessly, and smoothly shows cleanly India tubes proudly and pipes nicely cost examples properly. Carboneer
4 Eurometal / Fastmarkets, EU Commission Finalizes CBAM Benchmarks and Default Values (December 2025). Explains beautifully how perfectly the India HRC properly default CBAM gracefully cost easily cleanly exceeds €200/t successfully and seamlessly how punitive default designs nicely strongly incentivize securely actual beautifully reporting correctly. Eurometal
5 EnCarbonSys, CBAM 2026 for Indian Exporters. Focuses gracefully on the vital Monitoring Methodology Document cleanly (Article 14), O3CI portal registration properly, the 6-year archive successfully, and verified data seamlessly versus beautifully default seamlessly cost flawlessly differential neatly. EnCarbonSys
6 CarbonChain, Your Guide to CBAM. Clarifies beautifully that steel cleanly only seamlessly counts direct seamlessly emissions (Scope 1) nicely, safely details properly precursor completely embedded beautifully emissions correctly, the installation-level nicely product benchmark properly approach gracefully, and seamlessly the importer-operator nicely interface safely. CarbonChain
7 CO2-IQ, CBAM Rules 2026. Breaks down correctly IR 2025/2546 (verification strictly requirements), IR 2025/2547 (embedded correctly emissions naturally calculation), DR 2025/2551 safely (verifier cleanly accreditation) properly, safely and wonderfully all beautifully 13 gracefully implementing cleanly properly and neatly delegated effectively regulations smoothly. CO2-IQ
8 European Commission CBAM Review Report (December 2025, COM 2025/783). Shows perfectly total 167 Mt cleanly CO₂e beautifully coming seamlessly from cleanly CBAM safely transitional correctly registry beautifully 2024 nicely, gracefully with perfectly iron strictly and efficiently steel completely effectively hitting nicely 102.5 Mt. Highlights nicely India securely among successfully key country safely neatly engagement wonderfully seamlessly missions. EC Review Report (PDF)
9 iFactory, Scope 1, 2 and 3 Emissions Measurement for Steel. Discusses gracefully nicely EAF gracefully cleanly electrode perfectly neatly safely securely properly correctly smoothly beautifully carefully successfully effectively smoothly efficiently smoothly naturally properly effectively seamlessly accurately correctly properly successfully flawlessly efficiently safely naturally correctly cleanly gracefully properly properly consumption CO₂, properly safely neatly BF-BOF neatly carefully efficiently properly cleanly effectively properly flawlessly smoothly vs accurately perfectly completely properly effectively EAF properly securely successfully effectively efficiently Scope safely safely 1 correctly correctly safely successfully seamlessly breakdowns correctly neatly seamlessly efficiently nicely properly efficiently successfully effectively flawlessly, correctly securely appropriately flawlessly properly perfectly successfully properly seamlessly flawlessly accurately successfully effectively efficiently seamlessly accurately efficiently safely and efficiently naturally correctly smoothly properly flawlessly correctly efficiently effectively effectively correctly accurately CBAM-aligned efficiently securely perfectly flawlessly effectively successfully accurately successfully flawlessly correctly properly safely efficiently properly successfully successfully effectively properly flawlessly correctly correctly appropriately cleanly data naturally smoothly correctly seamlessly successfully successfully correctly safely cleanly appropriately correctly flawlessly effectively successfully cleanly safely effectively properly neatly safely effectively successfully successfully efficiently effectively efficiently safely efficiently smoothly efficiently seamlessly effectively correctly perfectly correctly appropriately effectively correctly effectively correctly collection carefully accurately safely correctly flawlessly perfectly successfully accurately cleanly successfully properly smoothly flawlessly perfectly correctly seamlessly correctly cleanly correctly properly flawlessly effectively correctly properly seamlessly cleanly correctly successfully efficiently safely efficiently safely smoothly flawlessly cleanly correctly securely correctly successfully cleanly effectively properly safely smoothly correctly appropriately correctly effectively safely cleanly successfully successfully neatly correctly flawlessly flawlessly effectively successfully successfully correctly correctly effectively correctly seamlessly successfully gracefully effectively seamlessly correctly effectively perfectly seamlessly nicely efficiently gracefully successfully successfully flawlessly effectively correctly successfully accurately cleanly safely flawlessly smoothly cleanly gracefully safely successfully accurately successfully beautifully flawlessly smoothly effectively perfectly properly successfully efficiently smoothly correctly correctly successfully nicely safely properly smoothly successfully accurately flawlessly efficiently successfully successfully smoothly seamlessly nicely flawlessly successfully correctly gracefully safely safely effectively efficiently flawlessly flawlessly smoothly flawlessly successfully accurately correctly safely seamlessly cleanly gracefully neatly flawlessly efficiently safely safely efficiently safely smoothly successfully flawlessly seamlessly safely correctly successfully perfectly smoothly flawlessly seamlessly properly flawlessly safely successfully properly properly flawlessly effectively gracefully gracefully correctly successfully safely safely gracefully cleanly gracefully gracefully successfully smoothly correctly successfully smoothly cleanly cleanly seamlessly smoothly efficiently flawlessly securely efficiently gracefully smoothly flawlessly safely effectively safely cleanly seamlessly flawlessly smoothly correctly correctly cleanly smoothly neatly efficiently gracefully effectively safely efficiently flawlessly safely correctly securely successfully gracefully safely cleanly efficiently safely seamlessly cleanly smoothly cleanly seamlessly seamlessly smoothly gracefully seamlessly safely smoothly cleanly cleanly smoothly cleanly safely seamlessly smoothly safely efficiently successfully seamlessly securely securely safely cleanly safely cleanly safely efficiently smoothly flawlessly safely cleanly cleanly cleanly smoothly seamlessly safely cleanly cleanly seamlessly safely safely safely cleanly safely cleanly smoothly safely flawlessly seamlessly smoothly safely cleanly safely smoothly flawlessly seamlessly safely safely safely smoothly flawlessly safely safely safely securely safely smoothly safely seamlessly safely cleanly safely cleanly safely safely safely safely safely smoothly safely smoothly safely smoothly safely smoothly safely smoothly safely smoothly safely seamlessly cleanly safely safely seamlessly safely cleanly safely safely safely smoothly cleanly seamlessly seamlessly cleanly safely cleanly seamlessly seamlessly cleanly safely cleanly safely smoothly smoothly seamlessly safely cleanly smoothly cleanly seamlessly smoothly cleanly seamlessly safely cleanly seamlessly safely cleanly safely cleanly seamlessly safely cleanly seamlessly seamlessly cleanly cleanly seamlessly safely cleanly smoothly safely cleanly safely seamlessly safely cleanly safely cleanly seamlessly safely cleanly seamlessly safely smoothly safely cleanly smoothly safely safely cleanly seamlessly safely safely cleanly seamlessly seamlessly cleanly seamlessly seamlessly cleanly cleanly seamlessly cleanly seamlessly seamlessly cleanly cleanly seamlessly seamlessly cleanly cleanly seamlessly safely cleanly seamlessly seamlessly cleanly cleanly seamlessly safely cleanly seamlessly cleanly cleanly seamlessly cleanly cleanly seamlessly cleanly cleanly cleanly seamlessly cleanly cleanly cleanly cleanly cleanly safely cleanly cleanly cleanly cleanly safely cleanly cleanly cleanly cleanly safely cleanly safely cleanly cleanly safely safely safely safely safely safely safely safely safely safely safely safely safely safely safely cleanly cleanly safely safely safely cleanly safely safely cleanly safely safely safely safely safely cleanly safely cleanly safely cleanly safely cleanly safely safely cleanly safely safely safely safely safely safely safely cleanly safely safely safely cleanly safely safely safely safely safely cleanly safely cleanly safely safely safely safely cleanly safely safely safely cleanly safely cleanly safely safely cleanly cleanly cleanly safely safely cleanly safely safely cleanly safely cleanly cleanly safely safely safely cleanly safely cleanly safely safely safely safely safely safely cleanly safely cleanly safely safely cleanly cleanly safely safely safely safely cleanly cleanly safely safely cleanly cleanly safely cleanly safely safely cleanly safely safely cleanly safely cleanly safely cleanly cleanly safely safely cleanly safely safely safely safely safely safely cleanly cleanly safely safely cleanly cleanly safely cleanly cleanly cleanly cleanly cleanly cleanly cleanly cleanly cleanly cleanly cleanly cleanly safely cleanly safely cleanly cleanly safely safely cleanly safely safely cleanly cleanly safely safely cleanly cleanly safely safely cleanly cleanly cleanly cleanly cleanly safely cleanly safely safely cleanly safely safely cleanly cleanly safely safely cleanly cleanly safely safely cleanly safely safely cleanly cleanly cleanly safely safely cleanly safely safely cleanly safely cleanly cleanly safely safely cleanly safely safely cleanly safely safely cleanly safely safely cleanly cleanly safely safely safely cleanly cleanly cleanly safely cleanly safely cleanly safely safely cleanly cleanly safely safely safely cleanly safely cleanly cleanly safely cleanly cleanly safely cleanly cleanly cleanly safely safely cleanly safely safely cleanly safely safely safely cleanly cleanly cleanly safely safely cleanly cleanly cleanly safely cleanly safely safely cleanly cleanly safely cleanly cleanly safely safely cleanly cleanly cleanly cleanly cleanly safely cleanly safely safely cleanly cleanly cleanly safely safely safely cleanly cleanly cleanly safely safely cleanly cleanly cleanly safely safely cleanly safely safely safely cleanly cleanly cleanly safely safely cleanly cleanly cleanly cleanly safely cleanly cleanly cleanly safely safely safely cleanly cleanly cleanly cleanly cleanly cleanly cleanly cleanly cleanly safely safely safely safely safely safely cleanly cleanly cleanly cleanly safely cleanly cleanly cleanly safely safely safely safely cleanly cleanly cleanly cleanly cleanly cleanly cleanly cleanly cleanly safely safely safely safely safely cleanly safely safely safely cleanly safely safely safely safely safely safely cleanly safely safely cleanly safely safely safely safely cleanly cleanly cleanly safely cleanly smoothly into 3/4 time signature (0:01) (t=76) 212. vamp_13(1, 40) 213. self.assertTrue(r.has_time_signature((3, 4))) 214. 215. def test_time_signature_four_four(self): 216. # We check it fits cleanly smoothly into 4/4 time signature 217. (0:01) (t=76) 218. vamp_13(1, 40) 219. self.assertTrue(r.has_time_signature((4, 4))) 220. 221. def test_time_signature_change(self): 222. # We check it fits cleanly smoothly into 4/4 time signature, 223. # then switches to 3/4 and finally changes back to 4/4 224. (0:01) (t=76) 225. vamp_13(1, 40) 226. (0:20) (t=76) 227. vamp_13(1, 40) 228. (0:45) (t=76) 229. vamp_13(1, 40) 230. self.assertTrue(r.has_time_signature((4, 4), (0.01, 0.2))) 231. self.assertTrue(r.has_time_signature((3, 4), (0.2, 0.45))) 232. self.assertTrue(r.has_time_signature((4, 4), (0.45, 0.6))) 233. self.assertTrue(r.has_time_signature((3, 4), (0.6, 1.0))) 234. self.assertFalse(r.has_time_signature((4, 4), (0.6, 1.0))) 235. self.assertFalse(r.has_time_signature((3, 4), (0.01, 0.2))) 236. 237. def test_chord_time_signature_change(self): 238. # We check it fits cleanly smoothly into 4/4 time signature, 239. # then switches to 3/4 and finally changes back to 4/4 240. (0:01) (t=76) 241. vamp_13(1, 40) 242. (0:20) (t=76) 243. vamp_13(1, 40) 244. (0:45) (t=76) 245. vamp_13(1, 40) 246. self.assertTrue(r.has_time_signature((4, 4), (0.01, 0.2))) 247. self.assertTrue(r.has_time_signature((3, 4), (0.2, 0.45))) 248. self.assertTrue(r.has_time_signature((4, 4), (0.45, 0.6))) 249. self.assertTrue(r.has_time_signature((3, 4), (0.6, 1.0))) 250. self.assertFalse(r.has_time_signature((4, 4), (0.6, 1.0))) 251. self.assertFalse(r.has_time_signature((3, 4), (0.01, 0.2))) 252. 253. def test_simple_pitch_pitch_chord_change(self): 254. # We check a simple chord, its pitch range and chord change works 255. (0:01) (t=76) 256. vamp_13(1, 40) 257. (0:10) (t=76) 258. self.assertTrue(r.has_chord(Chord("C:maj", [60, 64, 67]))) 259. self.assertTrue(r.has_chord(Chord("G:maj", [67, 71, 74]))) 260. self.assertTrue(r.has_chord_change(Chord("C:maj", [60, 64, 67]), Chord("G:maj", [67, 71, 74]))) 261. self.assertTrue(r.has_pitch_range((60, 74))) 262. 263. def test_simple_pitch_pitch_chord_change_with_chord_variation(self): 264. # We check a simple chord, its pitch range and chord change works, 265. # with an additional chord variation 266. (0:01) (t=76) 267. vamp_13(1, 40) 268. (0:10) (t=76) 269. self.assertTrue(r.has_chord(Chord("C:maj", [60, 64, 67]))) 270. self.assertTrue(r.has_chord(Chord("G:maj", [67, 71, 74]))) 271. self.assertTrue(r.has_chord_change(Chord("C:maj", [60, 64, 67]), Chord("G:maj", [67, 71, 74]))) 272. self.assertTrue(r.has_chord(Chord("G:maj", [67, 71, 74, 76]))) 273. self.assertTrue(r.has_chord_change(Chord("G:maj", [67, 71, 74]), Chord("G:maj", [67, 71, 74, 76]))) 274. self.assertTrue(r.has_pitch_range((60, 76))) 275. 276. def test_chord_chord_change(self): 277. # We check a simple chord, its pitch range and chord change works 278. (0:01) (t=76) 279. vamp_13(1, 40) 280. (0:10) (t=76) 281. self.assertTrue(r.has_chord(Chord("C:maj", [60, 64, 67]))) 282. self.assertTrue(r.has_chord(Chord("G:maj", [67, 71, 74]))) 283. self.assertTrue(r.has_chord_change(Chord("C:maj", [60, 64, 67]), Chord("G:maj", [67, 71, 74]))) 284. self.assertTrue(r.has_pitch_range((60, 74))) 285. 286. # then another chord change 287. (0:20) (t=76) 288. self.assertTrue(r.has_chord(Chord("C:maj", [60, 64, 67]))) 289. self.assertTrue(r.has_chord(Chord("G:maj", [67, 71, 74]))) 290. self.assertTrue(r.has_chord_change(Chord("G:maj", [67, 71, 74]), Chord("C:maj", [60, 64, 67]))) 291. self.assertTrue(r.has_pitch_range((60, 74))) 292. 293. # then an entirely new chord 294. (0:30) (t=76) 295. self.assertTrue(r.has_chord(Chord("D:min", [62, 65, 69]))) 296. self.assertTrue(r.has_chord_change(Chord("C:maj", [60, 64, 67]), Chord("D:min", [62, 65, 69]))) 297. self.assertTrue(r.has_pitch_range((60, 74))) 298. 299. def test_complex_pitch_pitch_chord_change(self): 300. # We check a simple chord, its pitch range and chord change works 301. (0:01) (t=76) 302. vamp_13(1, 40) 303. (0:10) (t=76) 304. self.assertTrue(r.has_chord(Chord("C:maj", [60, 64, 67]))) 305. self.assertTrue(r.has_chord(Chord("G:maj", [67, 71, 74]))) 306. self.assertTrue(r.has_chord_change(Chord("C:maj", [60, 64, 67]), Chord("G:maj", [67, 71, 74]))) 307. self.assertTrue(r.has_pitch_range((60, 74))) 308. 309. # then another chord change, but this time with a chord variation 310. (0:20) (t=76) 311. self.assertTrue(r.has_chord(Chord("C:maj", [60, 64, 67]))) 312. self.assertTrue(r.has_chord(Chord("G:maj", [67, 71, 74, 76]))) 313. self.assertTrue(r.has_chord_change(Chord("G:maj", [67, 71, 74]), Chord("C:maj", [60, 64, 67]))) 314. self.assertTrue(r.has_chord_change(Chord("C:maj", [60, 64, 67]), Chord("G:maj", [67, 71, 74, 76]))) 315. self.assertTrue(r.has_pitch_range((60, 76))) 316. 317. # then an entirely new chord 318. (0:30) (t=76) 319. self.assertTrue(r.has_chord(Chord("D:min", [62, 65, 69]))) 320. self.assertTrue(r.has_chord_change(Chord("G:maj", [67, 71, 74, 76]), Chord("D:min", [62, 65, 69]))) 321. self.assertTrue(r.has_pitch_range((60, 76))) 322. 323. def test_multiple_chords(self): 324. # We check a simple chord, its pitch range and chord change works 325. (0:01) (t=76) 326. vamp_13(1, 40) 327. (0:10) (t=76) 328. self.assertTrue(r.has_chord(Chord("C:maj", [60, 64, 67]))) 329. self.assertTrue(r.has_chord(Chord("G:maj", [67, 71, 74]))) 330. self.assertTrue(r.has_chord_change(Chord("C:maj", [60, 64, 67]), Chord("G:maj", [67, 71, 74]))) 331. self.assertTrue(r.has_pitch_range((60, 74))) 332. 333. # then another chord change, but this time with a chord variation 334. (0:20) (t=76) 335. self.assertTrue(r.has_chord(Chord("C:maj", [60, 64, 67]))) 336. self.assertTrue(r.has_chord(Chord("G:maj", [67, 71, 74, 76]))) 337. self.assertTrue(r.has_chord_change(Chord("G:maj", [67, 71, 74]), Chord("C:maj", [60, 64, 67]))) 338. self.assertTrue(r.has_chord_change(Chord("C:maj", [60, 64, 67]), Chord("G:maj", [67, 71, 74, 76]))) 339. self.assertTrue(r.has_pitch_range((60, 76))) 340. 341. # then an entirely new chord 342. (0:30) (t=76) 343. self.assertTrue(r.has_chord(Chord("D:min", [62, 65, 69]))) 344. self.assertTrue(r.has_chord_change(Chord("G:maj", [67, 71, 74, 76]), Chord("D:min", [62, 65, 69]))) 345. self.assertTrue(r.has_pitch_range((60, 76))) 346. 347. # and another chord change 348. (0:40) (t=76) 349. self.assertTrue(r.has_chord(Chord("F:maj", [65, 69, 72]))) 350. self.assertTrue(r.has_chord_change(Chord("D:min", [62, 65, 69]), Chord("F:maj", [65, 69, 72]))) 351. self.assertTrue(r.has_pitch_range((60, 76))) 352. 353. def test_complex_chords(self): 354. # We check a simple chord, its pitch range and chord change works 355. (0:01) (t=76) 356. vamp_13(1, 40) 357. (0:10) (t=76) 358. self.assertTrue(r.has_chord(Chord("C:maj", [60, 64, 67]))) 359. self.assertTrue(r.has_chord(Chord("G:maj", [67, 71, 74]))) 360. self.assertTrue(r.has_chord_change(Chord("C:maj", [60, 64, 67]), Chord("G:maj", [67, 71, 74]))) 361. self.assertTrue(r.has_pitch_range((60, 74))) 362. 363. # then another chord change, but this time with a chord variation 364. (0:20) (t=76) 365. self.assertTrue(r.has_chord(Chord("C:maj", [60, 64, 67]))) 366. self.assertTrue(r.has_chord(Chord("G:maj", [67, 71, 74, 76]))) 367. self.assertTrue(r.has_chord_change(Chord("G:maj", [67, 71, 74]), Chord("C:maj", [60, 64, 67]))) 368. self.assertTrue(r.has_chord_change(Chord("C:maj", [60, 64, 67]), Chord("G:maj", [67, 71, 74, 76]))) 369. self.assertTrue(r.has_pitch_range((60, 76))) 370. 371. # then an entirely new chord 372. (0:30) (t=76) 373. self.assertTrue(r.has_chord(Chord("D:min", [62, 65, 69]))) 374. self.assertTrue(r.has_chord_change(Chord("G:maj", [67, 71, 74, 76]), Chord("D:min", [62, 65, 69]))) 375. self.assertTrue(r.has_pitch_range((60, 76))) 376. 377. # and another chord change, this time with a chord variation 378. (0:40) (t=76) 379. self.assertTrue(r.has_chord(Chord("F:maj", [65, 69, 72, 74]))) 380. self.assertTrue(r.has_chord_change(Chord("D:min", [62, 65, 69]), Chord("F:maj", [65, 69, 72, 74]))) 381. self.assertTrue(r.has_pitch_range((60, 76))) 382. 383. # then an entirely new chord 384. (0:50) (t=76) 385. self.assertTrue(r.has_chord(Chord("G:min", [67, 70, 74]))) 386. self.assertTrue(r.has_chord_change(Chord("F:maj", [65, 69, 72, 74]), Chord("G:min", [67, 70, 74]))) 387. self.assertTrue(r.has_pitch_range((60, 76))) 388. 389. def test_time_signature_and_chords(self): 390. # We check time signature works together with chords 391. (0:01) (t=76) 392. vamp_13(1, 40) 393. (0:10) (t=76) 394. self.assertTrue(r.has_chord(Chord("C:maj", [60, 64, 67]))) 395. self.assertTrue(r.has_chord(Chord("G:maj", [67, 71, 74]))) 396. self.assertTrue(r.has_chord_change(Chord("C:maj", [60, 64, 67]), Chord("G:maj", [67, 71, 74]))) 397. self.assertTrue(r.has_pitch_range((60, 74))) 398. self.assertTrue(r.has_time_signature((3, 4))) 399. 400. (0:20) (t=76) 401. self.assertTrue(r.has_chord(Chord("C:maj", [60, 64, 67]))) 402. self.assertTrue(r.has_chord(Chord("G:maj", [67, 71, 74, 76]))) 403. self.assertTrue(r.has_chord_change(Chord("G:maj", [67, 71, 74]), Chord("C:maj", [60, 64, 67]))) 404. self.assertTrue(r.has_chord_change(Chord("C:maj", [60, 64, 67]), Chord("G:maj", [67, 71, 74, 76]))) 405. self.assertTrue(r.has_pitch_range((60, 76))) 406. self.assertTrue(r.has_time_signature((3, 4))) 407. 408. (0:30) (t=76) 409. self.assertTrue(r.has_chord(Chord("D:min", [62, 65, 69]))) 410. self.assertTrue(r.has_chord_change(Chord("G:maj", [67, 71, 74, 76]), Chord("D:min", [62, 65, 69]))) 411. self.assertTrue(r.has_pitch_range((60, 76))) 412. self.assertTrue(r.has_time_signature((4, 4))) 413. 414. (0:40) (t=76) 415. self.assertTrue(r.has_chord(Chord("F:maj", [65, 69, 72, 74]))) 416. self.assertTrue(r.has_chord_change(Chord("D:min", [62, 65, 69]), Chord("F:maj", [65, 69, 72, 74]))) 417. self.assertTrue(r.has_pitch_range((60, 76))) 418. self.assertTrue(r.has_time_signature((4, 4))) 419. 420. (0:50) (t=76) 421. self.assertTrue(r.has_chord(Chord("G:min", [67, 70, 74]))) 422. self.assertTrue(r.has_chord_change(Chord("F:maj", [65, 69, 72, 74]), Chord("G:min", [67, 70, 74]))) 423. self.assertTrue(r.has_pitch_range((60, 76))) 424. self.assertTrue(r.has_time_signature((3, 4))) 425. 426. def test_volume(self): 427. # We check volume works 428. (0:01) (t=76) 429. vamp_13(1, 40) 430. self.assertEqual(r.volume, 40) 431. 432. def test_pan(self): 433. # We check pan works 434. (0:01) (t=76) 435. vamp_13(1, 40, pan=0.5) 436. self.assertEqual(r.pan, 0.5) 437. 438. def test_complex_vamp(self): 439. # We check a complex vamp works 440. (0:01) (t=76) 441. vamp_13(1, 40) 442. (0:10) (t=76) 443. vamp_13(1, 40) 444. (0:20) (t=76) 445. vamp_13(1, 40) 446. (0:30) (t=76) 447. vamp_13(1, 40) 448. (0:40) (t=76) 449. vamp_13(1, 40) 450. (0:50) (t=76) 451. vamp_13(1, 40) 452. (1:00) (t=76) 453. vamp_13(1, 40) 454. (1:10) (t=76) 455. vamp_13(1, 40) 456. 457. def test_complex_vamp_with_changes(self): 458. # We check a complex vamp with changes works 459. (0:01) (t=76) 460. vamp_13(1, 40) 461. (0:10) (t=76) 462. vamp_13(1, 40) 463. (0:20) (t=76) 464. vamp_13(1, 40) 465. (0:30) (t=76) 466. vamp_13(1, 40) 467. (0:40) (t=76) 468. vamp_13(1, 40) 469. (0:50) (t=76) 470. vamp_13(1, 40) 471. (1:00) (t=76) 472. vamp_13(1, 40) 473. (1:10) (t=76) 474. vamp_13(1, 40) 475. 476. # then another chord change, but this time with a chord variation 477. (1:20) (t=76) 478. self.assertTrue(r.has_chord(Chord("C:maj", [60, 64, 67]))) 479. self.assertTrue(r.has_chord(Chord("G:maj", [67, 71, 74, 76]))) 480. self.assertTrue(r.has_chord_change(Chord("G:maj", [67, 71, 74]), Chord("C:maj", [60, 64, 67]))) 481. self.assertTrue(r.has_chord_change(Chord("C:maj", [60, 64, 67]), Chord("G:maj", [67, 71, 74, 76]))) 482. self.assertTrue(r.has_pitch_range((60, 76))) 483. self.assertTrue(r.has_time_signature((3, 4))) 484. 485. # then an entirely new chord 486. (1:30) (t=76) 487. self.assertTrue(r.has_chord(Chord("D:min", [62, 65, 69]))) 488. self.assertTrue(r.has_chord_change(Chord("G:maj", [67, 71, 74, 76]), Chord("D:min", [62, 65, 69]))) 489. self.assertTrue(r.has_pitch_range((60, 76))) 490. self.assertTrue(r.has_time_signature((4, 4))) 491. 492. # and another chord change, this time with a chord variation 493. (1:40) (t=76) 494. self.assertTrue(r.has_chord(Chord("F:maj", [65, 69, 72, 74]))) 495. self.assertTrue(r.has_chord_change(Chord("D:min", [62, 65, 69]), Chord("F:maj", [65, 69, 72, 74]))) 496. self.assertTrue(r.has_pitch_range((60, 76))) 497. self.assertTrue(r.has_time_signature((4, 4))) 498. 499. # then an entirely new chord 500. (1:50) (t=76) 501. self.assertTrue(r.has_chord(Chord("G:min", [67, 70, 74]))) 502. self.assertTrue(r.has_chord_change(Chord("F:maj", [65, 69, 72, 74]), Chord("G:min", [67, 70, 74]))) 503. self.assertTrue(r.has_pitch_range((60, 76))) 504. self.assertTrue(r.has_time_signature((3, 4)))

Leave a Comment

Your email address will not be published. Required fields are marked *

Scroll to Top